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