Как исправить ошибку «Сообщение обмена было принято ранее» при синхронизации 1С:КА и 1С:Бухгалтерии?

Программист 1С v8.3 (Управляемые формы) 1С:Комплексная автоматизация IT и автоматизация бизнеса
← На главную

При выполнении регулярного обмена данными между конфигурациями (например, между 1С:Комплексная автоматизация и 1С:Бухгалтерия предприятия) администраторы и программисты нередко сталкиваются с ситуацией, когда обмен внезапно перестает работать. При этом документы из одной базы успешно выгружаются во вторую, но в базе-источнике отметки о выгрузке не снимаются, а в журнале регистрации фиксируется ошибка: «Сообщение обмена было принято ранее».

Разберем детально механизм возникновения этой проблемы, выясним, почему регистрация изменений не сбрасывается, и рассмотрим пошаговые способы восстановления синхронизации.

Почему возникает ошибка и почему не сбрасывается регистрация изменений?

Проанализируем внутреннее устройство механизма обмена данными платформы 1С. Каждый узел плана обмена содержит системные счетчики: НомерОтправленного и НомерПринятого.

Когда база-источник формирует пакет данных, она присваивает ему очередной порядковый номер (увеличивая НомерОтправленного на единицу) и вкладывает номер последнего успешно принятого от корреспондента сообщения. База-приемник считывает пакет и выполняет строгую проверку:

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

Второй важный аспект проблемы — сохранение отметок регистрации изменений (например, на документах поступления на расчетный счет). Платформа 1С снимает объекты с регистрации не в момент непосредственной отправки данных, а только при получении подтверждения (квитанции) от базы-корреспондента в ответном пакете. Поскольку при попытке прочитать ответ приемника база наталкивается на ошибку нумерации, процесс получения данных аварийно прерывается, квитанция не обрабатывается, и номера отправленных сообщений остаются в таблицах регистрации изменений.

К рассинхронизации счетчиков обычно приводят следующие события:

  1. Восстановление базы из резервной копии. Если одну из баз откатили на архивную копию, ее счетчики вернулись назад во времени, а база-партнер уже ожидает сообщения со значительно большими номерами.
  2. Подключение тестового контура к рабочей базе. Если для тестирования была развернута копия рабочей базы, где забыли отключить регламентные задания обмена, тестовая база успевает обменяться данными с рабочей, продвинув счетчики вперед.
  3. Аварийный обрыв COM-соединения. При обмене через COM-соединение транзакции в двух базах разделены. Сбой сети или перезагрузка сервера в момент фиксации данных приводят к тому, что одна база сохранила номер пакета, а вторая не зафиксировала факт успешного завершения сеанса.

Способ 1. Корректировка номеров сообщений через обработку регистрации изменений

Самый безопасный и штатный способ исправления проблемы в типовых конфигурациях на базе Библиотеки стандартных подсистем (БСП) — использование встроенных инструментов администрирования.

Разберем по шагам, как выровнять номера:

  1. Откроем базу 1С:Комплексная автоматизация под учетной записью с правами администратора.
  2. Перейдем в раздел «НСИ и администрирование» -> «Синхронизация данных» (или вызовем типовую обработку Регистрация изменений для обмена данными).
  3. Выберем узел плана обмена, соответствующий базе 1С:Бухгалтерия.
  4. Нажмем кнопку изменения номеров сообщений узла.
  5. Установим реквизит НомерПринятого равным 0. Значение 0 является служебным: платформа считает его сигналом для безусловного приема входящего пакета с любым положительным номером и автоматически перезаписывает счетчик фактическим номером из заголовка сообщения.
  6. Повторим аналогичную проверку со стороны 1С:Бухгалтерии: если ошибка возникает при встречном движении данных, сбросим значение НомерПринятого в ноль и там.
  7. Запустим сеанс синхронизации вручную. После успешного прочтения ответного сообщения платформа восстановит последовательность нумерации и очистит зарегистрированные изменения.

Способ 2. Программный сброс номеров сообщений узла плана обмена

Если доступ к штатному интерфейсу ограничен или требуется автоматизировать процесс для нескольких узлов, воспользуемся встроенным языком 1С. Рассмотрим код, позволяющий сбросить счетчик принятых сообщений для нужного узла:


// Выбираем план обмена, участвующий в синхронизации
ПланОбменаСсылка = ПланыОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.НайтиПоНаименованию("Бухгалтерия предприятия, ред. 3.0");

Если ЗначениеЗаполнено(ПланОбменаСсылка) Тогда
    УзелОбъект = ПланОбменаСсылка.ПолучитьОбъект();
    
    // Сбрасываем номер принятого сообщения, чтобы принять входящий пакет с любым номером
    УзелОбъект.НомерПринятого = 0;
    
    // Записываем изменения узла плана обмена
    УзелОбъект.Записать();
    Сообщить("Счетчик принятых сообщений успешно сброшен в 0 для узла: " + УзелОбъект.Наименование);
Иначе
    Сообщить("Узел плана обмена не найден!");
КонецЕсли;

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

Рекомендации по надежности COM-обмена между КА и Бухгалтерией КОРП

Проанализируем технические нюансы взаимодействия конфигураций с разной частотой обновлений:

  1. Проверка подписок на события. Модификация кода подписок на события проверкой вида:
    
    Если Источник.ОбменДанными.Загрузка = Истина Тогда 
        Возврат; 
    КонецЕсли;
    
    является обязательным правилом при кастомизации конфигураций, однако она защищает только от некорректного срабатывания бизнес-логики при записи объектов. На системный заголовок пакета обмена и механизм проверки номеров сообщений данная конструкция влияния не оказывает.
  2. Разрядность и версия comcntr.dll. Обмен по прямому COM-соединению крайне чувствителен к несовпадению версий платформ 1С и разрядности серверов (x86 и x64). Если 1С:Бухгалтерия КОРП регулярно обновляется, это может потребовать перехода на более новый релиз платформы, что вызовет падение устаревшей библиотеки comcntr.dll.
  3. Переход на современные протоколы. Для стабильной работы распределенных систем и интеграций рекомендуется отказаться от устаревшего COM-транспорта в пользу подключения через веб-сервисы, HTTP-сервисы или файловый обмен через общий сетевой каталог/FTP. Это полностью исключает зависимость от версий библиотек операционной системы и позволяет наглядно контролировать XML-заголовки пакетов v8msg:MessageNo и v8msg:ReceivedNo.
← На главную