Как изменить движения регистра бухгалтерии по документу после загрузки в Конвертации данных

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При переносе данных с помощью конфигурации «Конвертация данных» (КД 2) нередко возникает необходимость скорректировать проводки регистра бухгалтерии по загруженному документу (например, документу ОперацияБух). Типичная задача — программно очистить или подменить определенные виды субконто для конкретных счетов учета.

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

Почему изменения через независимый набор записей затираются

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


НаборЗаписейРегистра = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей(); 
НаборЗаписейРегистра.Отбор.Регистратор.Установить(Ссылка); 
НаборЗаписейРегистра.Прочитать(); 
Для Каждого Стр Из НаборЗаписейРегистра Цикл 
    Если Стр.СчетДт = ПланыСчетов.Хозрасчетный.РасчетыСПерсоналомПоОплатеТруда Тогда
        Стр.СубконтоДт.РаботникиОрганизации = Справочники.ФизическиеЛица.ПустаяСсылка();
    ИначеЕсли Стр.СчетКт = ПланыСчетов.Хозрасчетный.РасчетыСПерсоналомПоОплатеТруда Тогда
        Стр.СубконтоКт.РаботникиОрганизации = Справочники.ФизическиеЛица.ПустаяСсылка();
    КонецЕсли;
КонецЦикла; 
НаборЗаписейРегистра.Записать();

Выясним причину, по которой этот код не дает результата при загрузке через универсальную обработку обмена:

  1. Обработчик «После загрузки» или «Перед записью объекта» в правиле конвертации объектов (ПКО) выполняется в контексте объекта Объект, загруженного в оперативную память.
  2. У объекта уже сформирована коллекция Объект.Движения (в частности, Объект.Движения.Хозрасчетный).
  3. Когда мы создаем и записываем независимый НаборЗаписейРегистра, он действительно сохраняется в базу данных. Однако сразу после выполнения пользовательского кода универсальная обработка вызывает метод Объект.Записать().
  4. При вызове Объект.Записать() платформа автоматически записывает все наборы из коллекции Объект.Движения, у которых выставлено свойство Записывать = Истина. В результате данные в информационной базе перезаписываются тем содержимым, которое хранилось в памяти объекта, и все наши ручные правки стираются.

Правильный способ: модификация движений самого объекта

Чтобы избежать перезаписи, необходимо напрямую модифицировать строки регистра, находящиеся в коллекции Объект.Движения документа. Рассмотрим пошаговый алгоритм решения задачи.

В обработчике ПКО «После загрузки» (или «Перед записью объекта») выполним обход движений объекта:


Для Каждого Стр Из Объект.Движения.Хозрасчетный Цикл
    Если Стр.СчетДт = ПланыСчетов.Хозрасчетный.РасчетыСПерсоналомПоОплатеТруда Тогда
        Стр.СубконтоДт.РаботникиОрганизации = Справочники.ФизическиеЛица.ПустаяСсылка();
    КонецЕсли;    
    Если Стр.СчетКт = ПланыСчетов.Хозрасчетный.РасчетыСПерсоналомПоОплатеТруда Тогда
        Стр.СубконтоКт.РаботникиОрганизации = Справочники.ФизическиеЛица.ПустаяСсылка();
    КонецЕсли;
КонецЦикла;

// Обязательно убедимся, что взведен флаг записи набора движений
Объект.Движения.Хозрасчетный.Записывать = Истина;

Особенности безопасного заполнения и очистки субконто

Разберем важные нюансы работы со свойствами субконто в проводках:

  1. Обращение через точку: Конструкция вида Стр.СубконтоДт.РаботникиОрганизации работает только тогда, когда имя предопределенного вида субконто строго совпадает с идентификатором и этот вид субконто привязан к плану счетов.
  2. Безопасная адресация: Чтобы избежать ошибок в случае изменения настроек плана счетов, надежнее обращаться к субконто по ссылке из плана видов характеристик:
    
    ВидСубконтоФизЛица = ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.РаботникиОрганизации;
    Стр.СубконтоДт[ВидСубконтоФизЛица] = Справочники.ФизическиеЛица.ПустаяСсылка();
    
  3. Удаление аналитики: Присвоение ПустаяСсылка() оставляет значение субконто пустым, но сама строка аналитики в проводке остается. Если требуется полностью удалить вид субконто из проводки, используем метод:
    
    Стр.СубконтоДт.Удалить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.РаботникиОрганизации);
    

Альтернативные варианты решения в КД

Рассмотрим другие подходы, которые можно применить в зависимости от архитектуры правил обмена:

  1. Правило конвертации для регистра: Если перенос движений настроен не через табличные части документа, а отдельным правилом для набора записей регистра бухгалтерии, логику подмены субконто удобнее вынести в ПКС (Правило конвертации свойств) для конкретного субконто, переопределяя параметр Значение в обработчике «Перед выгрузкой».
  2. Отключение автозаписи движений объектом: Если по какой-то причине требуется выполнять запись движений строго через собственный СоздатьНаборЗаписей(), необходимо принудительно отключить сохранение движений объектом, установив перед выходом из обработчика: Объект.Движения.Хозрасчетный.Записывать = Ложь; Однако такой способ является избыточным и не рекомендуется к использованию при наличии прямого доступа к Объект.Движения.
← На главную