При выполнении регулярного обмена данными между конфигурациями (например, между 1С:Комплексная автоматизация и 1С:Бухгалтерия предприятия) администраторы и программисты нередко сталкиваются с ситуацией, когда обмен внезапно перестает работать. При этом документы из одной базы успешно выгружаются во вторую, но в базе-источнике отметки о выгрузке не снимаются, а в журнале регистрации фиксируется ошибка: «Сообщение обмена было принято ранее».
Разберем детально механизм возникновения этой проблемы, выясним, почему регистрация изменений не сбрасывается, и рассмотрим пошаговые способы восстановления синхронизации.
Проанализируем внутреннее устройство механизма обмена данными платформы 1С. Каждый узел плана обмена содержит системные счетчики: НомерОтправленного и НомерПринятого.
Когда база-источник формирует пакет данных, она присваивает ему очередной порядковый номер (увеличивая НомерОтправленного на единицу) и вкладывает номер последнего успешно принятого от корреспондента сообщения. База-приемник считывает пакет и выполняет строгую проверку:
НомерПринятого в узле плана обмена базы-получателя.НомерПринятого, платформа расценивает этот пакет как устаревший или повторный, блокирует его обработку и выдает системное исключение: «Сообщение обмена было принято ранее».Второй важный аспект проблемы — сохранение отметок регистрации изменений (например, на документах поступления на расчетный счет). Платформа 1С снимает объекты с регистрации не в момент непосредственной отправки данных, а только при получении подтверждения (квитанции) от базы-корреспондента в ответном пакете. Поскольку при попытке прочитать ответ приемника база наталкивается на ошибку нумерации, процесс получения данных аварийно прерывается, квитанция не обрабатывается, и номера отправленных сообщений остаются в таблицах регистрации изменений.
К рассинхронизации счетчиков обычно приводят следующие события:
Самый безопасный и штатный способ исправления проблемы в типовых конфигурациях на базе Библиотеки стандартных подсистем (БСП) — использование встроенных инструментов администрирования.
Разберем по шагам, как выровнять номера:
Регистрация изменений для обмена данными).НомерПринятого равным 0. Значение 0 является служебным: платформа считает его сигналом для безусловного приема входящего пакета с любым положительным номером и автоматически перезаписывает счетчик фактическим номером из заголовка сообщения.НомерПринятого в ноль и там.Если доступ к штатному интерфейсу ограничен или требуется автоматизировать процесс для нескольких узлов, воспользуемся встроенным языком 1С. Рассмотрим код, позволяющий сбросить счетчик принятых сообщений для нужного узла:
// Выбираем план обмена, участвующий в синхронизации
ПланОбменаСсылка = ПланыОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.НайтиПоНаименованию("Бухгалтерия предприятия, ред. 3.0");
Если ЗначениеЗаполнено(ПланОбменаСсылка) Тогда
УзелОбъект = ПланОбменаСсылка.ПолучитьОбъект();
// Сбрасываем номер принятого сообщения, чтобы принять входящий пакет с любым номером
УзелОбъект.НомерПринятого = 0;
// Записываем изменения узла плана обмена
УзелОбъект.Записать();
Сообщить("Счетчик принятых сообщений успешно сброшен в 0 для узла: " + УзелОбъект.Наименование);
Иначе
Сообщить("Узел плана обмена не найден!");
КонецЕсли;
Обратите внимание: сбрасывать в ноль реквизит НомерОтправленного без крайней необходимости не рекомендуется, так как это может привести к отклонению уже выгруженных пакетов на стороне базы-приемника.
Проанализируем технические нюансы взаимодействия конфигураций с разной частотой обновлений:
Если Источник.ОбменДанными.Загрузка = Истина Тогда
Возврат;
КонецЕсли;
comcntr.dll.v8msg:MessageNo и v8msg:ReceivedNo.