Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

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

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?

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

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

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

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

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

Полезные материалы
Рекомендуем