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

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

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

Причины возникновения ошибки

В основе механизмов планов обмена платформы 1С заложен строгий контроль нумерации сообщений. Каждый пакет обмена содержит в заголовке номер отправленного сообщения и номер последнего принятого сообщения от базы-корреспондента.

Разберем основные причины, приводящие к ошибке:

  1. Рассинхронизация счетчиков пакетов: если синхронизация была удалена и настроена заново только на одной стороне, счетчики номеров отправленных и принятых сообщений обнуляются или расходятся со значениями узла в базе-корреспонденте. База-приемник отклоняет пакет, если его номер меньше или равен значению реквизита НомерПринятого в узле плана обмена.
  2. Остаточные файлы в каталоге обмена: если обмен выполняется через локальный каталог, сетевую папку или FTP, там может остаться старый файл выгрузки. База пытается загрузить устаревший файл с прежним номером пакета.
  3. Зависшие номера в таблицах регистрации: в таблицах изменений (Документ.<ИмяДокумента>.Изменения) поле НомерСообщения может содержать старый номер пакета, из-за чего данные блокируются для повторной автоматической отправки.

Способ 1. Корректировка номеров сообщений в интерфейсе БСП

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

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

  1. Откроем раздел «Администрирование» → «Синхронизация данных» → «Настройки синхронизации данных».
  2. Выделим нужную настройку подключения к базе-корреспонденту.
  3. Нажмем кнопку «Состав отправляемых данных» (пиктограмма списка с синими стрелками на панели инструментов).
  4. В верхней части открывшегося окна нажмем на гиперссылку с текущими номерами («№ отправленного ..., № принятого ...»).
  5. В появившемся диалоговом окне скорректируем значения:

    Если в базе-источнике номер отправленного сообщения равен 1, то в базе-приемнике для узла этой базы значение «Номер принятого» должно быть установлено в 0.

  6. Повторим проверку и при необходимости скорректируем номера в базе-корреспонденте.

Способ 2. Очистка каталога обмена

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

  1. Перейдем в папку обмена (локальный каталог, сетевой ресурс или каталог на FTP-сервере).
  2. Проверим наличие файлов сообщений с расширениями .xml или .zip (например, Message_ЗК_БП.zip).
  3. Удалим устаревшие файлы обмена или переместим их в архивную папку. Это исключит ситуацию, когда база-приемник считывает старый файл вместо вновь сформированного.

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

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

Рассмотрим, как заново зарегистрировать данные к отправке:

  1. В окне «Состав отправляемых данных» найдем нужные типы метаданных (например, документы «Отражение зарплаты в бухучете», «Выплата зарплаты» или справочники).
  2. Нажмем правой кнопкой мыши на нужный объект или раздел и выберем команду «Зарегистрировать изменения» (можно выбрать регистрацию всех объектов или с отбором).
  3. Для комплексного управления регистрацией воспользуемся типовой внешней обработкой РегистрацияИзмененийДляОбмена83.epf с диска ИТС. С ее помощью можно очистить поле НомерСообщения в таблицах регистрации изменений для выбранных узлов.

Способ 4. Программный сброс номеров сообщений

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

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


ВыборкаУзлов = ПланыОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.Выбрать();
Пока ВыборкаУзлов.Следующий() Цикл
    Если Не ВыборкаУзлов.ЭтотУзел() Тогда
        УзелОбъект = ВыборкаУзлов.ПолучитьОбъект();
        УзелОбъект.НомерОтправленного = 0;
        УзелОбъект.НомерПринятого = 0;
        УзелОбъект.Записать();
    КонецЕсли;
КонецЦикла;

Выполним данный код во внешней обработке в обеих информационных базах, после чего произведем полную выгрузку и загрузку данных заново.

Способ 5. Полная перенастройка синхронизации в обеих базах

Если удаление и создание настройки выполнялось только на стороне ЗУП, в БП мог остаться старый узел с несовпадающим внутренним идентификатором (GUID).

Разберем правильный порядок полного пересоздания обмена:

  1. Удалим настройку синхронизации в обеих базах (и в ЗУП, и в БП).
  2. Проверим соответствие префиксов в «Администрирование» → «Синхронизация данных» (префиксы баз должны строго соответствовать кодам узлов).
  3. В первой базе создадим новую настройку и сохраним файл с настройками подключения.
  4. Во второй базе настроим синхронизацию путем загрузки сохраненного файла настроек, завершив сопоставление узлов.
← На главную