Рассмотрим распространенную техническую задачу: в базе-источнике (например, 1С:Розница) настроен обмен данными с двумя системами-приемниками (например, двумя разными базами 1С:Управление торговлей 11) в рамках одного и того же плана обмена. При этом требуется, чтобы правила регистрации объектов (ПРО) различались в зависимости от узла: один документ должен регистрироваться для первого узла, но игнорироваться для второго.
Прежде чем переходить к решениям, проанализируем базовые ограничения платформенного механизма обмена данными:
Отказ = Истина;, регистрация объекта отменится сразу для всех узлов текущего плана обмена.Разберем основной штатный метод разделения логики регистрации. Для этого используются реквизиты узла плана обмена и интерактивные отборы в конфигураторе правил регистрации.
Процесс настройки включает следующие шаги:
ВыгружатьКонтрагентов, ссылку на Организация или табличную часть со списками складов).Объект.Контрагент) с реквизитами самого узла (например, Узел.Контрагент или флаг узла).При записи объекта платформа 1С автоматически вычисляет установленное условие для каждого узла по отдельности. Если реквизиты узла соответствуют отбору, объект регистрируется на этом узле.
Если возможностей стандартного интерактивного отбора недостаточно (например, требуется сложная проверка табличных частей объекта или иерархии справочников), используем программный подход в обработчике При обработке.
В этом обработчике доступна переменная ТекстЗапроса, определяющая выборку узлов-получателей. Посмотрим, как переопределить запрос для фильтрации узлов:
// Пример модификации ТекстЗапроса в обработчике "При обработке"
ТекстЗапроса =
"ВЫБРАТЬ
| Узлы.Ссылка КАК Ссылка
|ИЗ
| ПланОбмена.МойПланОбмена КАК Узлы
|ГДЕ
| Узлы.Ссылка = &Узел
| И (Узлы.ФильтроватьПоПартнерам = ЛОЖЬ ИЛИ &КонтрагентНаименование = ""Вася"")";
Запрос адресуется к таблице ПланыОбмена.<ИмяПланаОбмена>. Платформа выполнит этот запрос и зарегистрирует объект только на тех узлах, которые будут возвращены выборкой.
Выясним, как поступить в ситуациях, когда бизнес-логика регистрации слишком сложна для реализации в ПРО. В этом случае логику выносят в программный код конфигурации 1С.
Отказ = Истина;).ПриЗаписи).
Для Каждого УзелИзСписка Из СписокУзлов Цикл
Если УзелИзСписка.МойФлажок И Объект.Контрагент.Наименование = "Вася" Тогда
ПланыОбмена.ЗарегистрироватьИзменения(УзелИзСписка, Объект);
КонецЕсли;
КонецЦикла;
Если системы-приемники кардинально отличаются по бизнес-логике, проанализируем архитектурные альтернативы:
ВыполнитьПравилаРегистрацииДляОбъекта модуля ОбменДаннымиСобытия. Через расширение конфигурации можно перехватить и отфильтровать массив узлов-получателей перед вызовом платформенных механизмов.