Как запустить обработку только на определенном подчиненном узле РИБ

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

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

Основы идентификации узлов в РИБ

Для начала вспомним, как платформа 1С понимает, в какой базе выполняется код. У каждого плана обмена есть два ключевых метода, позволяющих определить роль текущей базы в иерархии обмена. Проанализируем их:

  1. ПланыОбмена.ГлавныйУзел() — возвращает ссылку на узел, который является «вышестоящим» для текущей базы. Если этот метод возвращает Неопределено, значит, мы находимся в главном узле (центральной базе).
  2. ПланыОбмена.ИмяПланаОбмена.ЭтотУзел() — возвращает ссылку на элемент плана обмена, который представляет текущую базу в данной системе обмена.

Если задача состоит в том, чтобы просто исключить запуск в центре, мы используем проверку на наличие главного узла. Однако для запуска на конкретном подчиненном узле нам потребуется более точная идентификация.

Способ 1: Проверка по коду узла (Простой метод)

Самый быстрый и очевидный способ — сравнить код текущего узла со строковым значением кода нужного нам филиала. Рассмотрим пример кода:


ТекущийУзел = ПланыОбмена.МойПланОбмена.ЭтотУзел();

Если ТекущийУзел.Код = "ФИЛ_001" Тогда
    // Здесь размещается логика обработки
    ЗапуститьОбработку();
Иначе
    Возврат;
КонецЕсли;

Этот метод прост в реализации, но имеет существенный недостаток, который в профессиональной среде называют «хардкодом». Если пользователь в интерфейсе изменит код узла (например, с «ФИЛ_001» на «ФИЛ_01»), условие перестанет выполняться, и обработка перестанет запускаться без изменения программного кода.

Способ 2: Использование фоновых заданий

Как было предложено в обсуждении, для выполнения «тяжелых» обработок на конкретном узле целесообразно использовать механизм фоновых заданий. Это позволяет не блокировать работу пользователя. Проанализируем ситуацию: мы можем настроить регламентное задание, которое будет запускаться на всех узлах, но внутри своего кода оно будет содержать проверку, «свой» ли это узел.

Рассмотрим пример функции, вызываемой регламентным заданием:


Процедура ВыполнитьДействиеНаНужномУзле() Экспорт
    
    // Проверяем, является ли текущий узел целевым
    Если ПланыОбмена.МойПланОбмена.ЭтотУзел().Код <> "ЦелевойКод" Тогда
        Возврат;
    КонецЕсли;
    
    // Выполнение основной логики
    // ...
    
КонецПроцедуры

Способ 3: Предопределенные узлы (Для платформы 8.3)

Если ваша конфигурация позволяет вносить изменения в метаданные, наиболее надежным способом будет создание предопределенного элемента в плане обмена. Это исключает зависимость от строковых кодов. Разберем этот алгоритм по шагам:

  1. Откроем в конфигураторе нужный ПланОбмена.
  2. Перейдем на вкладку «Прочее» и нажмем кнопку «Предопределенные».
  3. Создадим элемент, например, с именем ФилиалВоронеж.
  4. В коде будем использовать сравнение ссылок, а не строк.

Посмотрим на пример кода при использовании предопределенного узла:


Если ПланыОбмена.МойПланОбмена.ЭтотУзел() = ПланыОбмена.МойПланОбмена.ФилиалВоронеж Тогда
    // Выполняем действия только в Воронежском филиале
    ВыполнитьЗагрузкуДанных();
КонецЕсли;

Преимущество: При таком подходе, даже если администратор изменит код или наименование узла в режиме «1С:Предприятие», логика программы не нарушится.

Способ 4: Использование внешних настроек (Константы или БСП)

Чтобы избежать внесения правок в код при каждом изменении структуры РИБ, можно вынести настройку «Целевой узел» в пользовательский интерфейс. Для этого проанализируем использование Константы.

Создадим константу УзелДляВыполненияОбработки с типом ссылки на ваш план обмена. Тогда на целевом узле администратор один раз выберет в этой константе значение «Этот узел», а на остальных узлах оставит ее пустой. Код станет универсальным:


СсылкаНаЦелевойУзел = Константы.УзелДляВыполненияОбработки.Получить();

Если ПланыОбмена.МойПланОбмена.ЭтотУзел() = СсылкаНаЦелевойУзел Тогда
    // Логика запуска
КонецЕсли;

Если в вашей конфигурации используется Библиотека стандартных подсистем (БСП), можно пойти еще дальше и использовать «Дополнительные сведения». Достаточно создать свойство «Выполнять обработку» (тип Булево) для элементов плана обмена. Тогда код будет просто проверять наличие этого флага у ЭтотУзел().

Способ 5: Идентификация по GUID

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


ИдентификаторЦелевогоУзла = Новый УникальныйИдентификатор("550e8400-e29b-41d4-a716-446655440000");
Если ПланыОбмена.МойПланОбмена.ЭтотУзел().УникальныйИдентификатор() = ИдентификаторЦелевогоУзла Тогда
    // Это именно тот узел, который нам нужен
КонецЕсли;

Рекомендации по безопасности и стабильности

При реализации запуска на конкретном узле важно учитывать еще один нюанс: копии баз. Часто разработчики делают копии узлов для тестирования или разработки. Если в копии базы будет запущена та же обработка, это может привести к дублированию данных или ошибкам в сторонних системах.

Чтобы этого избежать, рекомендуем дополнять проверку узла проверкой имени компьютера или строки соединения:


// Проверка узла + проверка имени сервера/компьютера
Если ПланыОбмена.МойПланОбмена.ЭтотУзел().Код = "001" 
   И ИмяКомпьютера() = "SERVER-PROD" Тогда
    // Выполняем только на «живом» сервере в нужном филиале
КонецЕсли;

Подводя итог, можно сказать, что выбор метода зависит от архитектуры вашей конфигурации. Для простых разовых задач подойдет проверка ЭтотУзел().Код, но для крупных тиражируемых систем лучше использовать предопределенные элементы или константы, что позволит избежать накопления «говнокода» и сделает систему более гибкой в администрировании.

← На главную