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