При работе с распределенными информационными базами (РИБ) часто возникает ситуация, когда администраторы или разработчики на местах хотят внедрить локальные улучшения, не дожидаясь одобрения из центрального офиса. Однако архитектура РИБ накладывает жесткие ограничения на модификацию метаданных в периферийных узлах. Разберем подробно, что происходит при попытке изменить конфигурацию «на месте», почему это не работает стандартными методами и какие существуют обходные пути.
Проанализируем классический эксперимент, который часто проводят разработчики: отключение подчиненного узла от центрального, внесение изменений (например, добавление подписки на событие ПриЗаписи) и последующее подключение обратно. Результат такого эксперимента всегда одинаков — при первом же обмене, содержащем изменения метаданных из центра, все локальные правки бесследно исчезают.
Выясним причину такого поведения системы. В платформе 1С:Предприятие 8 реализован механизм полного замещения конфигурации для подчиненных узлов РИБ. Рассмотрим, как это работает по шагам:
Важный нюанс: конфигурации в РИБ должны быть идентичными. Платформа проверяет хэш-сумму (Digest) конфигурации. Если вы внесете изменения вручную, даже не дожидаясь обмена, при попытке синхронизации вы, скорее всего, столкнетесь с критической ошибкой несоответствия конфигураций, и обмен будет заблокирован до тех пор, пока подчиненный узел не примет конфигурацию центра.
Проанализируем наиболее современный и «легальный» способ внесения локальных правок — использование расширений. Расширения позволяют изменять логику работы системы, не затрагивая основную конфигурацию. Посмотрим, как они ведут себя в условиях РИБ:
Локальные расширения: Если создать расширение непосредственно в подчиненном узле, оно не будет входить в основной состав метаданных и, следовательно, не будет затерто при обновлении основной конфигурации из центра. Это идеальное место для размещения кода вывода сообщений пользователям или специфических проверок.
Однако здесь есть два важных ограничения, которые мы должны учитывать:
Если у вас есть возможность хотя бы один раз внести изменения в центральную конфигурацию, рассмотрим более надежный архитектурный подход. Вместо того чтобы пытаться «обмануть» систему обмена, внесем условие, которое будет срабатывать только в периферийных базах.
Для этого воспользуемся методом ПланыОбмена.ГлавныйУзел(). Проанализируем пример кода, который можно вставить в обработчик события в центре:
Если ПланыОбмена.ГлавныйУзел() <> Неопределено Тогда
// Данный код выполнится только в подчиненном узле РИБ
Сообщить("Внимание: Вы выполняете запись документа в филиале!");
КонецЕсли;
При таком подходе код будет существовать в обеих базах, но исполняться будет только там, где установлена связь с главным узлом. Это самый чистый способ с точки зрения поддержки системы.
Разберем ситуацию с временным отключением узла через УстановитьГлавныйУзел(Неопределено). Это действие превращает распределенную базу в обычную автономную. Посмотрим, какие сложности возникают при попытке вернуть все назад:
УстановитьГлавныйУзел(СсылкаНаУзел).Если изменить основную конфигурацию нельзя, а расширения недоступны, рассмотрим дополнительные варианты:
1. Механизм дополнительных отчетов и обработок (БСП). Если база построена на базе БСП (Библиотеки стандартных подсистем), можно добавить внешнюю обработку, которая будет подключаться к событиям системы. Эти данные хранятся в справочниках и, при определенных настройках миграции, могут существовать только в подчиненном узле.
2. SQL-триггеры (для клиент-серверных баз). Проанализируем этот метод как «экстремальный». Установка триггеров непосредственно на таблицы базы данных в MS SQL или PostgreSQL позволяет выполнять действия (например, логирование) в обход логики 1С. Важно понимать: это крайне опасный метод. Он не виден из конфигуратора, нарушает лицензионное соглашение и может привести к непредсказуемым ошибкам при обновлении структуры таблиц платформой.
Подведем итог нашему анализу ситуации с модификацией РИБ:
ГлавныйУзел(). Это обеспечит стабильность и прозрачность системы.