При активной работе в распределенных информационных базах (РИБ) специалисты часто сталкиваются со следующей системной ошибкой при выполнении обмена данными: «Ошибка при вызове метода контекста (ПрочитатьИзменения): Конфигурация узла распределенной ИБ не соответствует ожидаемой!». Эта ошибка полностью блокирует синхронизацию между центральной (ЦБ) и подчиненной/периферийной (ПБ) базами данных.
В этой статье мы подробно разберем, почему возникает эта неполадка, проанализируем различные сценарии ее появления и изучим пошаговые методы исправления — от самых простых до продвинутых инженерных решений.
В распределенной системе 1С:Предприятие механизмы платформы строго следят за тем, чтобы структура метаданных (таблицы, реквизиты, документы, справочники) в подчиненном узле полностью соответствовала структуре в главном узле. Перед тем как применить файл обмена (содержимое XML-пакета), платформа сравнивает уникальные идентификаторы конфигураций (так называемые хэш-суммы или Digest метаданных).
Если хэш-сумма в файле обмена, пришедшем из центрального узла, отличается от хэш-суммы конфигурации подчиненного узла, система отказывается выполнять метод ПрочитатьИзменения(), выдавая ошибку несоответствия конфигурации.
Основными причинами такого расхождения являются:
Рассмотрим подробнее по шагам, как решить эту проблему с помощью различных методик.
Этот способ является классическим и наиболее надежным. Наша задача — временно заставить подчиненную базу забыть, что она является частью распределенной системы, загрузить в нее эталонный файл конфигурации (.cf) напрямую из центральной базы и затем восстановить связь.
Выполним этот процесс по шагам:
1c_main.cf.Проанализируем программный код, который отвязывает базу от РИБ. Нам потребуется вызвать метод УстановитьГлавныйУзел с параметром Неопределено:
// Код для отключения признака подчиненного узла РИБ
ПланыОбмена.УстановитьГлавныйУзел(Неопределено);
После выполнения этой команды база данных ПБ становится самостоятельной конфигурацией. Мы сможем вносить в нее изменения напрямую через Конфигуратор.
1c_main.cf.
// Восстановление связи с главным узлом
// Сначала найдем в соответствующем плане обмена наш главный узел
УзелГлавный = ПланыОбмена.УдаленныйСклад.НайтиПоКоду("ЦБ"); // укажите ваш план обмена и код центральной базы
Если ЗначениеЗаполнено(УзелГлавный) Тогда
ПланыОбмена.УстановитьГлавныйУзел(УзелГлавный);
Сообщить("Связь с главным узлом успешно восстановлена.");
Иначе
Сообщить("Не удалось найти главный узел в планах обмена!");
КонецЕсли;
После выполнения этих шагов запустите обмен данными заново. В большинстве случаев синхронизация возобновится без ошибок.
Иногда обычная выгрузка конфигурации из ЦБ не помогает, так как в основной конфигурации и конфигурации базы данных (БД) присутствуют расхождения, незаметные на первый взгляд.
В этом случае рассмотрим альтернативный подход, который упоминали опытные разработчики:
Этот метод гарантирует, что в подчиненный узел транслируется именно та структура метаданных, которая сейчас фактически работает в СУБД центрального узла, минуя возможные "зависшие" изменения в режиме разработки конфигуратора ЦБ.
Если вы проделали шаги по перезагрузке файла конфигурации, но ошибка «Конфигурация узла распределенной ИБ не соответствует ожидаемой!» продолжает появляться, обязательно обратите внимание на технические характеристики окружения.
Платформа 1С:Предприятие при подготовке пакета обмена рассчитывает хэши метаданных. Алгоритмы оптимизации и расчета контрольных сумм периодически дорабатываются разработчиками фирмы «1С» от релиза к релизу. Если, к примеру, в центральном офисе обмен выполняется на платформе версии 8.3.18.1334, а на удаленном складе установлена версия 8.3.22.1709, велика вероятность того, что хэши метаданных одного и того же .cf-файла будут рассчитаны по-разному.
Решение: приведите инфраструктуру РИБ к единому стандарту. На всех серверах и локальных компьютерах пользователей, задействованных в процессах выгрузки и загрузки обменов, должны быть установлены абсолютно идентичные релизы технологической платформы 1С.
Рассмотрим продвинутый способ решения проблемы для ситуаций, когда базы физически абсолютно идентичны, но обмен не идет из-за сбоя в регистрации хэшей. Мы можем вручную «подружить» базы, отредактировав XML-структуру сообщения обмена.
Разберем этот процесс по шагам:
Message_XX_YY.xml).
<v8de:Config xmlns:v8de="http://v8.1c.ru/8.1/data-composition-system/settings">
<v8de:Digest1>a1b2c3d4e5f6...</v8de:Digest1>
<v8de:Digest2>z9y8x7w6v5u4...</v8de:Digest2>
</v8de:Config>
<v8de:Digest1> и <v8de:Digest2> (эти уникальные строки соответствуют конфигурации вашей подчиненной базы).<v8de:Config> и замените значения тегов Digest1 и Digest2 на скопированные ранее строки из файла подчиненной базы.Часто проблема кроется в некорректном обновлении конфигурации базы данных из-за использования режима динамического обновления. При этом в СУБД в таблицах конфигурации могут скопиться некорректные временные данные.
Посмотрим, как очистить кэш платформы:
%LocalAppData%\1C\1Cv8\).C:\Program Files\1cv8\srvinfo\) и удалите временные папки сессий и кэша метаданных (такие как snccntx, файлы с расширением .pfl). После этого запустите службу сервера заново.Если очистка кэша не помогла, а при попытке создать новый узел вы сталкиваетесь с ошибкой целостности конфигурации, имеет смысл запустить встроенное тестирование.
Перейдите в Конфигуратор и выберите пункт меню Конфигурация -> Проверка конфигурации.... Установите флажки проверки логической целостности и запустите процесс. Если будут найдены ошибки, лучшим решением будет восстановить конфигурацию из архивной копии, созданной до применения динамического обновления, либо воспользоваться инструментами очистки таблиц базы данных (например, запуском утилиты chdbfl.exe для файловых баз).
Иногда конфигурации в обеих базах уже полностью идентичны, но в планах обмена зависла старая информация о том, что конфигурация изменена и требует отправки.
Чтобы решить эту проблему, выполните следующие действия в центральной базе данных:
После удаления регистрации изменений конфигурации платформа перестанет отправлять сигнатуру обновления в XML-файлах, и обмен пойдет в штатном режиме обмена только данными.
Используя приведенные выше методы последовательно, вы гарантированно восстановите работоспособность обмена в распределенной информационной базе 1С.