В распределенных информационных базах (РИБ) при выполнении обмена данными часто возникает критическая ошибка: «Конфигурация узла не соответствует ожидаемой». В результате синхронизация полностью блокируется, и периферийный узел не может ни отправить, ни принять данные.
Разберем природу этой ошибки, выясним ключевые причины ее возникновения и рассмотрим по шагам проверенные способы восстановления работоспособности обмена.
Почему возникает ошибка несоответствия конфигурации
Проанализируем механизм контроля структуры в РИБ. При формировании сообщения обмена центральный узел помещает в заголовок специальную контрольную сумму конфигурации — хэш-код (Digest). Принимающая база при чтении сообщения сверяет этот хэш со своей текущей конфигурацией. Если хэши не совпадают, платформа прекращает загрузку сообщения.
К расхождению контрольных сумм обычно приводят следующие факторы:
Динамическое обновление конфигурации в главном узле. Это наиболее частая причина. При динамическом обновлении во внутренних таблицах базы могут сохраняться промежуточные состояния метаданных, нарушающие расчет контрольной суммы для РИБ.
Пропущен шаг обновления конфигурации базы данных. После загрузки файла .cf в подчиненном узле не была выполнена реструктуризация (нажатие клавиши F7 или принятие изменений структуры).
Сбой при передаче пакета с обновлением конфигурации. Если пакет изменений метаданных был передан некорректно, в таблицах регистрации изменений зависает признак старой версии.
Различие версий платформы или установленных патчей. В редких случаях разный релиз платформы «1С:Предприятие» на серверах центра и узла может по-разному формировать контрольные суммы метаданных.
Способ 1. Штатный цикл передачи изменений через Конфигуратор
Рассмотрим базовый сценарий обновления подчиненного узла, который часто нарушается пользователями:
В центральной информационной базе формируем и выгружаем стандартное сообщение обмена.
В периферийной базе в режиме «1С:Предприятие» запускаем обмен и считываем файл. В этот момент платформа загружает изменения структуры во временные таблицы конфигурации и выдает системное предупреждение о необходимости перезапуска в режиме Конфигуратора.
Закрываем режим «1С:Предприятие» в подчиненном узле и открываем Конфигуратор.
Выполняем обновление конфигурации базы данных (нажимаем клавишу F7 или выбираем пункт меню Конфигурация — Обновить конфигурацию базы данных) и подтверждаем реструктуризацию таблиц.
Снова запускаем подчиненный узел в режиме «1С:Предприятие» и формируем ответное сообщение обмена.
Загружаем полученное ответное сообщение в центральной базе, чтобы зафиксировать успешное принятие новой структуры метаданных узлом-приемником.
Способ 2. Выравнивание конфигураций через отключение главного узла
Если штатный цикл заблокирован ошибкой, разберем методику полной ручной синхронизации структуры метаданных через выгрузку файла конфигурации (.cf).
Важное правило: после загрузки .cf в периферийную базу обязательно нужно применить изменения к базе данных до того, как база снова будет привязана к главному узлу.
В центральной базе открываем Конфигуратор и сохраняем эталонную конфигурацию в файл: Конфигурация — Сохранить конфигурацию в файл (получаем файл 1Cv8.cf).
В подчиненной базе программно или через параметры запуска отключаем главный узел. В Конфигураторе для этого можно использовать ключ командной строки /ResetMasterNode, либо выполнить в режиме предприятия следующий код:
ПланыОбмена.УстановитьГлавныйУзел(Неопределено);
В подчиненном узле открываем Конфигуратор и загружаем конфигурацию из файла: Конфигурация — Загрузить конфигурацию из файла (выбираем ранее сохраненный 1Cv8.cf).
Обязательный шаг: нажимаем клавишу F7 и применяем изменения структуры к базе данных. Дожидаемся завершения реструктуризации.
После успешного обновления конфигурации базы данных восстанавливаем привязку к главному узлу. Для этого выполняем код:
// Находим ссылку на главный узел в плане обмена
УзелГлавный = ПланыОбмена.Полный.НайтиПоКоду("ЦБ"); // укажите код центрального узла
Если ЗначениеЗаполнено(УзелГлавный) Тогда
ПланыОбмена.УстановитьГлавныйУзел(УзелГлавный);
КонецЕсли;
Запускаем сеанс «1С:Предприятие» и повторяем обмен данными.
Способ 3. Очистка блока Digest в XML-файле обмена
Если конфигурации в обеих базах гарантированно идентичны, но узел блокирует загрузку из-за расхождения хэш-сумм, проанализируем способ ручной корректировки XML-сообщения.
Формируем файл обмена в центральной базе.
Открываем полученный XML-файл в текстовом редакторе (для больших файлов рекомендуется использовать редакторы, поддерживающие работу с большими объемами данных в памяти).
Находим в заголовке сообщения тег <Digest>, содержащий строку контрольной суммы конфигурации.
Очищаем значение внутри тега, сделав его пустым: <Digest></Digest>.
Сохраняем файл и выполняем его загрузку в периферийной базе. Платформа загрузит данные без проверки соответствия контрольных сумм.
Способ 4. Очистка регистрации изменений конфигурации
Если центральная база продолжает отправлять устаревшие изменения структуры, которых фактически нет, очистим регистрацию метаданных для узла с помощью программного кода:
УзелОбмена = ПланыОбмена.Полный.НайтиПоКоду("УРБД1");
Если ЗначениеЗаполнено(УзелОбмена) Тогда
// Удаляем зависшую регистрацию изменений для всего узла
ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена);
КонецЕсли;
После удаления регистрации изменений создаем новый файл обмена, содержащий только оперативные данные, и успешно загружаем его в подчиненную базу.