При создании начального образа распределенной информационной базы (РИБ) разработчики иногда сталкиваются с нештатным поведением платформы: в подчиненной базе исчезает доработанный программный код (например, процедуры в модулях менеджеров регистров или документов), либо движения документов переносятся не полностью, из-за чего не сходятся остатки. Рассмотрим подробнее, почему возникают подобные сбои и какими способами можно корректно развернуть подчиненный узел РИБ.
Проанализируем ключевые факторы, приводящие к некорректному формированию начального образа:
Config, ConfigSave, Params) могут возникнуть расхождения версий. Метод СоздатьНачальныйОбраз считывает метаданные напрямую из системных таблиц, и при нарушении целостности в образ выгружается состояние до динамических правок.Активность = Ложь) или поврежденных ссылок.Перед повторной попыткой создания начального образа необходимо полностью исключить кэширование и ошибки метаданных. Разберем шаги по устранению последствий динамических обновлений:
.cf)..cf, и применим изменения клавишей F7. Это очищает служебные таблицы от следов динамических обновлений.chdbfl.exe. Для клиент-серверного варианта проверим базу средствами СУБД (например, выполнением DBCC CHECKDB в MS SQL Server).Если штатный метод создания образа продолжает вызывать сбои или база имеет большой объем, наиболее надежным и проверенным решением является альтернативное создание узла РИБ из полной копии информационной базы. Разберем по шагам весь процесс настройки узлов.
.dt или резервную копию средствами СУБД) и разворачиваем ее как отдельную базу для подчиненного узла.
// Отключаем главный узел в базе-копии
ПланыОбмена.УстановитьГлавныйУзел(Неопределено);
// Находим центральный узел в плане обмена
УзелЦентральнойБазы = ПланыОбмена.Полный.НайтиПоКоду("ЦБ");
// Устанавливаем его в качестве главного
ПланыОбмена.УстановитьГлавныйУзел(УзелЦентральнойБазы);
// Очищаем регистрацию изменений для всех узлов плана обмена
ПланыОбмена.УдалитьРегистрациюИзменений(УзелЦентральнойБазы);
// Сбрасываем счетчики сообщений обмена в подчиненной базе
ОбъектУзла = УзелЦентральнойБазы.ПолучитьОбъект();
ОбъектУзла.НомерОтправленного = 0;
ОбъектУзла.НомерПринятого = 0;
ОбъектУзла.Записать();
// Выполняется в центральной базе для подчиненного узла
УзелПодчиненный = ПланыОбмена.Полный.НайтиПоКоду("ФИЛ1");
ПланыОбмена.УдалитьРегистрациюИзменений(УзелПодчиненный);
ОбъектУзла = УзелПодчиненный.ПолучитьОбъект();
ОбъектУзла.НомерОтправленного = 0;
ОбъектУзла.НомерПринятого = 0;
ОбъектУзла.Записать();
Такой подход полностью гарантирует идентичность метаданных, сохранение всех модулей менеджеров объектов и 100% совпадение движений по всем регистрам без потерь при инициализации обмена.