Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
15 окт 2026, 01:42

удаление номенклатуры

Автор sali, 13 окт 2026, 08:28

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

sali

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

antoneus

Верим) Используй НайтиПоСсылкам, Люк!

sali

antoneus, со справочника удалить объект, не с документов/регистров, я там наоборот заменяю. правда криво выходит...

sali

сам удаляю так
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.ПометкаУдаления КАК ПометкаУдаления
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Ссылка = &Ссылка";

Запрос.УстановитьПараметр("Ссылка", ЗаменяемаяНоменклатура.Номенклатура);

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

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

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
НомОбъект = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
НомОбъект.ПометкаУдаления = Истина; 
НомОбъект.Записать();
КонецЦикла;             
НомОбъект.Удалить();

но выходит битая ссылка

antoneus


sali

antoneus, в документах остается битая ссылка , хотя заменяю ее
Для каждого ЗаменяемаяНоменклатура Из ВыборкаЗапроса Цикл //  МассивЗаменяемая Цикл 

ИзмененнаяНоменклатура = НоменклатураНаЗамену.Номенклатура.ПолучитьОбъект();
ПозицияНачала = СтрНайти(ИзмененнаяНоменклатура.Наименование, " /"); 
Если ПозицияНачала > 0 Тогда
ПозицияКонца = СтрНайти(ИзмененнаяНоменклатура.Наименование, " |", НаправлениеПоиска.СНачала, ПозицияНачала);
Если ПозицияКонца > 0 Тогда
ИзмененнаяНоменклатура.Наименование = Лев(ИзмененнаяНоменклатура.Наименование, ПозицияНачала - 1) + Сред(ИзмененнаяНоменклатура.Наименование, ПозицияКонца);
ИзмененнаяНоменклатура.НаименованиеПолное = ИзмененнаяНоменклатура.Наименование;
ИзмененнаяНоменклатура.Записать();
КонецЕсли;
КонецЕсли;

Для Каждого ОбъектМетаданных Из МестаИспользованияЗаменяемой Цикл   
Если Не лев(ОбъектМетаданных.Данные,15) = "РегистрСведений" Тогда
_ОбъектМетаданных = ОбъектМетаданных.Данные.ПолучитьОбъект();

Если СтрНайти(Метаданные.НайтиПоТипу(ТипЗнч(объектметаданных.данные)).ПолноеИмя(), "Документ") > 0 Тогда   
ИмяМетаданных = Метаданные.НайтиПоТипу(ТипЗнч(объектметаданных.данные)).Имя;
ТабличныеЧастиМетаданных = Метаданные.Документы[ИмяМетаданных].ТабличныеЧасти;

попытка
Для Каждого РеквизитМет Из ТабличныеЧастиМетаданных Цикл
// проходим каждую таб часть
Если РеквизитМет.Реквизиты.Найти(ИскомыйТип) <> Неопределено Тогда   
ТабличнаяЧасть = РеквизитМет.Имя;   
ОбъектИсправления = _ОбъектМетаданных[ТабличнаяЧасть].НайтиСтроки(Новый Структура("Номенклатура", ЗаменяемаяНоменклатура.Номенклатура));
//Если ОбъектИсправления.Количество() > 0 Тогда   
// перевыбираем номенклатуру на оригинал   
УстановитьПривилегированныйРежим(Истина);

Номенклатуры = Новый Массив;
Номенклатуры.Добавить(НоменклатураНаЗамену);
Номенклатуры.Добавить(ИзмененнаяНоменклатура);
Номенклатуры.Добавить(ЗаменяемаяНоменклатура);

ЗапросПоТоварамДокумента = Новый Запрос;
ЗапросПоТоварамДокумента.Текст =
"ВЫБРАТЬ
| ТоварыДокумента.Номенклатура КАК Номенклатура
|ПОМЕСТИТЬ ВТ_Табилца
|ИЗ
| &ТоварыДокумента КАК ТоварыДокумента
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_Табилца.Номенклатура КАК Номенклатура
|ИЗ
| ВТ_Табилца КАК ВТ_Табилца
|ГДЕ
| ВТ_Табилца.Номенклатура В (&Номенклатуры)";

ЗапросПоТоварамДокумента.УстановитьПараметр("Номенклатуры", Номенклатуры);     
ЗапросПоТоварамДокумента.УстановитьПараметр("ТоварыДокумента", _ОбъектМетаданных[ТабличнаяЧасть]);     
РезультатЗапросаПоДокументам = ЗапросПоТоварамДокумента.Выбрать().Выгрузить();
Если РезультатЗапросаПоДокументам.Количество() > 0 Тогда   

КонецЕсли;

//КонецЕсли;
КонецЕсли;
КонецЦикла;
_ОбъектМетаданных.Записать(РежимЗаписиДокумента.Проведение); 
ПараметрыСеанса.ПропуститьПроверкуЗапретаИзменения = Ложь;
Исключение
//СообщениеПол = Новый СообщениеПользователю();
//СообщениеПол.Текст = ИнформацияОбОшибке().Описание;
КонецПопытки;

//ИначеЕсли СтрНайти(Метаданные.НайтиПоТипу(ТипЗнч(объектметаданных.данные)).ПолноеИмя(), "Справочник") > 0 Тогда
// КонецЕсли; 
КонецЕсли;
КонецЕсли;

КонецЦикла;

//удаление номенклатуры
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.ПометкаУдаления КАК ПометкаУдаления
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Ссылка = &Ссылка";

Запрос.УстановитьПараметр("Ссылка", ЗаменяемаяНоменклатура.Номенклатура);

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

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

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
НомОбъект = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
КонецЦикла;         
попытка
если НомОбъект <> Неопределено тогда
НомОбъект.Удалить();   
КонецЕсли;
исключение         
текстсообщ = "Не удален объект :"+ВыборкаДетальныеЗаписи.ссылка;
НеУдалено = НеУдалено+1;
         
КонецПопытки;

sali

есть ли универсальный метод перерасчета табличной части?
допустим в документе ГТД по импорту если я не нужную ном. удаляю, а ее количество прибавляю к нужной то по сумме должен быть пересчет , но цены в нем нет. в документе перемещения, например тоже только количество

Теги:

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

Рейтинг@Mail.ru

Поиск