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