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