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