Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
21 ноя 2024, 16:37

программно удалить помеченные на удаление товар

Автор sali, 22 сен 2024, 14:47

0 Пользователей и 1 гость просматривают эту тему.

Максим75

sali, не так.

УдаляемыеОбъекты - что такое? Массив?
так и создавайте массив и заполняйте его.

УдаляемыеОбъекты = Новый Массив;

Для каждого СтрДанных из ТаблицаДанных цикл

УдаляемыеОбъекты.Добавить(СтрДанных.Номенклатура.ПолучитьОбъект());

КонецЦикла;

как то так. могут быть синтаксические ошибки, не проверял.
Но это только по номенклатуре.
где штрих код хранится? если в регистре сведений, то из регистра сведений можно удалить напрямую, без этой обработки. Находите запись в регистре сведений по нужной номенклатуре и удаляете.
с характеристикой такой же вопрос. где хранится? в подчиненном справочнике или где?

sali

Максим75,для штрихкодов есть РС для них ШтрихкодыНоменклатуры, Характеристика это справочник который в РС ШтрихкодыНоменклатуры есть и ссылается на справочник. но дело в том что, когда удаляешь номенклатуру, должны удалиться и РС (связи)

Максим75

sali, вначале связи удаляются, а уже потом сама номенклатура.
иначе будет в этих связях ссылка на несуществующий объект.
с регистром сведений можно вначале затереть ссылку на номенклатуру (программно естественно), а уже потом выбрать запросом из регистра сведений записи с пустой номенклатурой и удалить из регистра сведений.
характеристика скорее всего хранится в отдельном справочнике и подчинена самой номенклатуре, в регистре сведение со штрихкодами просто связь (номенклатура, характеристика, штрихкод). поэтому вначале удаляется характеристика.
вариантов как поступить много.
главное, чтобы не оставить в базе ссылки на несуществующий объект.

sali

Максим75, значит в процедуре "удалить" нужно в начале прописать удаление характеристики, штрихкода в РС; следующей строчкой удаление номенклатуры. будет эффективным сделать условие , сперва сообщение выводиться что связи удалены или нет , а потом уже удаляется номенклатура по истине?

Максим75

sali, да. можно и без условия. главное последовательность действий.
да Вы вообще можете не пользоваться обработкой удаления, посмотрите в синтаксис помощнике Удалить у СправочникОбъект.
вот прямо в лоб находите объект в цикле (когда обходите ТаблицуДанных) и удаляете его.

просто я так понимаю, что Вы взяли обработку УдалениеПомеченныхОбъектов и хотите ее удалить. но она немного не так работает, там внаачле при открытии заполняется список объектов для удаления, потом штатным механизмом платформы проверяется можно или нельзя удалить объект и уже потом физически удаляется. Вы можете и ею воспользоваться, только вначале изменить запрос, который формирует коллекцию объектов для удаления.

Optiman

Вчера был занят, не мог отвечать. Сейчас пробежался по всем постам. Сделаю свои замечания:
1) Пока Выборка.Следующий() Цикл
        Список = Новый СписокЗначений;
За такое издевательство над 1С я бы на кол посадил. В цикле каждый раз создавать новый список значений...

2) ТаблицаДанных = Новый ТаблицаЗначений;
Не понятно для чего это. У вас же есть Объект.Товары которую заполняете. Вот и работайте дальше либо с этой таблицей либо с программно созданной таблицей значений. Одно могу сказать:
- в Объект.Товары у вас скорее всего Номенклатура - это справочник "Номенклатура", значит будут храниться ссылки на элементы справочника.
- в ТаблицаДанных просто колонка "Номенклатура". Там нет жесткой привязки к справочнику, поэтому можно заполнять элементами НоменклатраСсылка или НоменклатураОбъект в зависимости от того, что понадобится дальше для удаления этих элементов.

А вообще удалять программно - это надо быть очень осторожным и предусмотреть все ресурсы 1С, где ссылки эти элементы могут встретиться (документы, регистры сведений, справочник единиц измерения и т.д.). Иначе в будущем можете увидеть строчки где будет светиться "<Объект не найден>" или вообще порушить систему и получить ошибки при загрузке самой системы или какого-нибудь справочника или документа.

sali


sali

Optiman, &НаКлиенте
Процедура УдалитьНоменклатуру(Команда) 
УдалитьНоменклатуруНаСервере();
КонецПроцедуры

&НаСервере
процедура УдалитьНоменклатуруНаСервере()
Объект.Товары.Очистить();
    Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СправочникНоменклатура.Ссылка КАК Номенклатура,
| СправочникНоменклатура.Наименование КАК Наименование,
| ШтрихкодыНоменклатуры.Штрихкод КАК Штрихкод,
| ШтрихкодыНоменклатуры.Характеристика КАК Характеристика,
| ШтрихкодыНоменклатуры.Характеристика.Наименование КАК ХарактеристикаНаименование,
| СправочникНоменклатура.Весовой КАК Весовой,
| ШтрихкодыНоменклатуры.Партия КАК Партия,
| ШтрихкодыНоменклатуры.ЕдиницаИзмерения КАК ЕдиницаИзмерения
|ИЗ
| Справочник.Номенклатура КАК СправочникНоменклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
| ПО СправочникНоменклатура.Ссылка = ШтрихкодыНоменклатуры.Номенклатура
|ГДЕ
| СправочникНоменклатура.ПометкаУдаления = ИСТИНА";
РезультатЗапроса = Запрос.Выполнить();

Выборка = РезультатЗапроса.Выбрать();   

Пока Выборка.Следующий() Цикл   
Строка = Объект.Товары.Добавить(); 
Строка.Номенклатура = Выборка.Наименование;
    Строка.Штрихкод = Выборка.Штрихкод;
    Строка.Характеристика = Выборка.ХарактеристикаНаименование;
Строка.Весовой = Выборка.Весовой;
Строка.Партия = Выборка.Партия;
Строка.ЕдиницаИзмерения = Выборка.ЕдиницаИзмерения;
КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура Удалить(Команда)
УдалитьНаСервере();
//для каждого строка из объект.товары цикл
// УдалитьНаСервере(); 
// отбор = новый структура;
// отбор.Вставить("Номенклатура", истина);
// отбор.Вставить("Характеристика", истина);
// отбор.Вставить("Штрихкод", истина);
// отбор.Вставить("Партия", истина);
// отбор.Вставить("ЕдиницаИзмерения", истина);
// СтрокиУдалить = Объект.Товары.НайтиСтроки(Отбор);
// Пока СтрокиУдалить.Количество() > 0 цикл
// объект.товары.Удалить(СтрокиУдалить[0]);
//        СтрокиУдалить = объект.товары.НайтиСтроки(Отбор);
//    КонецЦикла;
//конеццикла;
КонецПроцедуры

&НаСервере
Процедура УдалитьНаСервере() 
//Товар = Объект.Товары;
//выборка = справочники.НоменклатураПрисоединенныеФайлы.выбрать();
//пока выборка.Следующий() цикл
// выборка.ПолучитьОбъект().УстановитьПометкуУдаления(Истина);
//конеццикла;
для каждого строка из Объект.Товары цикл   
ЗаписьРС = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьМенеджерЗаписи();   

ЗаписьРС.Номенклатура = Строка.Номенклатура;
ЗаписьРС.Штрихкод = Строка.Штрихкод;
ЗаписьРС.Характеристика = Строка.Характеристика;
ЗаписьРС.Партия =  Строка.Партия;
ЗаписьРС.ЕдиницаИзмерения = Строка.ЕдиницаИзмерения;
ЗаписьРС.Прочитать();   
ЗаписьРС.Удалить();
конеццикла;   
Номенклатура = Справочники.Номенклатура.Выбрать();
Если Номенклатура.ПометкаУдаления = Истина Тогда
НоменклатураОбъект = Номенклатура.ПолучитьОбъект();
НоменклатураОбъект.Удалить();
КонецЕсли;
КонецПроцедуры


что здесь не так делаю, нажимаю на кнопку "Удалить" никаких действий?

Максим75

sali, Номенклатура = Справочники.Номенклатура.Выбрать();
    Если Номенклатура.ПометкаУдаления = Истина Тогда
        НоменклатураОбъект = Номенклатура.ПолучитьОбъект();
        НоменклатураОбъект.Удалить();
    КонецЕсли;

а саму номенклатуру обходить кто будет?
ну Вы только выборку сделали, а дальше...
надо же потом
Пока Номенклатура.Следующий() цикл

и в цикле находить и удалять.

Вы перед тем как удалять номенклатуру, просто через сообщить выведите и посмотрите, что за номенклатуру находит. а уже потом удалять.

с регистром сведений:
Вы должны получить отбор по нужному штрихкоду
ЗаписьРС .Отбор.Штрихкод.Установить(Строка.Штрихкод);
ЗаписьРС .Прочитать();
ЗаписьРС.Удалить();

а то Вы создаете новый набор записей и удаляете его же, а Вам надо старый набор удалить.

sali

Максим75, ммм изменения
&НаСервере
Процедура УдалитьНаСервере() 
    для каждого строка из Объект.Товары цикл   
        ЗаписьРС = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьМенеджерЗаписи();           
        ЗаписьРС.Номенклатура = Строка.Номенклатура;
        ЗаписьРС.Штрихкод = Строка.Штрихкод;
        ЗаписьРС.Характеристика = Строка.Характеристика;
        ЗаписьРС.Партия =  Строка.Партия;
        ЗаписьРС.ЕдиницаИзмерения = Строка.ЕдиницаИзмерения;
        ЗаписьРС .Отбор.Штрихкод.Установить(Строка.Штрихкод);
        ЗаписьРС.Прочитать();   
        ЗаписьРС.Удалить();
    конеццикла;   
    Номенклатура = Справочники.Номенклатура.Выбрать();
    пОКА нОМЕНКЛАТУРА.сЛЕДУЮЩИЙ() Цикл
    Если Номенклатура.ПометкаУдаления = Истина Тогда
        НоменклатураОбъект = Номенклатура.ПолучитьОбъект();
        НоменклатураОбъект.Удалить();
    КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск