Почему пропадают новые справочники при автоматическом обмене БСП по правилам КД 2 и как это исправить?

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

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

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

Выясняем причину: почему ручной обмен работает, а регламентный — нет

Для того чтобы понять суть проблемы, нам необходимо заглянуть под капот механизмов КД 2 и БСП. Рассмотрим, как ведут себя эти системы в различных сценариях.

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

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

Проанализировав поведение системы, рассмотрим 4 практических способа решения этой проблемы, начиная от самых простых интерактивных настроек и заканчивая программным кодом.

Способ 1. Настройка флага «Выгружать объект (полностью) только при наличии на него ссылки» в ПКО (Рекомендуемый метод)

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

Выполним следующие шаги по настройке правил в конфигурации «Конвертация данных»:

  1. Откроем правила обмена и перейдем к правилу конвертации (ПКО) нужного справочника (например, Номенклатура или Контрагенты).
  2. Перейдем на вкладку «Он-лайн обмен» (в некоторых версиях она называется «Настройки онлайн-обмена»).
  3. Установим флаг «Выгружать объект (полностью), только при наличии на него ссылки».
  4. Сохраним правила и загрузим их в наши базы данных.

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

Способ 2. Программный сброс параметра «ТолькоПолучитьУзелСсылки» в обработчиках ПКО

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

Для этого в ПКО нужного справочника (например, Номенклатура) найдем обработчик события «Перед выгрузкой» и пропишем в нем следующий код:

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

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

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

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

Рассмотрим пример. Допустим, при выгрузке документа РеализацияТоваровУслуг нам нужно гарантировать создание новых контрагентов. Для этого выполним следующее:

  1. В ПКО документа РеализацияТоваровУслуг найдем свойство (ПКС) Контрагент.
  2. В обработчике события «Перед выгрузкой» этого ПКС напишем:

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

Этот код заставляет КД 2 принудительно выгрузить объект по ссылке целиком, игнорируя любые оптимизационные параметры БСП для данного конкретного реквизита при выгрузке текущего документа.

Способ 4. Корректная настройка Правил регистрации объектов (ПРО)

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

Часто разработчики исключают справочники из авторегистрации, рассчитывая, что они «сами улетят по ссылке». Однако правильнее настроить правила регистрации для справочников (например, той же Номенклатуры) в режиме «Выгружать при необходимости» (или «Выгружать по условию»).

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

Резюме

Мы проанализировали неочевидную проблему потери данных при регламентном COM-обмене БСП и нашли решение. Наиболее стабильным, простым в поддержке и рекомендуемым решением является Способ 1 — установка флага «Выгружать объект (полностью) только при наличии на него ссылки» в ПКО КД 2. Он позволяет исправить проблему «молчаливого» исчезновения данных в фоновом режиме раз и навсегда без написания лишнего программного кода.

← На главную