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

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

При разработке правил обмена в конфигурации «Конвертация данных 2.0» (КД 2.0) часто возникает необходимость передать из базы-источника дополнительные параметры, привязанные к конкретным строкам табличной части. Это требуется в случаях, когда алгоритм заполнения или модификации строк в базе-приемнике зависит от значений, отсутствующих в структуре объекта приемника напрямую.

Многие разработчики пытаются найти обработчик уровня строки при загрузке данных, однако архитектура универсального механизма обмена КД 2.0 устроена иначе. Разберем по шагам, как правильно организовать передачу и обработку параметров строк табличных частей.

Архитектурные особенности загрузки табличных частей в КД 2.0

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

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

Способ 1. Штатный механизм передачи параметров через ПКГС

Рассмотрим стандартный и наиболее удобный способ настройки правил в КД 2.0. Платформа умеет автоматически упаковывать построчные параметры в коллекцию соответствия ПараметрыОбъекта.

Разберем настройку по шагам:

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

При такой настройке универсальная обработка обмена упакует параметры каждой строки в отдельную таблицу внутри соответствия ПараметрыОбъекта. Ключ в соответствии формируется автоматически по строгому шаблону: [ИмяТабличнойЧасти] + "ТабличнаяЧасть" (для регистров — [ИмяРегистра] + "НаборЗаписей"). Для анализа состава и структуры выгруженных реквизитов и параметров до загрузки в приемник можно использовать обработку для анализа выгруженных данных в КД 2.0.

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


Если ПараметрыОбъекта <> Неопределено И ПараметрыОбъекта["ОтражениеВУчетеТабличнаяЧасть"] <> Неопределено Тогда
    ТабПараметров = ПараметрыОбъекта["ОтражениеВУчетеТабличнаяЧасть"];
    
    Для Каждого СтрокаТЧ Из Объект.ОтражениеВУчете Цикл
        // Ищем соответствующую строку в таблице переданных параметров
        СтрокаПараметров = ТабПараметров.Найти(СтрокаТЧ.НомерСтроки, "НомерСтроки");
        Если СтрокаПараметров <> Неопределено Тогда
            // Выполняем алгоритм обработки строки на основе переданного параметра
            СтрокаТЧ.Комментарий = СтрокаПараметров.ФЛНаименование;
        КонецЕсли;
    КонецЦикла;
КонецЕсли;

Способ 2. Программная передача произвольной таблицы в «Перед выгрузкой»

Если параметры строки требуют сложного вычисления, выборки запросом или состав строк источника модифицируется динамически, удобнее сформировать таблицу значений вручную и поместить ее в ПараметрыОбъекта. Для отладки программного кода в обработчиках выгрузки и загрузки подойдёт инструмент для отладки обработчиков событий в КД 2.0.

Разберем этот вариант подробнее. В обработчике ПКО «Перед выгрузкой» напишем код формирования вспомогательной таблицы:


ТаблицаДопДанных = Новый ТаблицаЗначений;
ТаблицаДопДанных.Колонки.Добавить("НомерСтроки", Новый ОписаниеТипов("Число"));
ТаблицаДопДанных.Колонки.Добавить("СпецПризнак", Новый ОписаниеТипов("Строка"));

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

ПараметрыОбъекта.Вставить("ТаблицаДопДанныхТовары", ТаблицаДопДанных);

В обработчике ПКО «После загрузки» прочитаем эту таблицу и модифицируем объект приемника:


Если ПараметрыОбъекта <> Неопределено Тогда
    ТаблицаДопДанных = Неопределено;
    Если ПараметрыОбъекта.Свойство("ТаблицаДопДанныхТовары", ТаблицаДопДанных) И ТаблицаДопДанных <> Неопределено Тогда
        Для Каждого СтрТЧ Из Объект.Товары Цикл
            СтрокаПараметров = ТаблицаДопДанных.Найти(СтрТЧ.НомерСтроки, "НомерСтроки");
            Если СтрокаПараметров <> Неопределено Тогда
                // Применяем логику к строке
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
КонецЕсли;

Почему в параметрах передается только последняя строка?

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

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

Рекомендации по надежному сопоставлению строк

Обратим внимание на важный нюанс: сопоставление строк источника и приемника по НомерСтроки надежно работает только тогда, когда состав и порядок строк в источнике и приемнике строго совпадают.

Если в правилах обмена настроена фильтрация (например, пропуск части строк через Отказ = Истина в ПКГС или ПКС), номера строк разойдутся. В таких ситуациях рекомендуется передавать в параметрах уникальный идентификатор строки или ключевую комбинацию полей (например, номенклатура, характеристика и серия), по которым строку можно однозначно найти в приемнике.

← На главную