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