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