Можно ли изменять конфигурацию в подчиненном узле РИБ и как сохранить доработки при обмене

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

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

Эксперимент и механизм замещения конфигурации

Проанализируем классический эксперимент, который часто проводят разработчики: отключение подчиненного узла от центрального, внесение изменений (например, добавление подписки на событие ПриЗаписи) и последующее подключение обратно. Результат такого эксперимента всегда одинаков — при первом же обмене, содержащем изменения метаданных из центра, все локальные правки бесследно исчезают.

Выясним причину такого поведения системы. В платформе 1С:Предприятие 8 реализован механизм полного замещения конфигурации для подчиненных узлов РИБ. Рассмотрим, как это работает по шагам:

  1. При изменении конфигурации в центральном узле формируется файл обновления, который помещается в пакет обмена.
  2. Подчиненный узел при загрузке данных обнаруживает изменения метаданных.
  3. Платформа не пытается выполнить объединение конфигураций (как это происходит в конфигураторе при сравнении/объединении). Вместо этого она приводит структуру метаданных подчиненной базы в полное соответствие с файлом, пришедшим из центра.
  4. Все объекты, которые отсутствуют в центральной конфигурации, но были добавлены локально, удаляются.

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

Использование расширений конфигурации — наиболее стабильный путь

Проанализируем наиболее современный и «легальный» способ внесения локальных правок — использование расширений. Расширения позволяют изменять логику работы системы, не затрагивая основную конфигурацию. Посмотрим, как они ведут себя в условиях РИБ:

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

Однако здесь есть два важных ограничения, которые мы должны учитывать:

Программная проверка узла в коде центральной конфигурации

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

Для этого воспользуемся методом ПланыОбмена.ГлавныйУзел(). Проанализируем пример кода, который можно вставить в обработчик события в центре:


Если ПланыОбмена.ГлавныйУзел() <> Неопределено Тогда
    // Данный код выполнится только в подчиненном узле РИБ
    Сообщить("Внимание: Вы выполняете запись документа в филиале!");
КонецЕсли;

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

Технический статус «Главного узла» и риски его изменения

Разберем ситуацию с временным отключением узла через УстановитьГлавныйУзел(Неопределено). Это действие превращает распределенную базу в обычную автономную. Посмотрим, какие сложности возникают при попытке вернуть все назад:

  1. Для восстановления связи необходимо снова вызвать УстановитьГлавныйУзел(СсылкаНаУзел).
  2. База должна иметь тот же внутренний идентификатор (GUID) и ту же версию метаданных, что и в центре.
  3. Если за время «автономности» в центре изменились метаданные, при первом подключении платформа зафиксирует конфликт и потребует принять изменения, что снова приведет к удалению ваших локальных доработок в основной конфигурации.

Альтернативные методы: Внешние обработки и SQL-триггеры

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

1. Механизм дополнительных отчетов и обработок (БСП). Если база построена на базе БСП (Библиотеки стандартных подсистем), можно добавить внешнюю обработку, которая будет подключаться к событиям системы. Эти данные хранятся в справочниках и, при определенных настройках миграции, могут существовать только в подчиненном узле.

2. SQL-триггеры (для клиент-серверных баз). Проанализируем этот метод как «экстремальный». Установка триггеров непосредственно на таблицы базы данных в MS SQL или PostgreSQL позволяет выполнять действия (например, логирование) в обход логики 1С. Важно понимать: это крайне опасный метод. Он не виден из конфигуратора, нарушает лицензионное соглашение и может привести к непредсказуемым ошибкам при обновлении структуры таблиц платформой.

Резюме и рекомендации

Подведем итог нашему анализу ситуации с модификацией РИБ:

← На главную