Как отключить автоматическую регистрацию изменений на планах обмена при загрузке данных через КД 2.1?

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

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

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

Почему свойство ОбменДанными.Загрузка = Истина не спасает от регистрации изменений?

Для начала проанализируем базовый механизм платформы «1С:Предприятие». Принято считать, что установка флага ОбменДанными.Загрузка = Истина полностью отключает все проверки и сопутствующие механизмы при записи объекта. Действительно, этот флаг отключает прикладную бизнес-логику (проверки заполнения реквизитов, контроли остатков, проведение документов и т. д.), чтобы данные могли загрузиться в приемник «как есть».

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

Если настройки планов обмена в базе-приемнике неактуальны (например, правила регистрации устарели или узел настроен некорректно), процесс загрузки прерывается ошибкой. Наша задача — научить систему полностью игнорировать регистрацию для конкретного потока загрузки.

Решение 1. Использование механизма БСП «ОтключитьМеханизмРегистрацииОбъектов»

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

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

Давайте рассмотрим, как внедрить это решение непосредственно в правила конвертации данных (КД 2.1).

А. Для ссылочных типов данных (Справочники, Документы, Планы видов характеристик)

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


Объект.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов", Истина);

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

Б. Для регистров (сведений, накопления, бухгалтерии)

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


НаборЗаписей.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов", Истина);

Этот вариант является наиболее верным и безопасным для баз, использующих типовую БСП.

Решение 2. Отключение авторегистрации на уровне платформы «1С:Предприятие»

Что делать, если конфигурация-приемник не использует БСП, или если вы хотите подстраховаться на уровне самой платформы, не полагаясь на логику БСП? Для этого существует универсальный платформенный способ управления получателями обмена.

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

Разберем, как это реализовать в КД 2.1:

А. Для ссылочных типов (ПКО -> После загрузки): Объект.ОбменДанными.Получатели.АвтоЗаполнение = Ложь; Б. Для регистров (Правила конвертации регистра -> После загрузки): НаборЗаписей.ОбменДанными.Получатели.АвтоЗаполнение = Ложь;

Установка свойства АвтоЗаполнение = Ложь принудительно запрещает платформе автоматически определять получателей для записываемого объекта. Коллекция получателей остается пустой, и физическая запись в таблицы регистрации изменений на планах обмена не производится. Данный метод работает напрямую на уровне СУБД/платформы и не зависит от версии БСП.

Для достижения максимальной надежности в правилах конвертации КД 2.1 можно комбинировать оба этих метода в обработчиках «После загрузки»:


// Для справочников и документов
Объект.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов", Истина);
Объект.ОбменДанными.Получатели.АвтоЗаполнение = Ложь;

// Для регистров сведений и накопления
НаборЗаписей.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов", Истина);
НаборЗаписей.ОбменДанными.Получатели.АвтоЗаполнение = Ложь;

Альтернативный программный метод БСП (для написания кода в общем модуле)

Если вы не используете правила конвертации КД 2.1, а разрабатываете собственный программный алгоритм загрузки или синхронизации данных непосредственно в коде общего модуля, БСП (начиная с версии 2.1.4) предоставляет удобный метод для безопасной записи данных в обход механизмов регистрации. Вместо стандартного вызова Объект.Записать() используйте процедуру:

ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект);

Этот метод внутри себя автоматически устанавливает все необходимые дополнительные свойства отключения регистрации (включая рассмотренный нами флаг ОтключитьМеханизмРегистрацииОбъектов), корректно записывает объект и гарантирует, что запись пройдет без транзакционной нагрузки на планы обмена.

Использование описанных методик позволит вам полностью изолировать потоки импорта данных от работающих в базе планов обмена, избежать ошибок блокировок и существенно ускорить процесс загрузки данных.

← На главную