При переводе конфигураций на новые редакции (например, при переходе с «1С:Бухгалтерия предприятия 2.0» на ред. 3.0) нередко возникает задача объединить две исторически раздельные информационные базы в распределенную информационную базу (РИБ). Типичный пример — наличие управленческой и регламентированной баз, между которыми ранее работал периодический перенос документов. Попробуем разобраться, возможно ли связать такие базы в РИБ без создания нового начального узла с нуля, с какими подводными камнями придется столкнуться и какие альтернативные решения стоит рассмотреть.
Прежде чем приступать к объединению существующих баз, важно понимать фундаментальные принципы работы механизма РИБ платформы «1С:Предприятие»:
УникальныйИдентификатор). Платформа не выполняет сопоставление по коду, наименованию, ИНН или номеру документа. Если в двух базах одни и те же контрагенты или номенклатура создавались независимо или переносились сторонней обработкой без сохранения исходных УИД, при первом же обмене в обеих базах неизбежно возникнут полные дубли записей.Если решение объединить базы через РИБ принято осознанно, а риски появления дубликатов устранены предварительной синхронизацией идентификаторов, разберем порядок действий по созданию связки «Главный узел — Подчиненный узел»:
.cf) из будущей центральной базы и загружаем его в будущую подчиненную базу.В Центральной базе (ЦБ): создаем предопределенный узел «ЭтотУзел» с кодом, например, «ЦБ», и создаем второй узел для подчиненной базы с кодом «ПБ».
В Подчиненной базе (ПБ): создаем предопределенный узел «ЭтотУзел» с кодом «ПБ» и узел главного узла с кодом «ЦБ».
Для того чтобы подчиненная база перешла в режим РИБ и признала центральную базу главной, выполним следующий код во внешней обработке в подчиненной базе:
УзелЦБ = ПланыОбмена.Полный.НайтиПоКоду("ЦБ");
Если ЗначениеЗаполнено(УзелЦБ) Тогда
ПланыОбмена.УстановитьГлавныйУзел(УзелЦБ);
Сообщить("Главный узел успешно установлен.");
Иначе
ВызватьИсключение "Узел ЦБ не найден в плане обмена!";
КонецЕсли;
Чтобы исключить ошибку «Номер сообщения меньше или равен ранее принятому», программно выравниваем номера отправленных и принятых сообщений в обоих узлах перед первым запуском:
УзелОбменаОбъект = УзелОбмена.ПолучитьОбъект();
УзелОбменаОбъект.НомерОтправленного = 0;
УзелОбменаОбъект.НомерПринятого = 0;
УзелОбменаОбъект.Записать();
При первоначальной инициализации узлов платформа может зарегистрировать все существующие объекты базы данных, что приведет к созданию гигантского файла обмена и тотальной перезаписи данных. Очистим регистрацию изменений перед первым сеансом:
ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена);
Учитывая жесткие ограничения РИБ, в большинстве случаев для баз с разным составом учета (управленческий и бухгалтерский) предпочтительнее использовать другие механизмы:
Использование типового механизма синхронизации через универсальный формат позволяет производить сопоставление по бизнес-полям (ИНН, КПП, наименование, дата и номер документа). Базы остаются полностью автономными, сохраняется возможность раздельного обновления и исключается риск появления дублей при различии внутренних идентификаторов.
Создаем отдельный план обмена, у которого отключен признак «Распределенная информационная база». Это сохраняет механизм регистрации изменений через ПланыОбмена.ЗарегистрироватьИзменения, но снимает платформенный запрет на изменение метаданных в подчиненной базе и позволяет гибко управлять правилами выгрузки данных и движений регистров без жесткой привязки к структуре УИД.