Удаление «подвисших» помеченных на удаление товаров. УНФ 3.0

В УНФ часть товаров не удалялась типовой обработкой удаления помеченных, т.к. на них были ссылки из четырех служебных регистров:

Причем если нажать «Выберите действие» и выбрать «Удалить» УНФ выдает ошибку «Нельзя удалить выбранный»:

Но если зайти в саму запись регистра, вручную удалить можно:

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

Также ссылки на номенклатур были в документе установки цен. В УНФ движения не привязаны к регистратору и измерение Номенклатура там ведущее, поэтому удалять строки надо только из документа.

Был написан небольшой скрипт для консоли кода, который прочищал такие записи.

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

//=== ПО НОМЕНКЛАТУРЕ  ===

З = Новый Запрос(
"ВЫБРАТЬ * ИЗ РегистрСведений.ВыгруженныеОстаткиИнтернетМагазина ГДЕ Номенклатура.ПометкаУдаления");
Выборка = З.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
	МЗ = РегистрыСведений.ВыгруженныеОстаткиИнтернетМагазина.СоздатьМенеджерЗаписи();
	ЗаполнитьЗначенияСвойств(МЗ, Выборка);
	Сообщить("Выгруженные остатки интернет-магазина: " + МЗ.Номенклатура);
	МЗ.Удалить();
КонецЦикла;    

З = Новый Запрос(
"ВЫБРАТЬ * ИЗ РегистрСведений.ВыгруженныеЦеныИнтернетМагазина ГДЕ Номенклатура.ПометкаУдаления");
Выборка = З.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
	МЗ = РегистрыСведений.ВыгруженныеЦеныИнтернетМагазина.СоздатьМенеджерЗаписи();
	ЗаполнитьЗначенияСвойств(МЗ, Выборка);
	Сообщить("Выгруженные цены интернет-магазина: " + МЗ.Номенклатура);
	МЗ.Удалить();
КонецЦикла; 

З = Новый Запрос(
"ВЫБРАТЬ * ИЗ РегистрСведений.КодыТоваровSKU ГДЕ Номенклатура.ПометкаУдаления");
Выборка = З.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
	МЗ = РегистрыСведений.КодыТоваровSKU.СоздатьМенеджерЗаписи();
	ЗаполнитьЗначенияСвойств(МЗ, Выборка);
	Сообщить("Коды товаров SKU: " + МЗ.Номенклатура);
	МЗ.Удалить();
КонецЦикла;  

З = Новый Запрос(
"ВЫБРАТЬ * ИЗ РегистрСведений.СтруктураКаталогаИнтернетМагазина ГДЕ Номенклатура.ПометкаУдаления");
Выборка = З.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
	МЗ = РегистрыСведений.СтруктураКаталогаИнтернетМагазина.СоздатьМенеджерЗаписи();
	ЗаполнитьЗначенияСвойств(МЗ, Выборка);
	Сообщить("Структура каталога интернет-магазина: " + МЗ.Номенклатура);
	МЗ.Удалить();
КонецЦикла;


//=== ПО ФАЙЛАМ ===

З = Новый Запрос(
"ВЫБРАТЬ * ИЗ РегистрСведений.СортировкаФайловДляСайта ГДЕ Файл.ПометкаУдаления");
Выборка = З.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
	МЗ = РегистрыСведений.СортировкаФайловДляСайта.СоздатьМенеджерЗаписи();
	ЗаполнитьЗначенияСвойств(МЗ, Выборка);
	Сообщить("Сортировка для файла: " + МЗ.Файл);
	МЗ.Удалить();
КонецЦикла;

//=== ПО УСТАНОВКЕ ЦЕН ===

З = Новый Запрос(
"ВЫБРАТЬ РАЗЛИЧНЫЕ Ссылка ИЗ Документ.УстановкаЦенНоменклатуры.Запасы КАК Т ГДЕ Т.Номенклатура.ПометкаУдаления");
Выборка = З.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
	ДО = Выборка.Ссылка.ПолучитьОбъект();
	Всего = ДО.Запасы.Количество();
	Сообщить("" + ДО);
	Для Инд = 1 По Всего Цикл
		Строка = ДО.Запасы[Всего-Инд];
		Если Строка.Номенклатура.ПометкаУдаления Тогда
			Сообщить("  " + Строка.Номенклатура);
			ДО.Запасы.Удалить(Строка);
		КонецЕсли;
	КонецЦикла;
	ДО.Записать();
КонецЦикла;

//В УНФ цены не подчинены регистратору, поэтому можно так
З = Новый Запрос(
"ВЫБРАТЬ * ИЗ РегистрСведений.ЦеныНоменклатуры ГДЕ Номенклатура.ПометкаУдаления");
Выборка = З.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
	НЗ = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
	НЗ.ДополнительныеСвойства.Вставить("ОтменаПроведения", истина); //Чтобы разрешало удалить
	Для Каждого МДИзмерение ИЗ Метаданные.РегистрыСведений.ЦеныНоменклатуры.Измерения Цикл
		НЗ.Отбор[МДИзмерение.Имя].Значение = Выборка[МДИзмерение.Имя];
		НЗ.Отбор[МДИзмерение.Имя].Использование = истина;
		//Сообщить(" " + МДИзмерение.Имя);
	КонецЦикла;
	НЗ.Прочитать(); 
	Сообщить("Цены номенклатуры: " + Выборка.Номенклатура + " Записей: " + НЗ.Количество());
	НЗ.Очистить();
	НЗ.Записать();
КонецЦикла; 


Среда: 3.0.8.91 Объем: 0.5 час

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

комментария 4

  1. rzd:

    Это же точно код для синьоров? Ну или хотя бы для мидлов?

    • не оценивал его с этой точки зрения, но точно не для ждунов.

      • rzd:

        А позиционируешь блог для мидлов и синьоров. Но код уровня джуна

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *