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