Как передать данные из одного правила конвертации (ПКО) в другое в Конвертации Данных 2.0?

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

При настройке обмена в конфигурации «Конвертация данных 2.0» часто возникает ситуация, когда нужно передать значения из одного объекта в другой. Рассмотрим классическую задачу: есть Документ с реквизитами Организация и Сотрудник. У справочника «Сотрудники» тоже есть реквизит Организация. Как сделать так, чтобы при выгрузке документа его организация передавалась в Правило Конвертации Объектов (ПКО) Сотрудника, и в базе-приемнике сотрудник создавался или перезаписывался именно с этой организацией?

Разберем по шагам механизм работы с параметрами ВходящиеДанные и ИсходящиеДанные, которые специально предназначены для решения подобных задач, и проанализируем важные нюансы, о которых нужно знать.

Шаг 1. Передача параметров через ИсходящиеДанные

Переменная ИсходящиеДанные представляет собой произвольные вспомогательные данные, которые можно передать подчиненному правилу конвертации. Как правило, для этого используется тип Структура. Ключи этой структуры должны соответствовать именам свойств объекта-приемника.

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


ИсходящиеДанные = Новый Структура("ГоловнаяОрганизация");
ИсходящиеДанные.ГоловнаяОрганизация = Источник.Организация;

Для большей гибкости и возможности легко добавлять новые параметры в будущем, рассмотрим более профессиональный вариант инициализации структуры:


ИсходящиеДанные = Новый Структура;
ИсходящиеДанные.Вставить("ГоловнаяОрганизация", Источник.Организация);
// Здесь можно добавить и другие параметры
// ИсходящиеДанные.Вставить("ДополнительныйПараметр", Истина);

Шаг 2. Прием параметров через ВходящиеДанные

То, что мы передали как ИсходящиеДанные в источнике, при попадании в подчиненное ПКО превращается в ВходящиеДанные. Теперь нам нужно указать системе, что реквизит должен заполняться именно оттуда.

Перейдем в ПКО справочника «Сотрудники». Найдем ПКС для поля ГоловнаяОрганизация. Откроем его настройки и установим флажок «Получать из входящих данных». При этом само правило конвертации (указание источника для этого поля) можно оставить пустым. Система автоматически извлечет значение по имени ключа из переданной структуры.

Важный нюанс: Кэширование выгруженных объектов

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

Чтобы обойти эту проблему и каждый раз перезаписывать сотрудника новыми данными, в ПКО Сотрудника необходимо установить флаг «Не запоминать выгруженные объекты». Это заставит систему каждый раз заново формировать узел объекта.

Использование входящих данных для поиска объекта

Переданные значения можно использовать не только для заполнения реквизитов, но и для идентификации (поиска) объекта в базе-приемнике. Если в ПКО сотрудника у свойства ГоловнаяОрганизация установить одновременно две галочки: «Получать из входящих данных» и «Поиск», то система при загрузке будет искать сотрудника по связке его стандартных полей поиска и той организации, которая пришла из документа-источника.

Передача табличных частей и сложных коллекций

Рассмотрим возможности передачи сложных структур. Через ИсходящиеДанные можно передавать ТаблицаЗначений или Массив. Это крайне полезно, если в документе-источнике нет физической табличной части, но в приемнике она нужна (например, мы собираем данные запросом по регистрам).

  1. В обработчике «Перед выгрузкой» сформируем Таблицу Значений и поместим ее в структуру: ИсходящиеДанные.Вставить("МояТабличнаяЧасть", СформированнаяТЗ);
  2. В ПКО приемника для ПКС нужной табличной части установим галочку «Получать из входящих данных».
  3. КД 2.0 автоматически обойдет эту таблицу и выгрузит все ее строки.

Создание объектов "из воздуха" (Выгрузка без источника)

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

Программный доступ к Входящим данным

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


Если ВходящиеДанные <> Неопределено И ВходящиеДанные.Свойство("ГоловнаяОрганизация") Тогда
    Если ВходящиеДанные.ГоловнаяОрганизация = Справочники.Организации.НайтиПоНаименованию("ООО Ромашка") Тогда
        Отказ = Истина; // Отменяем выгрузку сотрудника для конкретной организации
    КонецЕсли;
КонецЕсли;

Таким образом, механизм передачи данных через исходящие и входящие параметры является одним из самых мощных инструментов в «Конвертации данных 2.0», позволяя гибко управлять выгрузкой, подменять значения на лету и создавать сложные алгоритмы интеграции между базами 1С.

← На главную