Перенос бухгалтерских проводок в 1С:Конвертация данных 2.0 (КД 2.0) — это задача, которая часто вызывает затруднения у разработчиков, особенно когда речь идет о переносе данных между разнородными конфигурациями или в системы с жесткой логикой проведения (например, ERP 2 или КА 2.4). В этой статье мы подробно разберем, как организовать процесс передачи движений, какие существуют методики формирования проводок и как избежать их досадного «исчезновения» после загрузки.
Самый простой и «штатный» способ передачи проводок заключается в использовании встроенного механизма выгрузки движений документа. Рассмотрим этот процесс по шагам.
Во время выгрузки структуры метаданных из информационной базы источника (с помощью обработки MD83Exp.epf), нам необходимо установить флаг «Выгружать движения». Проанализируем, что это дает: после того как мы загрузим полученную структуру в базу Конвертации данных, у объектов типа ДокументСсылка в дереве метаданных появятся подчиненные объекты — регистры, по которым этот документ делает движения. Они будут выглядеть как дополнительные табличные части.
При настройке правил обмена (ПКО) для документа мы увидим новую вкладку в табличной части — «Движения». Создав ПКС для нужного регистра (например, Хозрасчетный), мы фактически говорим системе: «При выгрузке документа возьми его записи в этом регистре и передай их вместе с ним». Это наиболее надежный способ для идентичных конфигураций.
Часто возникают ситуации, когда в источнике проводок нет (например, это управленческая база) или их структура в приемнике кардинально отличается. В таких случаях мы будем формировать движения программно в обработчике ПКО ПослеЗагрузки. Выясним, как это сделать правильно, используя объектную модель 1С.
Рассмотрим пример кода, который создает проводку для документа ОперацияБух. Обратите внимание, что мы работаем напрямую с коллекцией Движения загружаемого объекта. Это позволяет системе записать проводки в одной транзакции с самим документом.
// Обработчик ПКО "После загрузки"
// Объект - это загруженный документ
// Укажем, что движения по регистру Хозрасчетный нужно записывать
Объект.Движения.Хозрасчетный.Записывать = Истина;
// Очистим старые записи, если они есть (при повторной загрузке)
Объект.Движения.Хозрасчетный.Очистить();
// Добавим новую проводку
НоваяЗапись = Объект.Движения.Хозрасчетный.Добавить();
НоваяЗапись.Регистратор = Объект.Ссылка;
НоваяЗапись.Период = Объект.Дата;
НоваяЗапись.Организация = Объект.Организация;
НоваяЗапись.Активность = Истина;
// Установка счетов (счета должны быть предварительно найдены или сопоставлены)
НоваяЗапись.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("20.01");
НоваяЗапись.СчетКт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("70");
// Установка субконто через типовую процедуру БП
БухгалтерскийУчет.УстановитьСубконто(НоваяЗапись.СчетДт, НоваяЗапись.СубконтоДт, "Подразделения", Объект.ПодразделениеЗатрат);
БухгалтерскийУчет.УстановитьСубконто(НоваяЗапись.СчетДт, НоваяЗапись.СубконтоДт, "НоменклатурныеГруппы", Объект.НоменклатурнаяГруппа);
НоваяЗапись.Сумма = Объект.СуммаДокумента;
Важный момент: использование Объект.Движения предпочтительнее, чем создание отдельного НаборЗаписей, так как это гарантирует целостность данных в рамках обмена КД 2.0.
Проанализируем ситуацию, описанную в сообщениях форума: разработчик создает проводки, они появляются в журнале регистрации, но затем исчезают. Это происходит из-за механизмов отложенного проведения и автоматического пересчета движений в современных конфигурациях на базе БСП.
Когда мы загружаем документ, система часто пытается его «допровести» или проверить актуальность движений. Если документ не помечен как имеющий ручные правки, типовой код конфигурации-приемника (например, процедура ПодготовитьНаборыЗаписейКРегистрацииДвижений) просто очистит ваши загруженные данные и сформирует их заново по своим алгоритмам. Чтобы обойти это, используем следующие приемы:
РучнаяКорректировка. Если установить его в Истина, типовые механизмы перестанут перезаписывать проводки.
Объект.ДополнительныеСвойства.Вставить("ПересчитатьДвижения", Ложь);
// Также полезно использовать стандартный механизм обмена
Объект.ОбменДанными.Загрузка = Истина;
Если нам нужно передать данные для проводок, которых нет в реквизитах документа-приемника (например, специфические субконто из источника), мы можем использовать ПараметрыОбъекта. Разберем этот алгоритм:
1. В источнике в обработчике ПВД или ПКО ПередВыгрузкой формируем таблицу значений с данными проводок и помещаем ее в ВходящиеДанные или передаем через Параметры.
2. В приемнике в обработчике ПослеЗагрузки извлекаем эти данные. Посмотрим на пример реализации:
// В приемнике, обработчик ПослеЗагрузки
Если ПараметрыОбъекта <> Неопределено Тогда
ТаблицаПроводок = ПараметрыОбъекта["ТаблицаДвижений"];
Если ТаблицаПроводок <> Неопределено Тогда
Для Каждого СтрокаТЗ Из ТаблицаПроводок Цикл
// Логика заполнения набора записей регистра
РегЗапись = Объект.Движения.Хозрасчетный.Добавить();
// ... заполнение реквизитов из СтрокаТЗ ...
КонецЦикла;
КонецЕсли;
КонецЕсли;
При программной установке счетов крайне не рекомендуется использовать НайтиПоКоду напрямую, так как коды в разных базах могут отличаться. Правильнее настроить отдельное ПКО для плана счетов и использовать его для сопоставления. Если же вы все-таки пишете код вручную, обязательно проверяйте результат поиска на ПустаяСсылка(), чтобы избежать ошибок при записи набора записей.
Также не забывайте про реквизит Активность. Если вы забудете установить НоваяЗапись.Активность = Истина, ваши проводки будут физически существовать в базе и даже отображаться в форме документа, но они не будут учитываться в итогах — сальдо и обороты по счетам не изменятся. Это одна из самых частых ошибок начинающих специалистов по конвертации.
Подводя итог, можно сказать, что для простых случаев (обмен между одинаковыми БП) лучше использовать флаг «Выгружать движения» в метаданных. Для сложных случаев и кастомных переносов — программное формирование в ПослеЗагрузки с обязательной установкой флага РучнаяКорректировка, чтобы защитить свои данные от алгоритмов автоматического проведения конфигурации-приемника.