January 5, 2022

Удаление ошибочных записей регистров накопления 1С

В современных тяжелых конфигурациях 1С, особенно в линейке ЕРП - КА - УТ, возникают ошибки в регистрах накопления, а именно записи по непроведенному документу, либо совсем без регистратора. Тестирование и исправление при этом не помогает. Кроме того, эти ошибочные записи часто датируются уже закрытым периодом. Предлагаю простую обработку, которая находит все такие записи, выводит их в таблицу и удаляет выбранные (или все) записи, в том числе в закрытом периоде...

Почему я публикую такое простое и очевидное решение? Потому что этот вопрос мне задала на собеседовании финансовый директор компании и после моих объяснений заявила, что я не прав, что нужно использовать тестирование и исправление. Удивительно, но встречаются горе-внедренцы, которые так консультируют своих заказчиков. После того, как я все-таки пошел работать в эту компанию, обнаружил описываемую проблему нерешенной. То есть внедренцы так и не нашли (или вообще не пытались искать) правильный способ. Значит, эта публикация возможно кому-нибудь поможет...

Основной код обработки:

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

&НаКлиенте
Процедура НайтиОшибки(Команда)
	НайтиОшибкиНаСервере();
КонецПроцедуры

&НаСервере
Процедура УдалитьЗаписиНаСервере()
	Для Каждого СтрокаТЧ из ТаблицаПоиска Цикл
		Если СтрокаТЧ.Выбор Тогда
			НаборЗаписей = РегистрыНакопления[СтрокаТЧ.Регистр].СоздатьНаборЗаписей();
		    НаборЗаписей.Отбор.Регистратор.Установить(СтрокаТЧ.Документ);
			НаборЗаписей.ОбменДанными.Загрузка = Истина;
			НаборЗаписей.Записать();
		КонецЕсли;
	КонецЦикла;
	НайтиОшибкиНаСервере();	
КонецПроцедуры

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

Скачать обработку

←1 | заметка 2 | 3→