При работе с распределенными информационными базами (РИБ) или при обычном обмене данными между конфигурациями пользователи часто сталкиваются с критической остановкой процесса. Текст ошибки гласит: «Ошибка при вызове метода контекста (НачатьЧтение): Номер сообщения меньше или равен номеру ранее принятого сообщения». Давайте разберем, почему это происходит и как восстановить работоспособность обмена по шагам.
Для начала проанализируем ситуацию с точки зрения платформы 1С:Предприятие. В системе реализован механизм защиты от повторной загрузки данных. Каждое сообщение обмена (XML-файл) имеет в своем заголовке уникальный порядковый номер — MessageNo. В базе-приемнике, в соответствующем узле плана обмена, хранится реквизит НомерПринятого.
Когда мы инициируем загрузку, метод НачатьЧтение() объекта ЧтениеСообщенияОбмена сравнивает номер в файле с номером в базе. Если номер в файле оказывается меньше или равен тому, что уже было успешно загружено ранее, платформа блокирует операцию. Это предотвращает риск «затирания» новых данных старыми и защищает от бесконечных циклов обработки одних и тех же объектов.
Выясним причину, почему счетчики «рассинхронизировались»:
Message_001_002.xml, хотя более свежий файл с этим же именем еще не поступил.Рассмотрим самый быстрый способ исправления — принудительное изменение номера сообщения в узле плана обмена. Нам необходимо сделать так, чтобы НомерПринятого в нашей базе стал чуть меньше, чем номер сообщения, которое мы пытаемся загрузить.
Разберем по шагам, как это сделать в интерфейсе:
Номер принятого на 1 меньше, чем тот, что указан в ошибке. Либо, если мы хотим принять любое следующее сообщение, можно временно установить там 0.В современных конфигурациях на базе БСП (Библиотеки стандартных подсистем) прямой доступ к планам обмена через «Все функции» может быть ограничен. В этом случае воспользуемся обработкой «Регистрация изменений для обмена данными».
Проанализируем стратегию синхронизации номеров. В идеальной ситуации должна соблюдаться логика:
НомерОтправленного = В Базе Б: НомерПринятого.НомерОтправленного = В Базе А: НомерПринятого.Если вы видите, что База А отправила сообщение №100, а База Б упорно считает, что она уже приняла №100 (хотя данные не загрузились), просто уменьшите в Базе Б НомерПринятого до 99.
Если интерфейсные методы недоступны или вы предпочитаете работать через консоль кода, можно выполнить короткий скрипт. Посмотрим на пример кода, который принудительно устанавливает нужный номер для конкретного узла:
// Определим имя плана обмена и код узла
ИмяПланаОбмена = "СинхронизацияДанныхЧерезПочту";
КодУзла = "ПБ"; // Код периферийной базы
УзелОбъект = ПланыОбмена[ИмяПланаОбмена].НайтиПоКоду(КодУзла).ПолучитьОбъект();
Если УзелОбъект <> Неопределено Тогда
// Устанавливаем номер, который на 1 меньше ожидаемого файла
УзелОбъект.НомерПринятого = 50;
УзелОбъект.Записать();
Сообщить("Номер принятого сообщения успешно изменен!");
КонецЕсли;
Этот код напрямую обращается к метаданным и записывает изменения в базу, минуя проверки экранных форм.
Проанализируем ситуацию, упомянутую в сообщениях форума, когда ручная правка номера не помогает. Если вы уменьшили номер, синхронизация прошла, но данных нет, а при следующем запуске ошибка повторяется — проверьте транспорт (папку обмена или почтовый ящик).
Рекомендации по проверке транспорта:
Таким образом, мы выяснили, что ошибка «Номер сообщения меньше или равен...» — это не поломка базы, а штатное срабатывание защиты платформы. В большинстве случаев она лечится простой корректировкой счетчика в узле плана обмена или наведением порядка в каталогах передачи файлов.