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