Как выгрузить реквизит табличной части в параметры объекта и организовать поиск по нему в Конвертации Данных 2.1?

Программист IT и автоматизация бизнеса
← На главную

При настройке обмена через «Конвертацию данных 2.1» часто возникает задача синхронизации объектов по сложным условиям, например, когда номенклатура в базе-источнике связана с номенклатурой в приемнике по дополнительному сведению или коду. Рассмотрим подробнее, как правильно выгрузить реквизит табличной части документа в параметры и почему важно использовать стандартные механизмы поиска платформы вместо ручного написания запросов.

Передача данных реквизита табличной части в параметр

Для начала разберем по шагам, как выгрузить в параметры объекта код реквизита табличной части документа (например, код номенклатуры).

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

Пример кода для обработчика «Перед выгрузкой»:

Значение = ОбъектКоллекции.Номенклатура.Код;

Таким образом, мы передаем код в системную переменную Значение, и он отправится в файл обмена как параметр табличной части.

Как правильно организовать поиск в базе-приемнике

Распространенной ошибкой разработчиков является попытка реализовать собственный алгоритм поиска прямо в обработчиках загрузки самого документа. Например, разработчик пытается обойти структуру ПараметрыОбъекта в цикле и выполнить SQL-запрос для каждой строки, чтобы найти нужную ссылку на справочник и подставить ее в документ.

Проанализируем ситуацию: если использовать запросы к базе данных внутри цикла по строкам табличной части документа (проблема N+1), это приведет к критическому замедлению загрузки данных. Кроме того, структура ПараметрыОбъекта полностью хранится в оперативной памяти, и передача туда объемных табличных частей целиком может вызвать нехватку памяти и падение обмена.

Рекомендуемый архитектурный подход:

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

  1. В ПКС табличной части документа необходимо установить флаг Поиск у соответствующего реквизита. Укажите нужное ПКО (например, «Номенклатура») для этого свойства. В саму табличную часть документа ничего вручную передавать не нужно — система сама выполнит поиск и подставит верные ссылки в каждую строку.
  2. Если реквизит в базе-источнике является примитивным типом (например, строкой с кодом), а в приемнике — ссылкой, используется ПКО с пустым объектом-источником.
  3. В ПКО справочника в обработчике Поля поиска переданный параметр будет доступен как ПараметрыОбъекта["ИмяТвоегоРеквизита"]. Также через переменную СтрокаИменПоиска можно явно указать, по каким реквизитам искать в приемнике.
  4. В этом же обработчике «Поля поиска» пишется нужный запрос (например, к регистру сведений или плану видов характеристик). Если по переданному коду находится нужная номенклатура, системной переменной СсылкаНаОбъект присваивается результат, а переменной ПрекратитьПоиск задается значение Истина.

Дополнительные преимущества стандартного подхода

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

← На главную