Как передать значение из реквизита объекта в табличную часть в 1С:Конвертация данных 2.1?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При настройке правил обмена данными в конфигурации 1С:Конвертация данных 2.1 (КД 2.1) разработчики часто сталкиваются с необходимостью трансформировать структуру данных. Типичный пример такой задачи — когда значение из реквизита шапки (например, склада, договора или ответственного лица) в объекте-источнике должно быть записано в каждую строку табличной части (ТЧ) объекта-приемника. Или более сложный случай: в источнике вообще нет табличной части, а в приемнике её нужно заполнить на основании реквизитов шапки источника.

В этой статье мы подробно разберем, как решить эти задачи в КД 2.1, проанализируем различные варианты реализации, рассмотрим примеры кода и выделим важные нюансы, которые помогут избежать распространенных ошибок при выгрузке данных. В случаях, когда объекты в базах имеют разные ссылки или были заведены вручную, сопоставление данных может упростить обработка для переноса данных между похожими конфигурациями 1С.

Вариант 1. Если табличная часть в источнике существует, и нужно заполнить одну из ее колонок значением из шапки

Рассмотрим ситуацию, когда в объекте-источнике (например, документе) есть табличная часть, и она переносится в аналогичную табличную часть объекта-приемника. При этом одна из колонок табличной части приемника должна заполниться не из строки ТЧ источника, а продублировать значение определенного реквизита из шапки источника (например, реквизита Склад).

Для реализации этого сценария выполним следующие шаги по настройке правил конвертации свойств (ПКС):

  1. Откроем настройку группы свойств (ПКГС) для нашей табличной части.
  2. Внутри этой группы найдем или создадим правило конвертации свойства (ПКС) для той колонки табличной части, которую необходимо заполнить.
  3. В настройках этого ПКС поле «Источник» оставляем пустым, а в поле «Приемник» выбираем соответствующий реквизит табличной части.
  4. Переходим на вкладку «Обработчики событий» для этого ПКС и в обработчике Перед выгрузкой пишем следующий код:

Значение = Источник.ИмяРеквизитаШапки;

Разберем подробнее, почему этот код работает именно так:

Вариант 2. Если в источнике вообще нет табличной части, а в приемнике её нужно создать и заполнить программно

Бывают случаи, когда структура метаданных в базах различается кардинально. Например, в источнике информация хранится в реквизитах шапки (НоменклатураШапки, КоличествоШапки), а в приемнике эти данные должны быть записаны в виде одной строки в табличную часть.

Для реализации этого сценария нам потребуется программно сформировать и передать таблицу значений в качестве коллекции объектов:

  1. В правиле конвертации объектов (ПКО) создаем группу свойств (ПКГС) для нашей табличной части. Поле «Источник» для самой группы свойств оставляем пустым, а в поле «Приемник» указываем имя табличной части получателя.
  2. В обработчике Перед выгрузкой самой этой группы свойств (ПКГС) пишем код, который сформирует структуру будущей ТЧ:

КоллекцияОбъектов = Новый ТаблицаЗначений;
КоллекцияОбъектов.Колонки.Добавить("Номенклатура");
КоллекцияОбъектов.Колонки.Добавить("Количество");
КоллекцияОбъектов.Колонки.Добавить("Цена");

НоваяСтрока = КоллекцияОбъектов.Добавить();
НоваяСтрока.Номенклатура = Источник.РеквизитНоменклатураШапки;
НоваяСтрока.Количество = Источник.РеквизитКоличествоШапки;
НоваяСтрока.Цена = Источник.РеквизитЦенаШапки;

Важные нюансы данного подхода:

Вариант 3. Передача табличной части через «Входящие данные»

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

Давайте разберем по шагам, как настроить этот механизм:

Шаг 1. На уровне всего ПКО (Правила конвертации объекта) в обработчике Перед выгрузкой мы пишем код для подготовки таблицы значений:


ТаблицаУслуг = Новый ТаблицаЗначений;
ТаблицаУслуг.Колонки.Добавить("Номенклатура");
ТаблицаУслуг.Колонки.Добавить("Количество");

НоваяСтрока = ТаблицаУслуг.Добавить();
НоваяСтрока.Номенклатура = Источник.РеквизитНоменклатураШапки;
НоваяСтрока.Количество = 1;

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

Шаг 2. В настройках ПКГС (сопоставления табличной части) устанавливаем флаг «Получать из входящих данных». Поле «Источник» для ПКГС при этом оставляем пустым.

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

Практические советы по оптимизации и отладке

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


Если КоллекцияОбъектов.Количество() = 0 Тогда
    Отказ = Истина;
КонецЕсли;

Этот простой шаг предотвратит появление пустых XML-узлов табличной части в файле выгрузки, что сделает файл обмена чище и снизит нагрузку при его чтении базой-приемником. Когда правила конвертации подготовлены, для автоматизации регулярной передачи данных можно настроить автоматический обмен данными между базами 1С по расписанию.

← На главную