При повторной настройке или сбое синхронизации данных между конфигурациями «1С:Зарплата и управление персоналом» (ЗУП 3.1) и «1С:Бухгалтерия предприятия» (БП 3.0) пользователи часто сталкиваются с ошибкой: «Ошибка в базе-корреспонденте: Сообщение обмена было принято ранее» (или «Номер сообщения меньше либо равен ранее принятому»). Проанализируем, почему возникает эта коллизия и как по шагам восстановить штатный обмен данными.
В основе механизмов планов обмена платформы 1С заложен строгий контроль нумерации сообщений. Каждый пакет обмена содержит в заголовке номер отправленного сообщения и номер последнего принятого сообщения от базы-корреспондента.
Разберем основные причины, приводящие к ошибке:
НомерПринятого в узле плана обмена.Документ.<ИмяДокумента>.Изменения) поле НомерСообщения может содержать старый номер пакета, из-за чего данные блокируются для повторной автоматической отправки.В современных типовых конфигурациях на базе Библиотеки стандартных подсистем (БСП) предусмотрен штатный механизм ручного редактирования номеров сообщений без применения внешних обработок.
Разберем по шагам, как выровнять номера:
Если в базе-источнике номер отправленного сообщения равен 1, то в базе-приемнике для узла этой базы значение «Номер принятого» должно быть установлено в 0.
Перед повторным запуском синхронизации обязательно проверим транспортный каталог:
.xml или .zip (например, Message_ЗК_БП.zip).Если номера пакетов были сброшены, платформа могла пометить изменения как уже выгруженные в рамках старого номера сообщения. В этом случае данные не попадут в новый пакет.
Рассмотрим, как заново зарегистрировать данные к отправке:
РегистрацияИзмененийДляОбмена83.epf с диска ИТС. С ее помощью можно очистить поле НомерСообщения в таблицах регистрации изменений для выбранных узлов.Если интерфейсный доступ к номерам узла ограничен или заблокирован, программно обнулим номера пакетов с помощью небольшого фрагмента кода на встроенном языке 1С.
Посмотрим на пример кода для сброса счетчиков узла плана обмена:
ВыборкаУзлов = ПланыОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.Выбрать();
Пока ВыборкаУзлов.Следующий() Цикл
Если Не ВыборкаУзлов.ЭтотУзел() Тогда
УзелОбъект = ВыборкаУзлов.ПолучитьОбъект();
УзелОбъект.НомерОтправленного = 0;
УзелОбъект.НомерПринятого = 0;
УзелОбъект.Записать();
КонецЕсли;
КонецЦикла;
Выполним данный код во внешней обработке в обеих информационных базах, после чего произведем полную выгрузку и загрузку данных заново.
Если удаление и создание настройки выполнялось только на стороне ЗУП, в БП мог остаться старый узел с несовпадающим внутренним идентификатором (GUID).
Разберем правильный порядок полного пересоздания обмена: