Как создать несколько документов ОперацияБух в приемнике на основе строк табличной части документа источника при обмене через КД 2.0?

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

При настройке правил обмена между конфигурациями, например, из УПП 1.2 в БП 3.0, часто возникает задача сложной трансформации данных. Ситуация, когда один документ-источник должен порождать несколько документов ОперацияБух в базе-приемнике, требует отступления от стандартного механизма ПКО (Правил Конвертации Объектов).

Анализ проблемы и выбор стратегии

Стандартный подход КД 2.0 предполагает сопоставление «один объект источника — один объект приемника». Если мы пытаемся просто выгрузить документ, мы ограничены его структурой. Поскольку строки табличной части источника требуют фильтрации по специфическим реквизитам, которых нет в приемнике, а сами данные нужно разбить на несколько независимых операций, мы используем механизм формирования движений напрямую.

Рассмотрим основной принцип: мы не привязываемся к жесткой структуре документа-регистратора, а выгружаем данные как Набор записей регистра бухгалтерии. Это позволяет гибко управлять тем, какие именно проводки и в какие документы попадут в итоге.

Решение через выгрузку наборов записей

Поскольку РегистрБухгалтерииЗапись.Хозрасчетный по своей структуре фактически является аналогом табличной части, мы можем настроить правила так, чтобы данные из нашей выборки превращались в записи регистра.

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

Реализация программного формирования проводок

Давайте разберем по шагам, как это реализовать на практике. Мы можем использовать обработчик После загрузки в правиле для документа ОперацияБух или напрямую работать с набором записей.

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


// В обработчике ПередВыгрузкой ПВД или ПКО
// Формируем таблицу данных, которую передадим в приемник
ТаблицаДанных = Новый ТаблицаЗначений;
ТаблицаДанных.Колонки.Добавить("СчетДт");
ТаблицаДанных.Колонки.Добавить("СчетКт");
ТаблицаДанных.Колонки.Добавить("Сумма");
// ... заполняем таблицу на основе строк ТЧ "Товары" ...

// Передаем таблицу в параметры или исходящие данные
ИсходящиеДанные = Новый Структура;
ИсходящиеДанные.Вставить("ДанныеПроводок", ТаблицаДанных);

Далее, в приемнике мы используем эти данные для заполнения набора записей. Суть метода заключается в том, что Набор записей регистра бухгалтерии в КД 2.0 воспринимается системой как полноценный выгружаемый объект. При его загрузке мы программно обращаемся к свойствам регистратора.

Почему этот метод эффективен?

Рассмотрим подробнее преимущества такого подхода:

Технические нюансы

При использовании РегистрБухгалтерииНаборЗаписей важно помнить следующее:

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

Во-вторых, при программном создании ОперацииБух в приемнике, обязательно учитывайте порядок действий. Сначала создается регистратор (шапка документа), а затем, используя полученную ссылку, создается и записывается набор записей регистра бухгалтерии:


// Пример логики в обработчике ПослеЗагрузки для регистратора
Операция = Документы.ОперацияБух.СоздатьДокумент();
Операция.Дата = ТекущаяДата();
Операция.Организация = ВходящиеДанные.Организация;
Операция.Записать();

// Далее заполняем движения, используя ссылку на созданную операцию
НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(Операция.Ссылка);
// Заполняем записи из данных, переданных через ИсходящиеДанные
// ...
НаборЗаписей.Записать();

Таким образом, комбинируя создание «фиктивного» объекта в источнике и прямую запись набора записей в приемнике, вы получаете полный контроль над процессом переноса данных. Это наиболее «чистый» способ решения задачи, когда структура данных приемника кардинально отличается от источника или требует сложной трансформации.

← На главную