Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.
1C_EXCHANGE_MSG_NO_FAIL 1С:Предприятие и СУБД

Восстановление номеров сообщений в планах обмена 1С:Предприятие

Обновлено: 26.08.2026  ·  Официальная база знаний

При выполнении обмена между узлами планов обмена возникает критическая ошибка:

  • Ошибка при вызове метода контекста (НачатьЧтение): Номер сообщения меньше или равен номеру ранее принятого сообщения.
  • Номер отправленного сообщения узла не соответствует ожидаемому.
  • Обмен полностью останавливается, пакеты данных отклоняются базой-приемником.
  • Сбой возникает после восстановления одной из баз из резервной копии (бэкапа).

1. Причина рассинхронизации счетчиков сообщений

Каждый узел плана обмена хранит два счетчика: НомерОтправленного и НомерПринятого. Если подчиненную или главную базу восстановили из бэкапа недельной давности, ее счетчики «откатываются назад», в то время как партнерский узел ожидает следующий инкрементный номер.

2. Программная корректировка номеров сообщений в узле

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

3. Полный сброс квитирования и перерегистрация изменений

Если данные рассинхронизированы, выполните полный сброс счетчиков в 0 на обоих узлах и зарегистрируйте данные заново:

&НаСервере
Процедура ПолнаяПеререгистрацияДанныхУзла(УзелСсылка)
    
    // 1. Сброс номеров
    УзелОбъект = УзелСсылка.ПолучитьОбъект();
    УзелОбъект.НомерОтправленного = 0;
    УзелОбъект.НомерПринятого = 0;
    УзелОбъект.Записать();
    
    // 2. Регистрация всех изменений по плану обмена
    ПланыОбмена.ЗарегистрироватьИзменения(УзелСсылка);
    
КонецПроцедуры
Практический опыт инженера: После восстановления рабочей базы из резервной копии первым делом скорректируйте номера сообщений во всех связанных узлах планов обмена до запуска регламентных фоновых заданий, иначе сформированные пакеты повредят последовательность обменов.

Частые вопросы (FAQ)

Почему нельзя просто уменьшить номер принятого сообщения в базе-приемнике?

Платформа 1С строго контролирует целостность последовательности транзакций. Номер принимаемого пакета должен быть строго равен (НомерПринятогоВБазе + 1), иначе пакет считается дубликатом или устаревшим.

Что происходит с зарегистрированными изменениями при сбросе номера отправленного в 0?

Изменения остаются в таблицах регистрации изменений до тех пор, пока от узла-приемника не придет подтверждение (квитанция) о приеме пакета с соответствующим номером.

Как узнать, какой номер сообщения ожидает база-приемник?

Откройте план обмена в базе-приемнике, найдите узел источника и посмотрите значение реквизита 'Номер принятого'. В базе-источнике номер отправленного должен быть равен этому значению.

Можно ли очистить таблицу регистрации изменений для конкретного документа?

Да, используйте метод: ПланыОбмена.УдалитьРегистрациюИзменений(УзелСсылка, СсылкаНаОбъект).