Часто в практике автоматизации возникает ситуация, когда несколько филиалов или подразделений долгое время работали в независимых базах с идентичной конфигурацией. Со временем встает задача объединить их в единую сеть Распределенной Информационной Базы (РИБ), чтобы централизованно управлять изменениями кода и консолидировать данные. Однако стандартный механизм создания образа подчиненного узла в 1С предполагает создание новой, пустой базы. Разберем подробно, как связать уже наполненные базы в единую схему РИБ и настроить передачу конфигурации.
Перед тем как приступать к программным манипуляциям, нам необходимо убедиться, что конфигурации в базах действительно идентичны. Для этого выполним сравнение и объединение конфигураций, используя файл .cf из предполагаемой «Главной» базы. Даже если визуально объекты одинаковы, малейшее расхождение в метаданных может заблокировать обмен.
Проанализируем структуру данных. В существующих базах одни и те же элементы справочников (например, «Валюты», «Единицы измерения», «Ставки НДС») наверняка имеют разные уникальные идентификаторы (UUID). Если мы просто включим обмен, система создаст дубликаты. Поэтому на подготовительном этапе крайне важно:
Поскольку у нас нет возможности создать образ из уже существующей базы штатными средствами, мы воспользуемся программным методом. В 1С:Предприятии для превращения обычной базы в периферийную используется метод УстановитьГлавныйУзел. Рассмотрим последовательность действий:
В главной базе создадим узел в плане обмена (например, с кодом «ПБ1»). В самой же периферийной базе нам нужно выполнить следующий код:
// Определим узел, который станет главным
УзелГлавнойБазы = ПланыОбмена.РИБ.НайтиПоКоду("ЦБ");
// Установим связь
ПланыОбмена.УстановитьГлавныйУзел(УзелГлавнойБазы);
После выполнения этой команды база начнет считать себя подчиненным узлом и при обмене будет ожидать сообщения, содержащие изменения конфигурации. Важно: коды узлов в обеих базах должны зеркально совпадать.
Рассмотрим ситуацию, когда нам нужно, чтобы через механизм РИБ передавались только изменения метаданных (конфигурация), а обмен данными происходил по особым правилам или был ограничен. Для этого в плане обмена, имеющем признак «Распределенная информационная база», необходимо управлять регистрацией изменений.
Чтобы мигрировала только конфигурация, мы можем программно очищать регистрацию данных при отправке или использовать обработчики в модуле плана обмена. Проанализируем пример использования параметра Игнорировать в обработчике ПриОтправкеДанныхПодчиненному:
Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента)
// Если мы хотим передавать только структуру конфигурации
// и блокировать миграцию конкретных данных:
ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать;
КонецПроцедуры
Помните, что изменения конфигурации платформа передает автоматически в заголовке сообщения обмена РИБ. Пока подчиненный узел не примет эти изменения (что требует перезапуска в режиме «Конфигуратор»), загрузка самих данных из этого же сообщения будет невозможна.
Одной из самых острых проблем при объединении существующих баз являются дубли предопределенных элементов. В версии 8.3 механизм работы с ними изменился. Рассмотрим, как избежать дублирования имён предопределенных данных.
Если в обеих базах есть элемент справочника с именем ОснСклад, но разными UUID, после начала обмена может возникнуть конфликт. Проанализируем алгоритм исправления ситуации. Нам поможет метод УстановитьДанныеЗаполненияПредопределенныхУзла. Также полезно блокировать типовые механизмы синхронизации предопределенных, если они вызывают ошибки, как показано ниже:
Процедура ЗаписатьПриоритетныеИзмененияВСообщениеОбмена(Знач ЗаписьСообщения)
ЗаписьСообщения.ЗаписьXML.ЗаписатьНачалоЭлемента("Parameters");
// Блокируем передачу предопределенных, если они уже синхронизированы вручную
Если ЗаписьСообщения.Получатель <> ПланыОбмена.ГлавныйУзел() Тогда
// Логика фильтрации приоритетных данных
КонецЕсли;
КонецПроцедуры
Разберем критически важный технический нюанс: счетчики номеров сообщений. При создании РИБ «на лету» номера в главной и подчиненной базах не совпадают, что приведет к ошибке «Номер сообщения меньше или равен номеру последнего принятого».
Выясним, как это исправить. Перед совершением первого обмена необходимо вручную выровнять номера в обеих базах через встроенный язык:
УзелОбъекта = СсылкаНаУзел.ПолучитьОбъект();
УзелОбъекта.НомерОтправленного = 0;
УзелОбъекта.НомерПринятого = 0;
УзелОбъекта.Записать();
Если создание полноценного РИБ кажется избыточным или слишком рискованным из-за большого объема накопленных данных, рассмотрим альтернативу. Можно использовать пакетный режим запуска конфигуратора для автоматизации обновления конфигурации.
Посмотрим на логику процесса:
.cf файл.1cv8.exe /UpdateCfg "путь_к_файлу.cf".Этот метод позволяет имитировать поведение РИБ в части обновления кода, сохраняя при этом гибкость обычного обмена через Конвертацию данных для передачи документов и справочников.
Подводя итог, отметим, что создание РИБ на существующих базах — задача трудоемкая, требующая тщательной очистки НСИ и контроля UUID. Однако при правильном использовании метода УстановитьГлавныйУзел и грамотной настройке планов обмена, такая архитектура становится стабильным решением для управления распределенной системой.