При разработке правил обмена в конфигурации «Конвертация данных 2.0» (КД 2.0) часто возникает необходимость передать из базы-источника дополнительные параметры, привязанные к конкретным строкам табличной части. Это требуется в случаях, когда алгоритм заполнения или модификации строк в базе-приемнике зависит от значений, отсутствующих в структуре объекта приемника напрямую.
Многие разработчики пытаются найти обработчик уровня строки при загрузке данных, однако архитектура универсального механизма обмена КД 2.0 устроена иначе. Разберем по шагам, как правильно организовать передачу и обработку параметров строк табличных частей.
Проанализируем работу механизмов загрузки данных. В обработке обмена КД 2.0 отсутствуют события уровня отдельной строки при загрузке (такие как ПриЗагрузкеСтроки или ПослеЗагрузкиСтроки). Табличные части загружаются системным алгоритмом универсальной выгрузки/загрузки данных XML целиком.
По этой причине вся логика постобработки табличной части объекта с использованием переданных параметров должна выполняться в обработчике ПКО «После загрузки».
Рассмотрим стандартный и наиболее удобный способ настройки правил в КД 2.0. Платформа умеет автоматически упаковывать построчные параметры в коллекцию соответствия ПараметрыОбъекта.
Разберем настройку по шагам:
ПередВыгрузкой через переменную Значение).При такой настройке универсальная обработка обмена упакует параметры каждой строки в отдельную таблицу внутри соответствия ПараметрыОбъекта. Ключ в соответствии формируется автоматически по строгому шаблону: [ИмяТабличнойЧасти] + "ТабличнаяЧасть" (для регистров — [ИмяРегистра] + "НаборЗаписей"). Для анализа состава и структуры выгруженных реквизитов и параметров до загрузки в приемник можно использовать обработку для анализа выгруженных данных в КД 2.0.
Посмотрим на пример обработки полученных данных в обработчике ПКО «После загрузки»:
Если ПараметрыОбъекта <> Неопределено И ПараметрыОбъекта["ОтражениеВУчетеТабличнаяЧасть"] <> Неопределено Тогда
ТабПараметров = ПараметрыОбъекта["ОтражениеВУчетеТабличнаяЧасть"];
Для Каждого СтрокаТЧ Из Объект.ОтражениеВУчете Цикл
// Ищем соответствующую строку в таблице переданных параметров
СтрокаПараметров = ТабПараметров.Найти(СтрокаТЧ.НомерСтроки, "НомерСтроки");
Если СтрокаПараметров <> Неопределено Тогда
// Выполняем алгоритм обработки строки на основе переданного параметра
СтрокаТЧ.Комментарий = СтрокаПараметров.ФЛНаименование;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если параметры строки требуют сложного вычисления, выборки запросом или состав строк источника модифицируется динамически, удобнее сформировать таблицу значений вручную и поместить ее в ПараметрыОбъекта. Для отладки программного кода в обработчиках выгрузки и загрузки подойдёт инструмент для отладки обработчиков событий в КД 2.0.
Разберем этот вариант подробнее. В обработчике ПКО «Перед выгрузкой» напишем код формирования вспомогательной таблицы:
ТаблицаДопДанных = Новый ТаблицаЗначений;
ТаблицаДопДанных.Колонки.Добавить("НомерСтроки", Новый ОписаниеТипов("Число"));
ТаблицаДопДанных.Колонки.Добавить("СпецПризнак", Новый ОписаниеТипов("Строка"));
Для Каждого СтрТЧ Из Источник.Товары Цикл
НоваяСтрока = ТаблицаДопДанных.Добавить();
НоваяСтрока.НомерСтроки = СтрТЧ.НомерСтроки;
НоваяСтрока.СпецПризнак = "Обработано";
КонецЦикла;
ПараметрыОбъекта.Вставить("ТаблицаДопДанныхТовары", ТаблицаДопДанных);
В обработчике ПКО «После загрузки» прочитаем эту таблицу и модифицируем объект приемника:
Если ПараметрыОбъекта <> Неопределено Тогда
ТаблицаДопДанных = Неопределено;
Если ПараметрыОбъекта.Свойство("ТаблицаДопДанныхТовары", ТаблицаДопДанных) И ТаблицаДопДанных <> Неопределено Тогда
Для Каждого СтрТЧ Из Объект.Товары Цикл
СтрокаПараметров = ТаблицаДопДанных.Найти(СтрТЧ.НомерСтроки, "НомерСтроки");
Если СтрокаПараметров <> Неопределено Тогда
// Применяем логику к строке
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
Выясним причину частой ошибки, когда в переданной таблице параметров оказывается только одна строка (последняя). Это происходит в следующих случаях:
ПараметрыОбъекта.Вставить("ИмяПараметра", Значение), ключ будет циклически перезаписываться на каждой итерации.Обратим внимание на важный нюанс: сопоставление строк источника и приемника по НомерСтроки надежно работает только тогда, когда состав и порядок строк в источнике и приемнике строго совпадают.
Если в правилах обмена настроена фильтрация (например, пропуск части строк через Отказ = Истина в ПКГС или ПКС), номера строк разойдутся. В таких ситуациях рекомендуется передавать в параметрах уникальный идентификатор строки или ключевую комбинацию полей (например, номенклатура, характеристика и серия), по которым строку можно однозначно найти в приемнике.