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

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

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

Разберем подробнее, почему типовая синхронизация ведет себя подобным образом, и рассмотрим практические способы настройки выгрузки зависимых объектов.

Причины поведения типового механизма синхронизации БСП

Проанализируем разницу между стандартной обработкой универсального обмена и подсистемой обмена БСП:

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

Способ 1. Настройка выборочной регистрации через Правила регистрации данных (ПРД)

Это наиболее правильный и архитектурно чистый подход в рамках БСП. Вместо того чтобы принудительно выгружать все 100 000 контрагентов или банков, мы регистрируем на узле плана обмена только те элементы, которые непосредственно задействованы в выгружаемом документе.

Разберем по шагам, как это реализовать в конфигурации «Конвертация данных» для правил регистрации:

  1. Включаем нужные справочники (контрагенты, банковские счета, банки) в состав плана обмена и создаем для них правила выгрузки данных (ПВД).
  2. В правиле регистрации данных для документа (например, ПлатежноеПоручение) в обработчике «После обработки правила» или «Перед регистрацией объекта» прописываем каскадную регистрацию зависимых данных:

// Регистрируем контрагента документа
Если ЗначениеЗаполнено(Объект.Контрагент) Тогда
    ПланыОбмена.ЗарегистрироватьИзменения(Узел, Объект.Контрагент);
КонецЕсли;

// Регистрируем банковский счет и банк контрагента
Если ЗначениеЗаполнено(Объект.СчетКонтрагента) Тогда
    ПланыОбмена.ЗарегистрироватьИзменения(Узел, Объект.СчетКонтрагента);
    Если ЗначениеЗаполнено(Объект.СчетКонтрагента.Банк) Тогда
        ПланыОбмена.ЗарегистрироватьИзменения(Узел, Объект.СчетКонтрагента.Банк);
    КонецЕсли;
КонецЕсли;

В этом случае при записи документа на узле обмена зарегистрируются ровно те элементы справочников, которые в нем указаны, и они будут выгружены отдельными полноправными объектами в соответствии со своими ПКО.

Способ 2. Установка переменной «ВыгрузитьОбъект = Истина» в ПКО

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

Рассмотрим, как это сделать:

  1. Открываем ПКО целевого справочника (например, ПКО для справочника Банки).
  2. В обработчике «Перед выгрузкой» устанавливаем специальную служебную переменную:

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

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

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

Способ 3. Принудительный вызов выгрузки через «ВыгрузитьПоПравилу»

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

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


// Принудительно формируем структуру данных объекта по указанному правилу
Значение = ВыгрузитьПоПравилу(Источник.Банк, , , , "Банки");

В результате реквизит выгрузится с полным набором полей по заданному правилу конвертации, не требуя отдельного правила выгрузки данных (ПВД).

Способ 4. Предварительная синхронизация классификаторов

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

← На главную