В процессе работы с распределенными информационными базами (РИБ) системные администраторы и программисты часто сталкиваются с ситуацией, когда после обновления центрального узла (ЦУ) конфигурация успешно уходит лишь в часть периферийных баз. При попытке повторной выгрузки файл обмена оказывается «пустым» (весит несколько килобайт вместо сотен мегабайт), так как платформа считает, что все необходимые изменения уже были отправлены. Разберем подробно механизмы, которые управляют этим процессом, и выясним, как заставить систему отправить обновление повторно.
Для начала проанализируем ситуацию: почему при первой выгрузке файл содержал конфигурацию, а при последующих — нет? Механизм РИБ на платформе 1С:Предприятие 8.3 работает по принципу регистрации изменений. Когда вы нажимаете кнопку «Обновить конфигурацию базы данных» в конфигураторе центрального узла, платформа автоматически фиксирует это событие для всех узлов, входящих в соответствующий план обмена.
Рассмотрим ключевые моменты этого процесса:
.xml. В этот же момент увеличивается номер исходящего сообщения для данного узла.Посмотрим на ситуацию со стороны системных таблиц. Платформа отслеживает соответствие версии конфигурации в ЦУ и в каждом конкретном узле. Если узел не подтвердил получение сообщения, в котором шла конфигурация, но ЦУ уже увеличил счетчик сообщений, возникает рассинхронизация статусов.
Самый корректный и «чистый» способ решить проблему — использовать встроенный метод глобального контекста ПланыОбмена.ЗарегистрироватьИзменения(). Этот метод позволяет принудительно поставить «флаг» необходимости выгрузки любого объекта метаданных, включая саму конфигурацию, для конкретного узла.
Проанализируем пример кода, который можно выполнить через внешнюю обработку или консоль кода в центральном узле:
// Выбираем узел, который не получил обновление
УзелОбмена = ПланыОбмена.ПоМагазинам.НайтиПоКоду("М001");
Если Не УзелОбмена.Пустая() Тогда
// Регистрируем изменение всей конфигурации для выбранного узла
ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, Метаданные.Конфигурация);
Сообщить("Конфигурация успешно зарегистрирована для узла: " + УзелОбмена);
КонецЕсли;
В данном примере мы используем объект Метаданные.Конфигурация в качестве второго параметра. Это дает платформе команду: «Считай, что конфигурация изменилась специально для этого узла». При следующей синхронизации файл обмена снова станет тяжелым, так как в него будет упакован cf файл изменений.
Если у вас нет под рукой консоли кода или вы опасаетесь работать с программными методами, существует проверенный временем «костыль». Суть его заключается в том, чтобы инициировать штатный механизм регистрации изменений метаданных для всех узлов сразу.
Разберем по шагам:
F7 (Обновить конфигурацию базы данных).Несмотря на простоту, этот метод крайне эффективен. Для платформы любое изменение свойств корневого объекта метаданных является сигналом к тому, что структура базы изменилась. В результате флаг регистрации обновления будет проставлен для всех узлов, включенных в РИБ. Рассмотрим минус этого способа: те магазины (узлы), которые уже успешно обновились, будут вынуждены скачать конфигурацию повторно, что может создать лишнюю нагрузку на каналы связи.
Выясним причину, по которой платформа может игнорировать изменения. Иногда это связано с тем, что номер ожидаемого сообщения на стороне РИБ и номер отправленного сообщения в ЦУ вошли в клинч. Рассмотрим вариант с обнулением номеров сообщений в плане обмена.
Важно: Этот метод следует использовать с осторожностью, так как он может привести к попытке повторной выгрузки не только конфигурации, но и больших массивов данных (документов, справочников).
В форме списка плана обмена для проблемного узла можно вручную изменить поля Номер отправленного и Номер принятого. Если установить «Номер отправленного» в значение 0, система может попытаться начать цикл обмена заново, однако в современных конфигурациях на базе БСП (Библиотека стандартных подсистем) этот механизм сильно кастомизирован и может не сработать без очистки регистров сведений, таких как СостояниеУзловИнформационныхБаз.
Рассмотрим ситуацию, описанную в сообщениях форума, когда помогает удаление базы из списка запуска и ее повторное добавление. Для файловых баз это действие очищает локальный кэш конфигурации. Для серверных баз ситуация сложнее, так как кэш хранится и на сервере приложений 1С, и на локальной машине пользователя.
Проанализируем алгоритм очистки:
%AppData%\1C\1Cv8\ и %LocalAppData%\1C\1Cv8\ на сервере и у пользователя.1C:Enterprise 8.3 Server Agent.Иногда платформа «кэширует» состояние плана обмена, и даже после регистрации изменений программным способом выгрузка не начинается. В этом случае полная очистка серверного кэша позволяет сбросить некорректные состояния системных таблиц в памяти сервера.
Чтобы избежать подобных проблем в будущем, проанализируем несколько правил гигиены при обновлении распределенных систем:
_ConfigChangeRec проставляются некорректно или не проставляются вовсе.1С:Розница 2.2 это можно отследить в мониторе синхронизации данных.Подводя итог, можно сказать, что если штатный механизм 1С дал сбой, самым быстрым и надежным решением остается программная команда ПланыОбмена.ЗарегистрироватьИзменения. Она воздействует напрямую на ядро платформы, минуя возможные ошибки в логике прикладного решения. Для автоматизации передачи изменений и их применения в узлах РИБ можно использовать регламентное задание для автоматического обновления конфигурации.