Почему при обмене через БСП вложенные объекты выгружаются только ссылками и как это исправить?

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

При настройке обмена между конфигурациями 1С (например, между 1С:ERP и устаревшей 1С:УТ 11.1) с использованием Конвертации Данных 2 (КД 2) и Библиотеки стандартных подсистем (БСП) разработчики часто сталкиваются с неочевидной проблемой. Суть ее заключается в следующем: при отправке документа система по вложенным свойствам (например, контрагентам или номенклатуре) отправляет только саму ссылку (УИД) и поля поиска. Полная структура объекта не выгружается.

В результате, если в базе-приемнике не удается найти объект по УИД и полям поиска, он просто не создается, а в поле документа записывается «битая» ссылка. Самое странное в этой ситуации то, что если сделать выгрузку по тем же самым правилам обмена через стандартную обработку «Универсальный обмен данными в формате XML», то выгружается вся структура на всю глубину вложенности. Давайте подробно разберем, почему так происходит и как заставить систему выгружать все реквизиты.

Выясним причину: почему БСП «срезает» реквизиты

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

Дело в том, что такое поведение не является ошибкой. Это целенаправленная оптимизация трафика в Библиотеке стандартных подсистем. При программном запуске обмена БСП принудительно, без дополнительных проверок, передает параметр:

НеВыгружатьОбъектыПоСсылкам = Истина;

Это делается для того, чтобы многократно уменьшить размер файла транзакции и ускорить обмен. Если бы объекты выгружались на всю глубину вложенности, один и тот же контрагент мог бы целиком копироваться в XML-файле десятки раз для каждого документа. Из-за этого БСП игнорирует настройки КД 2 и выгружает только «узел ссылки».

Быстрое решение: принудительная выгрузка объекта

Если специфика вашей задачи требует обязательной выгрузки всех реквизитов вложенного объекта (например, при первоначальной синхронизации или когда объекты-справочники не регистрируются отдельно), мы можем обойти ограничение БСП с помощью внутренних флагов обработчиков КД 2.

Рассмотрим, как это сделать. Нам необходимо отключить режим получения только ссылки. Для этого перейдите в правила конвертации и добавьте одну строку кода.

Вариант 1. В обработчике ПКО «Перед выгрузкой»:

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

ТолькоПолучитьУзелСсылки = Ложь;

Вариант 2. В глобальном обработчике «Перед конвертацией объекта»:

Если вам нужно применить это правило глобально (что не всегда рекомендуется из-за возможного разрастания файла обмена), этот же код можно поместить в глобальные обработчики конвертации.

Флаг ТолькоПолучитьУзелСсылки управляет тем, будет ли ссылочный объект выгружаться свернуто или развернуто. Установив его в Ложь, система проигнорирует ограничения БСП и выгрузит всю структуру элемента, даже если он тянется по ссылке из другого объекта. Для проверки состава выгруженных реквизитов непосредственно в файле обмена можно использовать обработку для анализа выгруженных данных конвертации.

Дополнительные инструменты Конвертации Данных 2

Посмотрим на другие механизмы, которые предоставляет КД 2 для управления вложенностью объектов. В зависимости от задачи, вы можете использовать следующие конструкции:

  1. Конструкция ВыгрузитьОбъект = Истина; в обработчике «Перед выгрузкой» ПКС (Правила конвертации свойств). Она заставляет систему точечно проигнорировать правила экономии трафика для конкретного свойства.
  2. Программная функция ВыгрузитьПоПравилу(). При нестандартных алгоритмах выгрузки вы можете напрямую передавать в эту функцию параметр ТолькоПолучитьУзелСсылки в качестве аргумента.

Архитектурно правильное решение (рекомендации 1С)

Хотя программное снятие флага полностью решает задачу и заставляет обмен работать так же, как универсальная выгрузка XML, методология БСП предполагает принципиально иной подход. Объекты не должны переноситься «внутри» других объектов.

Разберем по шагам правильную настройку обмена:

  1. Объекты-справочники (контрагенты, номенклатура и т.д.) должны выгружаться независимо от документов.
  2. Для этого необходимо настроить Правила регистрации изменений (ПРИ).
  3. При проведении или изменении документа система должна проверять вложенные в него ссылки и программно регистрировать эти элементы справочников на узле обмена отдельными записями.
  4. В результате БСП сформирует пакет обмена, в котором справочник выгрузится один раз как самостоятельный объект со всеми полями, а документ выгрузится с короткой ссылкой на него.

При загрузке в базу-приемник все связи корректно восстановятся: сначала загрузятся справочники, а затем документы, которые свяжутся с уже созданными объектами НСИ. Этот подход требует больше времени на описание логики регистрации, но обеспечивает максимальную производительность и стабильность обмена в долгосрочной перспективе. Для ускорения настройки можно использовать обработку группового создания правил регистрации в КД 2.

← На главную