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