Восстановление номеров сообщений в планах обмена 1С:Предприятие
При выполнении обмена между узлами планов обмена возникает критическая ошибка:
Ошибка при вызове метода контекста (НачатьЧтение): Номер сообщения меньше или равен номеру ранее принятого сообщения.Номер отправленного сообщения узла не соответствует ожидаемому.- Обмен полностью останавливается, пакеты данных отклоняются базой-приемником.
- Сбой возникает после восстановления одной из баз из резервной копии (бэкапа).
1. Причина рассинхронизации счетчиков сообщений
Каждый узел плана обмена хранит два счетчика: НомерОтправленного и НомерПринятого. Если подчиненную или главную базу восстановили из бэкапа недельной давности, ее счетчики «откатываются назад», в то время как партнерский узел ожидает следующий инкрементный номер.
2. Программная корректировка номеров сообщений в узле
&НаСервере
Процедура СкорректироватьНомераСообщенийОбмена(ИмяПланаОбмена, КодУзла, НовыйНомерОтправленного, НовыйНомерПринятого)
ПланОбменаМенеджер = ПланыОбмена[ИмяПланаОбмена];
УзелОбъект = ПланОбменаМенеджер.НайтиПоКоду(КодУзла).ПолучитьОбъект();
Если УзелОбъект = Неопределено Тогда
ВызватьИсключение "Узел с указанным кодом не найден!";
КонецЕсли;
// Принудительная установка счетчиков пакетов
УзелОбъект.НомерОтправленного = НовыйНомерОтправленного;
УзелОбъект.НомерПринятого = НовыйНомерПринятого;
Попытка
УзелОбъект.Записать();
ЗаписьЖурналаРегистрации("ПланыОбмена", УровеньЖурналаРегистрации.Предупреждение,,,
СтрШаблон("Счетчики узла %1 сброшены: Отправлено=%2, Принято=%3",
КодУзла, НовыйНомерОтправленного, НовыйНомерПринятого));
Исключение
ВызватьИсключение "Ошибка записи узла: " + ОписаниеОшибки();
КонецПопытки;
КонецПроцедуры3. Полный сброс квитирования и перерегистрация изменений
Если данные рассинхронизированы, выполните полный сброс счетчиков в 0 на обоих узлах и зарегистрируйте данные заново:
&НаСервере
Процедура ПолнаяПеререгистрацияДанныхУзла(УзелСсылка)
// 1. Сброс номеров
УзелОбъект = УзелСсылка.ПолучитьОбъект();
УзелОбъект.НомерОтправленного = 0;
УзелОбъект.НомерПринятого = 0;
УзелОбъект.Записать();
// 2. Регистрация всех изменений по плану обмена
ПланыОбмена.ЗарегистрироватьИзменения(УзелСсылка);
КонецПроцедуры Частые вопросы (FAQ)
Почему нельзя просто уменьшить номер принятого сообщения в базе-приемнике?
Платформа 1С строго контролирует целостность последовательности транзакций. Номер принимаемого пакета должен быть строго равен (НомерПринятогоВБазе + 1), иначе пакет считается дубликатом или устаревшим.
Что происходит с зарегистрированными изменениями при сбросе номера отправленного в 0?
Изменения остаются в таблицах регистрации изменений до тех пор, пока от узла-приемника не придет подтверждение (квитанция) о приеме пакета с соответствующим номером.
Как узнать, какой номер сообщения ожидает база-приемник?
Откройте план обмена в базе-приемнике, найдите узел источника и посмотрите значение реквизита 'Номер принятого'. В базе-источнике номер отправленного должен быть равен этому значению.
Можно ли очистить таблицу регистрации изменений для конкретного документа?
Да, используйте метод: ПланыОбмена.УдалитьРегистрациюИзменений(УзелСсылка, СсылкаНаОбъект).