Как настроить разные правила регистрации для узлов одного плана обмена в 1С

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

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

Ограничения платформы 1С при работе с ПРО

Прежде чем переходить к решениям, проанализируем базовые ограничения платформенного механизма обмена данными:

  1. Единые правила на план обмена: Назначить отдельные файлы правил регистрации для разных узлов в рамках одного плана обмена штатно нельзя. К плану обмена прикрепляется строго один комплект ПРО.
  2. Особенности обработчика «Перед обработкой»: Данный обработчик в ПРО вызывается до того, как платформа сформирует выборку узлов-получателей. Если в нем прописать условие с вызовом Отказ = Истина;, регистрация объекта отменится сразу для всех узлов текущего плана обмена.

Способ 1. Настройка отбора по свойствам плана обмена (ПРОП)

Разберем основной штатный метод разделения логики регистрации. Для этого используются реквизиты узла плана обмена и интерактивные отборы в конфигураторе правил регистрации.

Процесс настройки включает следующие шаги:

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

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

Способ 2. Переопределение текста запроса в обработчике «При обработке»

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

В этом обработчике доступна переменная ТекстЗапроса, определяющая выборку узлов-получателей. Посмотрим, как переопределить запрос для фильтрации узлов:


// Пример модификации ТекстЗапроса в обработчике "При обработке"
ТекстЗапроса = 
"ВЫБРАТЬ
|	Узлы.Ссылка КАК Ссылка
|ИЗ
|	ПланОбмена.МойПланОбмена КАК Узлы
|ГДЕ
|	Узлы.Ссылка = &Узел
|	И (Узлы.ФильтроватьПоПартнерам = ЛОЖЬ ИЛИ &КонтрагентНаименование = ""Вася"")";

Запрос адресуется к таблице ПланыОбмена.<ИмяПланаОбмена>. Платформа выполнит этот запрос и зарегистрирует объект только на тех узлах, которые будут возвращены выборкой.

Способ 3. Программная регистрация через подписки на события

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

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

Для Каждого УзелИзСписка Из СписокУзлов Цикл
    Если УзелИзСписка.МойФлажок И Объект.Контрагент.Наименование = "Вася" Тогда
        ПланыОбмена.ЗарегистрироватьИзменения(УзелИзСписка, Объект);
    КонецЕсли;
КонецЦикла;

Способ 4. Архитектурное разделение или доработка БСП

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

← На главную