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