Как организовать РИБ на уже существующих базах и настроить передачу изменений конфигурации?

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

Часто в практике автоматизации возникает ситуация, когда несколько филиалов или подразделений долгое время работали в независимых базах с идентичной конфигурацией. Со временем встает задача объединить их в единую сеть Распределенной Информационной Базы (РИБ), чтобы централизованно управлять изменениями кода и консолидировать данные. Однако стандартный механизм создания образа подчиненного узла в 1С предполагает создание новой, пустой базы. Разберем подробно, как связать уже наполненные базы в единую схему РИБ и настроить передачу конфигурации.

Анализ исходного состояния и подготовка конфигураций

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

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

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

Программное установление связи через главный узел

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

В главной базе создадим узел в плане обмена (например, с кодом «ПБ1»). В самой же периферийной базе нам нужно выполнить следующий код:


// Определим узел, который станет главным
УзелГлавнойБазы = ПланыОбмена.РИБ.НайтиПоКоду("ЦБ"); 

// Установим связь
ПланыОбмена.УстановитьГлавныйУзел(УзелГлавнойБазы);

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

Настройка обмена только для конфигурации

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

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


Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента)
    // Если мы хотим передавать только структуру конфигурации
    // и блокировать миграцию конкретных данных:
    ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать;
КонецПроцедуры

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

Решение проблемы предопределенных данных

Одной из самых острых проблем при объединении существующих баз являются дубли предопределенных элементов. В версии 8.3 механизм работы с ними изменился. Рассмотрим, как избежать дублирования имён предопределенных данных.

Если в обеих базах есть элемент справочника с именем ОснСклад, но разными UUID, после начала обмена может возникнуть конфликт. Проанализируем алгоритм исправления ситуации. Нам поможет метод УстановитьДанныеЗаполненияПредопределенныхУзла. Также полезно блокировать типовые механизмы синхронизации предопределенных, если они вызывают ошибки, как показано ниже:


Процедура ЗаписатьПриоритетныеИзмененияВСообщениеОбмена(Знач ЗаписьСообщения)
    ЗаписьСообщения.ЗаписьXML.ЗаписатьНачалоЭлемента("Parameters");
    
    // Блокируем передачу предопределенных, если они уже синхронизированы вручную
    Если ЗаписьСообщения.Получатель <> ПланыОбмена.ГлавныйУзел() Тогда
        // Логика фильтрации приоритетных данных
    КонецЕсли;
КонецПроцедуры

Синхронизация номеров сообщений

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

Выясним, как это исправить. Перед совершением первого обмена необходимо вручную выровнять номера в обеих базах через встроенный язык:


УзелОбъекта = СсылкаНаУзел.ПолучитьОбъект();
УзелОбъекта.НомерОтправленного = 0;
УзелОбъекта.НомерПринятого = 0;
УзелОбъекта.Записать();

Альтернативный подход: Пакетное обновление

Если создание полноценного РИБ кажется избыточным или слишком рискованным из-за большого объема накопленных данных, рассмотрим альтернативу. Можно использовать пакетный режим запуска конфигуратора для автоматизации обновления конфигурации.

Посмотрим на логику процесса:

  1. Из главной базы регламентным заданием выгружается .cf файл.
  2. Файл передается в филиал (через FTP, облако или почту).
  3. В филиале запускается скрипт, инициирующий обновление: 1cv8.exe /UpdateCfg "путь_к_файлу.cf".

Этот метод позволяет имитировать поведение РИБ в части обновления кода, сохраняя при этом гибкость обычного обмена через Конвертацию данных для передачи документов и справочников.

Подводя итог, отметим, что создание РИБ на существующих базах — задача трудоемкая, требующая тщательной очистки НСИ и контроля UUID. Однако при правильном использовании метода УстановитьГлавныйУзел и грамотной настройке планов обмена, такая архитектура становится стабильным решением для управления распределенной системой.

← На главную