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