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