Почему не заполняется реквизит составного типа при выгрузке по правилу в Конвертации данных 2.1

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

В этой статье мы подробно проанализируем причины такого поведения платформы и рассмотрим рабочие способы решения этой задачи.

Разбор исходной ситуации и причины ошибки

Рассмотрим пример алгоритма, который вызывается в обработчике события «После выгрузки» для правила конвертации объектов (ПКО) справочника Сотрудники:


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

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

  1. Различие типов источника и приемника. В базе-источнике выгружается объект типа СправочникСсылка.Сотрудники, тогда как в базе-приемнике поле Объект ссылается на СправочникСсылка.ФизическиеЛица. Если платформе не указать явно правильное ПКО, автоматическое преобразование типов составного поля не произойдет.
  2. Особенности автоподбора ПКО для составного типа. Когда для поля с флагом «Получить из входящих данных» не задано конкретное ПКО, Конвертация данных пытаются автоматически подобрать правило по фактическому типу передаваемого значения. Если для этого типа существует несколько правил или если тип источника не совпадает с ожидаемым типом приемника, автоматически выбирается неподходящее ПКО или выгрузка ссылки сбрасывается.
  3. Передача объекта вместо ссылки. Если в параметр структуры передается объектная переменная (например, сам объект справочника), а не ссылочный тип, механизм конвертации может некорректно сформировать узел ссылки в XML.

Способ 1. Создание отдельного специализированного ПКО

Наиболее надежный вариант решения — создать отдельное ПКО под конкретную задачу выгрузки целевого объекта. Если ссылка в источнике принадлежит справочнику Сотрудники, а в приемнике должен создаваться узел для ФизическиеЛица, выделим специальное правило конвертации:

  1. Создадим новое ПКО (например, Сотрудники_В_ФизическиеЛица), где Источник — Сотрудники, а Приемник — ФизическиеЛица.
  2. Укажем это ПКО в правиле конвертации свойств (ПКС) Объект для правила выгрузки контактной информации.
  3. В структуре входящих данных убедимся, что передаем именно ссылку, а не объект целиком:

ВходящиеДанные = Новый Структура;
ВходящиеДанные.Вставить("Информация", Выборка.Телефон);
ВходящиеДанные.Вставить("Объект", Источник.Ссылка);
ВходящиеДанные.Вставить("Вид", "Телефон");

ВыгрузитьПоПравилу(,, ВходящиеДанные,, "КонтактнаяИнформация");

Способ 2. Явное переопределение правила в обработчике ПКС

Если нет желания создавать дополнительное ПКО, можно явно указать правильное имя ПКО в обработчике события «Перед выгрузкой» для ПКС Объект правила КонтактнаяИнформация.

Разберем, как написать этот код в обработчике ПКС:


// В событии "Перед выгрузкой" для ПКС "Объект":
Значение = ВходящиеДанные.Объект;
ИмяПКО = "ФизическиеЛица"; // Указываем точное имя ПКО для конвертации ссылки

Если для успешного поиска объекта в базе-приемнике требуется выгрузить его данные целиком, а не только ключ ссылки, установим флаг принудительной выгрузки:

ВыгрузитьОбъект = Истина;

Способ 3. Передача целевой ссылки прямо во входящих данных

Если у сотрудника в источнике есть реквизит со ссылкой на физическое лицо (Выборка.ФизическоеЛицо), целесообразнее передавать во входящие данные именно его. В таком случае тип источника и тип приемника совпадут, и платформа автоматически применит стандартное ПКО ФизическиеЛица:


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

ВыгрузитьПоПравилу(,, ВходящиеДанные,, "КонтактнаяИнформация");

Важные рекомендации по обработчикам

При выгрузке подчиненных или связанных данных с помощью ВыгрузитьПоПравилу() всегда соблюдаем следующие правила:

← На главную