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