Как заполнить табличную часть в документе-приемнике при выгрузке через Конвертацию данных 2.0, если в источнике ее нет?

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

При настройке правил обмена в конфигурации «Конвертация данных 2.0» (например, между «Управление торговлей» и «Бухгалтерия предприятия») разработчики часто сталкиваются с несовпадением структур метаданных. Распространенный сценарий: документ в информационной базе-источнике хранит данные исключительно в шапке либо имеет совершенно другую структуру табличных частей, тогда как в базе-приемнике документ требует обязательного заполнения строк подчиненной табличной части.

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

Основной способ: использование обработчика «Перед обработкой» в ПКГС

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

Проанализируем доступный контекст обработчика «Перед обработкой» группы свойств. В данном обработчике платформа предоставляет специальный предопределенный параметр КоллекцияОбъектов. По умолчанию он равен Неопределено. Если мы присвоим этой переменной собственную коллекцию (например, таблицу значений или массив структур), механизм конвертации данных откажется от стандартного считывания ТЧ источника и выполнит обход предоставленной нами коллекции.

Рассмотрим пошаговый алгоритм настройки правила:

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

Посмотрим на пример заполнения параметра КоллекцияОбъектов:


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

// Добавляем строку и заполняем реквизиты из шапки источника
НоваяСтрока = КоллекцияОбъектов.Добавить();
НоваяСтрока.ДокументОснование      = Источник.Сделка;
НоваяСтрока.НомерИсходногоДокумента = Источник.Номер;
НоваяСтрока.ДатаИсходногоДокумента  = Источник.Дата;
НоваяСтрока.Сумма                  = Источник.СуммаДокумента;

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


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

Обязательная настройка подчиненных ПКС (Правил конвертации свойств)

Типичная ошибка при реализации такого механизма — создание группы свойств с обработчиком, но без подчиненных правил конвертации свойств (ПКС). В таком случае разработчик видит, что в файл обмена выгружается пустой узел табличной части без значений.

Выясним причину такого поведения: механизм конвертации не переносит колонки таблицы значений «вслепую». Ему требуется четкое описание соответствия реквизитов. Поэтому внутри созданной группы свойств (ПКГС) обязательно создаем правила конвертации свойств (ПКС) для каждого реквизита табличной части приемника:

  1. Для каждого реквизита ТЧ создаем ПКС.
  2. Поле «Источник» оставляем пустым.
  3. Поле «Приемник» сопоставляем с реквизитом табличной части приемника. Если имя колонки в КоллекцияОбъектов совпадает с именем реквизита в приемнике, сопоставление произойдет автоматически.

Если имя колонки не совпадает или значение требуется переопределить на лету, используем обработчик «Перед выгрузкой» конкретного ПКС. В этом обработчике текущая выгружаемая строка таблицы доступна через переменную ОбъектКоллекции:


// Пример переопределения значения в ПКС для реквизита "Сумма"
Значение = ОбъектКоллекции.Количество * ОбъектКоллекции.Цена;

// Пример установки фиксированного значения перечисления
Значение = Перечисления.СтавкиНДС.НДС20;

Альтернативные способы формирования данных

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

  1. Использование результата запроса: Не обязательно собирать ТаблицаЗначений вручную через метод Добавить(). Можно выполнить запрос к базе-источнику и выгрузить результат сразу в коллекцию:
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Таблица.Номенклатура КАК Номенклатура,
        |   Таблица.Количество КАК Количество
        |ИЗ
        |   Документ.ЗаказКлиента.Товары КАК Таблица
        |ГДЕ
        |   Таблица.Ссылка = &Ссылка";
    Запрос.УстановитьПараметр("Ссылка", Источник.Ссылка);
    
    КоллекцияОбъектов = Запрос.Выполнить().Выгрузить();
    
    При совпадении псевдонимов колонок запроса с именами реквизитов ТЧ приемника данные будут сопоставлены автоматически.
  2. Заполнение на стороне базы-приемника (обработчик «После загрузки»): Если данные для заполнения строк можно рассчитать или получить непосредственно в базе-приемнике (например, по регистрам или константам БП), формировать ТЧ при выгрузке не обязательно. В ПКО документа в обработчике «После загрузки» мы можем обратиться к загруженному объекту напрямую через переменную Объект и вызвать типовой метод конфигурации (например, Объект.ЗаполнитьПоОснованию(...)) или вручную добавить строки через Объект.ИмяТабличнойЧасти.Добавить().

Важные нюансы и подводные камни

При выгрузке виртуальных коллекций следует учитывать ряд важных технических особенностей:

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