При работе с распределенными информационными базами (РИБ) в решениях на платформе 1С:Предприятие 8.3 (например, в конфигурации «Управление торговлей 11») администраторы и разработчики часто сталкиваются с неприятной ситуацией. Обмен между базами блокируется, а в журнале регистрации или при ручной загрузке файла обмена в Центральную Базу (ЦБ) возникает критическая ошибка:
«Ошибка чтения файла сообщения обмена... Данные принимаются от узла, для которого зарегистрированы изменения конфигурации. Необходимо произвести перенос изменений конфигурации в узел».
При этом стандартные действия — выгрузка изменений из Центральной базы, их загрузка в Периферийную базу (ПБ), обновление конфигурации ПБ в режиме Конфигуратора и последующая обратная выгрузка — не приносят желаемого результата. ЦБ по-прежнему наотрез отказывается принимать пакет данных от подчиненного узла. В этой статье мы подробно разберем, почему возникает эта ошибка, как устроены внутренние механизмы контроля конфигураций в 1С и какими способами можно оперативно восстановить обмен.
Для того чтобы понять природу этой ошибки, нам необходимо проанализировать, как именно платформа 1С контролирует идентичность конфигураций в распределенной системе. Платформа блокирует чтение любых изменений данных (документов, справочников, регистров) от периферийного узла, если в центральном узле для этого конкретного подчиненного узла зарегистрировано изменение конфигурации.
Делается это в целях безопасности: если метаданные баз различаются, корректно сопоставить и записать данные физически невозможно, что может привести к разрушению целостности базы данных. Однако часто возникает ситуация, когда конфигурации физически уже абсолютно идентичны, но система считает иначе.
В отличие от обычных данных, изменения конфигурации регистрируются в специальной системной таблице СУБД. Обратите внимание, что к этой таблице нет доступа через встроенный язык 1С. Популярный метод ПланыОбмена.УдалитьРегистрациюИзменений() здесь абсолютно бессилен, так как он предназначен только для работы с зарегистрированными объектами данных (справочниками, документами и т.д.).
В клиент-серверном варианте работы базы данных эта таблица называется _ConfigChngRec. В ней хранятся записи о зарегистрированных изменениях конфигурации для каждого подчиненного узла РИБ. Пока в этой таблице присутствует хотя бы одна запись для целевого подчиненного узла, центральная база будет требовать сначала передать изменения в ПБ и применить их там.
Проанализируем заголовок файла сообщения обмена, который формируют базы. Если открыть файл обмена (XML) в текстовом редакторе, мы увидим следующие ключевые параметры в блоке заголовка:
Digest1 или Digest2 (например, d41d8cd98f00b204e9800998ecf8427e) — это контрольная сумма схемы метаданных. Если метаданные в обеих базах совпадают (что подтверждается сравнением конфигураций), этот хэш будет одинаковым.v2 — это уникальный идентификатор (UUID) конкретного поколения сборки конфигурации базы данных. Этот параметр изменяется при каждом обновлении конфигурации базы данных в Конфигураторе, даже если вы просто зашли, добавили пробел в комментарий кода и нажали «Обновить конфигурацию базы данных» (F7).Extensions — отражает контрольную сумму подключенных расширений конфигурации.Различие в значениях параметра v2 (например, в ЦБ указано 0f6e26b75bc66a05cdcfe4c397d75f62, а в ПБ — e24e0c39fcae7c07fb4079a25b228918) сообщает платформе, что базы находятся на разных «жизненных этапах» развития конфигурации. Чаще всего это происходит из-за так называемого динамического обновления (когда конфигурация обновляется без завершения работы пользователей). Платформа фиксирует «демоническое» обновление конфигурации, кэш на сервере обновляется некорректно, поколения сборки расходятся, и обмен блокируется.
Ниже рассмотрим несколько эффективных способов решения данной проблемы — от самых простых и безопасных до продвинутых инженерных методов.
Если ваша центральная база работает в клиент-серверном режиме под управлением СУБД (MS SQL Server, PostgreSQL и др.), это самый быстрый, надежный и чистый способ решения проблемы. Мы просто удалим записи о регистрации изменений конфигурации напрямую из СУБД.
Выполним следующие шаги:
-- Вариант 1. Очистить регистрацию конфигураций для ВСЕХ узлов РИБ сразу:
TRUNCATE TABLE _ConfigChngRec;
Если в вашей системе зарегистрировано много периферийных узлов и вы хотите сбросить регистрацию только для одного конкретного «проблемного» узла, воспользуемся вторым вариантом запроса:
-- Вариант 2. Очистить регистрацию только для определенного узла:
DELETE FROM _ConfigChngRec WHERE NodeID = [Идентификатор_Узла_ПБ];
Где [Идентификатор_Узла_ПБ] — это внутренний уникальный идентификатор узла периферийной базы в СУБД. После успешного выполнения этого запроса Центральная база моментально «забудет» о том, что для ПБ регистрировались какие-либо изменения конфигурации, и успешно загрузит файл обмена от ПБ при первом же сеансе.
Если у вас нет прямого доступа к СУБД или центральная база является файловой, предыдущий способ применить не получится. В таком случае мы можем стереть историю конфигурационных расхождений путем пересоздания узла обмена в ЦБ.
Разберем этот процесс по шагам:
После этого запустим обмен. Проблема будет полностью решена, так как все устаревшие системные записи регистрации конфигурации были удалены вместе со старым узлом.
Иногда специалисты пытаются вручную изменить параметры хэша и UUID конфигурации в XML-файле, но при загрузке сталкиваются с ошибкой «Искажены изменения конфигурации!». Это происходит из-за того, что в заголовке сообщения от ЦБ содержатся не только строковые хэши, но и сжатые бинарные файлы самого обновления метаданных, если они были выгружены.
Чтобы сделать корректную «заглушку» через ручную правку XML-файла и обмануть систему, выполним следующие действия:
<v8de:Config>. Нам необходимо вручную привести параметры v2 и Extensions в полное соответствие с тем, что ожидает Центральная база. Для этого откроем последний XML-файл, выгруженный ранее из ЦБ.<v8de:Config> со всеми вложенными свойствами и хэшами из файла ЦБ и заменим им аналогичный блок в заголовке файла обмена, подготовленного для загрузки в ЦБ.При чтении такого файла Центральная база решит, что периферийная база уже успешно применила нужное обновление, имеет идентичное актуальное поколение сборки конфигурации (UUID) и безболезненно снимет блокировку обмена.
Динамическое обновление конфигурации в ЦБ — это главный источник рассинхронизации РИБ. Кэш базы данных на сервере приложений часто продолжает отдавать старую версию метаданных фоновым заданиям обмена, в то время как пользователи уже работают на новой версии. Чтобы гарантированно исправить последствия динамического обновления без создания новой пустой базы, выполним следующую последовательность действий:
Этот процесс принудительно перезапишет таблицы метаданных в СУБД, сбросит старый кэш платформы и установит единый актуальный идентификатор версии сборки конфигурации (v2) для всех последующих сеансов обмена.
Бывают ситуации, когда даже после монопольного обновления конфигурации платформа продолжает отправлять неверные хэши из-за зависшего локального кэша сервера приложений. В этом случае выполним очистку серверного кэша:
C:\Program Files\1cv8\srvinfo\reg_1541\).snccg и config.После очистки серверного кэша и выполнения штатного цикла обмена (ЦБ -> ПБ -> ЦБ) базы данных успешно синхронизируются без возникновения ошибок метаданных. Для регулярной процедуры можно использовать скрипт для автоматической очистки серверного кэша 1С.
Для того чтобы минимизировать риск повторного возникновения подобных ошибок в распределенных базах данных, мы рекомендуем придерживаться нескольких простых правил: