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