Рассмотрим ситуацию, с которой сталкиваются многие специалисты при изменении структуры аналитики (субконто) счета в процессе работы базы. При добавлении нового субконто в пользовательском режиме существующие проводки прошлых периодов не обновляются автоматически, что приводит к появлению значений NULL в поле субконто. Это делает невозможным корректное закрытие счета, так как стандартные механизмы отчетов и проведения не могут корректно сопоставить старые записи с новой структурой метаданных.
Когда мы добавляем субконто в план счетов, платформа не выполняет пересчет всех записей в РегистрБухгалтерии. Те проводки, которые были созданы до изменений, фактически содержат «дыру» там, где должна быть ссылка на новый объект (например, на справочник Склады). В результате при формировании оборотно-сальдовой ведомости система видит записи, которые не могут быть свернуты, что приводит к отображению «призрачных» остатков, часто датируемых началом времен (01.01.0001).
Этот способ оптимален, если количество «битых» проводок невелико и вы знаете, к каким документам они относятся. Суть метода заключается в принудительном перевыборе субконто внутри движений документа.
Склад равно NULL.Преимущество этого метода: он не требует перепроведения всего документа и не сбивает последовательность партионного учета, так как изменения вносятся точечно в таблицу движений.
Если записей много, целесообразно использовать обработку для автоматизированного исправления. Рассмотрим подход, который позволяет «заполнить» NULL значением пустой ссылки.
Разберем основной алгоритм действий при разработке такой обработки:
// Пример логики чтения и перезаписи движений
НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ВыбранныйДокумент);
НаборЗаписей.Прочитать();
Для Каждого Запись Из НаборЗаписей Цикл
Если Запись.Счет = ПланыСчетов.Хозрасчетный.НайтиПоКоду("003.01") Тогда
Если Запись.Субконто[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады] = NULL Тогда
Запись.Субконто[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады] = Справочники.Склады.ПустаяСсылка();
КонецЕсли;
КонецЕсли;
КонецЦикла;
НаборЗаписей.ОбменДанными.Загрузка = Истина;
НаборЗаписей.Записать();
Важные замечания при использовании программной корректировки:
ОбменДанными.Загрузка = Истина необходимо, чтобы обойти проверки платформы, которые требуют обязательного заполнения субконто при записи.Чтобы не нарушить учет прошлых лет, не следует менять сами первичные документы. Если бухгалтерия категорически против изменения проводок прошлых периодов, рассмотрите создание корректировочной Операции (бухгалтерский и налоговый учет) датой начала текущего отчетного периода. В этой операции «схлопните» проблемные остатки, списав их с аналитики NULL на корректную аналитику. Таким образом, вы очистите остатки без вмешательства в историю прошлых лет.
Помните, что проблема с NULL — это в первую очередь проблема несоответствия структуры базы данных текущим метаданным. После приведения всех записей к корректному состоянию (пустая ссылка вместо NULL) отчеты начнут правильно группировать данные, и остатки придут в норму.