Как перенести реквизит реквизита табличной части в Конвертации данных 2.0?

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

При настройке правил обмена в конфигурации Конвертация данных 2.0 (КД2) разработчики часто сталкиваются с задачей, когда данные для реквизита табличной части документа-приемника хранятся не в самой табличной части источника, а «через точку» — внутри ссылочного реквизита (например, СтрокаТЧ.Партия.СтранаПроисхождения или СтрокаТЧ.Партия.РегистрационныйНомер).

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

Способ 1. Заполнение значения в обработчике «Перед выгрузкой» ПКС

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

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

Разберем пример кода для переноса номера ГТД из реквизита партии:


Если ЗначениеЗаполнено(ОбъектКоллекции.Партия) Тогда
    Значение = ОбъектКоллекции.Партия.РегистрационныйНомер;
Иначе
    Значение = Неопределено;
КонецЕсли;

Аналогично заполняется поле для страны происхождения:


Если ЗначениеЗаполнено(ОбъектКоллекции.Партия) Тогда
    Значение = ОбъектКоллекции.Партия.СтранаПроисхождения;
Иначе
    Значение = Неопределено;
КонецЕсли;

Важное примечание: проверка ЗначениеЗаполнено(ОбъектКоллекции.Партия) необходима для защиты от ошибок выгрузки в случаях, когда ссылка на партию в строке не заполнена или является битой ссылкой.

Способ 2. Подготовка коллекции с помощью запроса в ПКГС

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

Чтобы оптимизировать скорость выгрузки, заменим стандартную выборку табличной части запросом в обработчике «Перед обработкой» ПКГС:

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

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ТЧ.Номенклатура КАК Номенклатура,
    |	ТЧ.Количество КАК Количество,
    |	ТЧ.Партия.СтранаПроисхождения КАК СтранаПроисхождения,
    |	ТЧ.Партия.РегистрационныйНомер КАК НомерГТД
    |ИЗ
    |	Документ.РеализацияТоваровУслуг.Товары КАК ТЧ
    |ГДЕ
    |	ТЧ.Ссылка = &Ссылка";

Запрос.УстановитьПараметр("Ссылка", Источник);
КоллекцияОбъектов = Запрос.Выполнить().Выгрузить();

После формирования коллекции в ПКС табличной части достаточно указать имена колонок таблицы результатов (СтранаПроисхождения и НомерГТД) в поле Источник.

Способ 3. Заполнение реквизитов на стороне приемника в обработчике «После загрузки»

Если сам ссылочный реквизит (Партия) также переносится в документ-приемник, данные страны происхождения и номера ГТД можно не выгружать в файл обмена, а вычислять уже при загрузке документа в целевой базе.

В ПКО документа в обработчике «После загрузки» прописываем обход табличной части загруженного объекта:


Для Каждого СтрИз ТЧ Из Объект.Товары Цикл
    Если ЗначениеЗаполнено(СтрИз.Партия) Тогда
        СтрИз.СтранаПроисхождения = СтрИз.Партия.СтранаПроисхождения;
        СтрИз.НомерГТД = СтрИз.Партия.НомерГТД;
    КонецЕсли;
КонецЦикла;

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

← На главную