Работа с распределенными информационными базами (РИБ) — это всегда ответственность за целостность данных и непрерывность обмена. Одной из наиболее распространенных технических проблем является ситуация, когда номера отправленных и принятых сообщений в главном и подчиненном узлах перестают соответствовать логике системы. Проанализируем ситуацию: в главном узле номер отправленного сообщения — 4753, а принятого — 2792. В подчиненном узле при этом отправлено 2960, а принято 4571. Такой разрыв блокирует обмен, так как система ожидает пакеты со строго определенными номерами.
Рассмотрим подробнее, почему это происходит и как правильно восстановить работоспособность обмена, используя различные методики — от радикального обнуления до ювелирной подгонки счетчиков.
Перед тем как приступать к правке, выясним причину. В нормальном состоянии обмен работает по принципу квитирования (подтверждения). Когда Главный узел отправляет сообщение №100, Подчиненный узел должен его принять и в своем ответном сообщении прислать подтверждение: «Я принял твое сообщение №100». Только после этого Главный узел удаляет регистрацию изменений для объектов, вошедших в это сообщение.
Основные причины сбоя:
Проанализируем самый простой и быстрый способ, который часто советуют на технических форумах. Он заключается в установке нулевых значений во всех четырех полях (отправленные и принятые в обоих узлах).
Алгоритм действий:
Номер отправленного = 0 и Номер принятого = 0.Номер отправленного = 0 и Номер принятого = 0.Важное предостережение: Посмотрим на риски. При обнулении номеров система может повторно отправить все зарегистрированные изменения. Если в базах накопилось много изменений, первый обмен после обнуления может быть очень долгим и породить конфликты версий объектов. Мы рекомендуем использовать этот метод только в крайнем случае, когда логическая последовательность полностью утеряна.
Этот метод более изящный и безопасный. Мы не сбрасываем историю в ноль, а «подсказываем» базам, какие сообщения на самом деле являются актуальными. Проанализируем ситуацию из примера автора:
Разберем по шагам, как выровнять эти значения:
Номер принятого = 2960 (или 2959, чтобы наверняка подхватить последние данные).Номер принятого = 4753 (или 4752).Таким образом, мы восстанавливаем логическую цепочку без радикальной очистки истории.
В современных конфигурациях на базе БСП (Библиотеки стандартных подсистем) нет необходимости писать код для смены номеров. Рассмотрим, как это сделать штатными средствами:
Регистрация изменений для обмена (её можно найти через «Все функции» или в разделе «Администрирование — Синхронизация данных»).Изменить номера сообщений (или иконку «карандаш» рядом с номерами).Номер отправленного и Номер принятого.Этот способ хорош тем, что мы наглядно видим, сколько объектов зарегистрировано к отправке под текущими номерами.
Если вы столкнулись с ситуацией, когда интерфейсные методы недоступны (например, в старых конфигурациях или при повреждении интерфейса), воспользуемся программным методом. Выясним, как обратиться к плану обмена через код 1С:
// Пример для программного изменения номеров сообщений
УзелОбъекта = ПланыОбмена.ПоОрганизации.НайтиПоКоду("П01").ПолучитьОбъект();
УзелОбъекта.НомерОтправленного = 0;
УзелОбъекта.НомерПринятого = 0;
УзелОбъекта.Записать();
Помните, что данный код нужно выполнить в каждой базе (и в главной, и в подчиненной) для соответствующих узлов. Обратите внимание: при программном изменении НомерОтправленного и НомерПринятого являются реквизитами объекта плана обмена.
Иногда бывает так, что файл обмена уже сформирован, он огромный, и мы не хотим переформировывать его заново. Разберем ситуацию: подчиненный узел не принимает файл, так как ожидает номер 4572, а пришел файл с номером 4500.
Мы можем открыть XML-файл обмена в текстовом редакторе (например, Notepad++) и найти в самом начале теги MessageNo и ReceivedNo. Если вручную изменить значение MessageNo на ожидаемое базой-приемником, система может «проглотить» файл и успешно его загрузить. Однако будьте осторожны: это нарушает целостность цепочки подтверждений и должно использоваться только опытными администраторами.
Подведем итог нашему анализу. Рассинхронизация номеров в РИБ — это не приговор для базы, а штатная проблема, требующая внимания к деталям.
Следуя этим шагам, мы сможем восстановить стабильную работу распределенной системы и обеспечить актуальность данных во всех узлах сети.