При работе с распределенными информационными базами (РИБ) администраторы и разработчики 1С часто сталкиваются с крайне неприятной ошибкой: «Конфигурация узла распределенной ИБ не соответствует ожидаемой!». Эта проблема блокирует обмен данными между центральной базой (ЦБ) и периферийной базой (ПБ). Как правило, сбой происходит после очередного обновления конфигурации в главном узле. Главная опасность здесь заключается в том, что в периферийной базе за время с момента последнего успешного обмена могли накопиться десятки или сотни документов, созданных пользователями. Простое пересоздание подчиненного узла из центрального решит техническую проблему, но приведет к безвозвратной потере этих данных.
В этой статье мы подробно разберем, почему возникает данная ошибка, и рассмотрим пять практических методов ее устранения — от простых манипуляций со структурой метаданных до «шаманских» способов исправления конфигурационных файлов обмена.
Прежде чем переходить к лечению, давайте проанализируем ситуацию и выясним первопричину сбоя. Платформа 1С:Предприятие при каждом сеансе обмена проверяет идентичность конфигураций в ЦБ и ПБ. Для этого используются специальные уникальные идентификаторы — хэш-суммы (коды конфигурации). Если коды различаются хотя бы на один символ, платформа блокирует обмен во избежание повреждения структуры данных.
Основные причины рассинхронизации:
.cf) в ПБ было выполнено простое сравнение и объединение конфигураций, внутренние идентификаторы (IDs) объектов метаданных могли разойтись.Рассмотрим подробнее каждый из пяти проверенных способов решения этой проблемы.
Этот метод незаменим, когда конфигурации в ЦБ и ПБ фактически абсолютно идентичны (вы уже пробовали накатывать один и тот же cf-файл), но платформа упорно отказывается проводить обмен из-за несовпадения внутренних хэшей. Мы можем «обмануть» систему проверки, вручную отредактировав XML-файл обмена.
Разберем этот процесс по шагам:
<v8de:Config>. Внутри этого блока вы увидите параметры <v8de:Digest1> и <v8de:Digest2> (в некоторых версиях платформы они могут выглядеть как атрибуты v1="..." и v2="..."). Это и есть те самые проверочные хэш-суммы.Digest1 в файле периферийной базы чаще всего состоит из одних нулей — это нормально. Нас интересует значение Digest2.<v8de:Digest2> файла ПБ и вставьте ее вместо значения в аналогичном теге в файле ЦБ. Тем самым мы принудительно сообщаем принимающей стороне (ПБ), что к ней идет файл конфигурации, полностью соответствующий ее ожиданиям.Иногда периферийная база «застревает» в промежуточном состоянии: она видит, что файл обмена пришел, но кнопка «Обновить конфигурацию базы данных» (F7) в конфигураторе ПБ остается неактивной, так как платформа считает, что физическая структура таблиц базы данных не менялась. В таком случае нам нужно заставить платформу выполнить полноценную реструктуризацию таблиц.
Выполним следующие действия:
ФиктивныйОбъектДляРеструктуризации или новый реквизит в каком-нибудь справочнике, который гарантированно мигрирует во все узлы РИБ.Если обычное накладывание исправного файла конфигурации (.cf) на периферийную базу не помогает, это означает, что база некорректно ассоциирует себя со своим главным узлом. В таком случае поможет только временное «отвязывание» базы от РИБ, полная перезапись конфигурации и последующее восстановление связи.
Рассмотрим по шагам этот надежный алгоритм:
// Отключаем периферийную базу от главного узла РИБ
ПланыОбмена.УстановитьГлавныйУзел(Неопределено);
Альтернативный вариант отключения — запуск конфигуратора периферийной базы из командной строки операционной системы со специальным ключом:
1cv8.exe DESIGNER /F "ПутьКВашейБазе" /ResetMasterNode
.cf)..cf из ЦБ.
// Восстанавливаем связь с центральным узлом
ГлавныйУзел = ПланыОбмена.НайтиПоКоду("КодЦБ"); // Укажите реальный код центрального узла
Если Не ГлавныйУзел.Пустая() Тогда
ПланыОбмена.УстановитьГлавныйУзел(ГлавныйУзел);
Сообщить("Связь с главным узлом успешно восстановлена!");
Иначе
Сообщить("Внимание! Узел с указанным кодом не найден.");
EndIf;
Бывают ситуации, когда конфигурационный файл .cf, выгружаемый из центральной базы, уже несет в себе «мусор» — остатки прошлых неудачных динамических обновлений, которые хранятся во внутренних таблицах конфигурации. При переносе такого файла в ПБ ошибка дублируется.
Для исправления этой ситуации применим метод транзитной очистки конфигурации:
.cf, выгруженный из вашей рабочей ЦБ..cf.Если ваши информационные базы работают в клиент-серверном режиме под управлением MS SQL Server или PostgreSQL, то корень проблемы часто кроется непосредственно в таблицах базы данных SQL, где хранятся версии конфигурации.
Проанализируем структуру таблиц СУБД. В базах данных 1С за хранение конфигурации отвечают таблицы Config (основная конфигурация) и ConfigSave (содержит данные конфигуратора, которые еще не были применены к базе данных). При некорректном динамическом обновлении в таблице ConfigSave могут остаться зависшие временные записи, которые блокируют корректное применение обновлений.
Важно: любые манипуляции на уровне SQL-запросов можно выполнять только после создания полной резервной копии базы данных (бэкапа) и при полной уверенности в своих действиях!
Для исправления ситуации выполните следующие действия на сервере СУБД:
-- Очищаем таблицу временных сохранений конфигуратора
DELETE FROM [ИмяВашейБазыДанных].[dbo].[ConfigSave];
Очистка таблицы ConfigSave сбросит зависшие сессии конфигуратора, не затрагивая при этом рабочие данные пользователей. После запуска сервера приложений и конфигуратора 1С платформа заново сгенерирует необходимые индексы, и обновление конфигурации на узле применится в штатном режиме.
Для файловых баз данных аналогичную низкоуровневую проверку структуры таблиц файла .1CD можно провести с помощью специализированных утилит (например, Tool_1CD), однако этот метод требует глубокого понимания бинарной структуры файлов баз данных 1С и должен использоваться только в самых крайних случаях.
Мы подробно изучили причины возникновения ошибки несоответствия конфигурации распределенной ИБ и рассмотрели эффективные методы борьбы с ней. Помните: чтобы минимизировать риски возникновения подобных сбоев в будущем, настоятельно рекомендуется полностью отказаться от практики динамического обновления конфигурации («обновления на лету») в центральной базе, если вы используете механизмы распределенных баз данных (РИБ). Выполняйте все обновления конфигурации строго монопольно, предварительно выгнав пользователей и создав резервные копии баз данных.