Настройка обмена данными между такими сложными конфигурациями, как 1С:ERP Управление предприятием и 1С:Управление производственным предприятием (УПП), часто сопровождается техническими нюансами. Одна из наиболее распространенных и неприятных проблем — ситуация, когда файлы обмена успешно передаются в обе стороны, номера сообщений в заголовках XML корректны, однако объекты в базе-отправителе упорно не снимаются с регистрации. Это приводит к тому, что при следующей выгрузке система пытается отправить те же самые данные повторно, неоправданно увеличивая объем файлов и нагрузку на сервер.
В этой статье мы подробно разберем, почему счетчик принятых сообщений может оставаться на нуле или почему при его росте не происходит очистка таблиц регистрации изменений. Мы проанализируем внутренние механизмы Библиотеки стандартных подсистем (БСП) и определим конкретные шаги для решения проблемы.
Для начала проанализируем, как платформа и прикладные решения обрабатывают процесс снятия объектов с регистрации. В основе обмена через планы обмена лежит механизм квитирования (подтверждения). Когда база «А» отправляет данные базе «Б», она присваивает пакету НомерИсходящегоСообщения. База «Б», приняв этот пакет, должна в своем ответном сообщении указать этот же номер в поле НомерВходящегоСообщения.
Когда база «А» загружает ответный файл, она считывает номер входящего сообщения и выполняет метод ПланыОбмена.УдалитьРегистрациюИзменений(Узел, НомерСообщения). Если этот метод не вызывается или вызывается с некорректными параметрами, объекты так и останутся «висеть» в регистрации, даже если сам файл загружен без ошибок.
Рассмотрим ситуацию, когда обмен настроен как односторонний (например, только из ERP в УПП). Часто разработчики оставляют правила выгрузки в УПП абсолютно пустыми. Выясним, почему это может быть ошибкой:
Решение: Попробуем в УПП в правилах обмена добавить хотя бы один фиктивный объект или один неиспользуемый справочник. Это заставит механизм обмена отработать полный цикл формирования сообщения с заполнением всех необходимых структур заголовка.
Если номера в файлах (НомерИсходящегоСообщения и НомерВходящегоСообщения) выглядят корректно, но регистрация не снимается, нам необходимо локализовать место в коде ERP, где должна происходить очистка. Разберем по шагам, где ставить точки останова для отладки:
ОбменДаннымиСервер. Нас интересует процедура ЗаписатьПодтверждениеПолученияДанных. Именно здесь система дает команду платформе на удаление записей из таблиц регистрации.ОбменДаннымиОбменУниверсальнымФорматом (или аналогичную, используемую в вашей версии ERP), метод ВыполнитьЗагрузкуДанных.ПрочитатьСообщениеСПодтверждениемПолучения.Проанализируем примерный фрагмент кода, который отвечает за удаление регистрации в типовых конфигурациях:
Процедура УдалитьРегистрациюИзмененийНаУзле(УзелИнформационнойБазы, НомерПринятогоСообщения)
Если НомерПринятогоСообщения = 0 Тогда
Возврат;
КонецЕсли;
// Платформенный метод, который очищает записи в таблицах регистрации
// для всех объектов, у которых номер сообщения меньше или равен переданному
ПланыОбмена.УдалитьРегистрациюИзменений(УзелИнформационнойБазы, НомерПринятогоСообщения);
КонецПроцедуры
Если при отладке вы видите, что этот код срабатывает, но объекты остаются в таблице, проверьте соответствие номеров. Например, если в таблице регистрации объект зафиксирован под номером сообщения 46, а НомерПринятогоСообщения равен 24, то очистка для этого объекта не произойдет. Это логично: система считает, что этот объект был изменен уже после того, как пакет №24 был сформирован.
Часто в ERP для гибкости настройки отключают авторегистрацию объектов и используют собственные подписки на события. Разберем, может ли это мешать процессу:
Сама по себе подписка на событие ПриЗаписи не мешает удалению регистрации. Однако, если в вашей подписке прописана логика, которая при любом «шорохе» (даже при программном изменении объекта в ходе обмена) регистрирует его обратно, вы получите эффект «бесконечной регистрации».
Важный момент: Проверьте, не происходит ли «тихий» откат транзакции. В 1С очистка регистрации изменений происходит в той же транзакции, что и загрузка данных. Если внутри процесса загрузки возникает ошибка, которая перехватывается блоком Попытка...Исключение, но не выводится в журнал, транзакция может откатываться. В результате номер принятого сообщения в заголовке узла может обновиться (так как это иногда делается в отдельной транзакции), а фактическое удаление строк из регистрационных таблиц отменится.
Для исправления ситуации выполним следующие действия:
УзелОбъекта = ПланыОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат.НайтиПоКоду("ФП");
НомерДляОчистки = УзелОбъекта.НомерПринятого;
ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбъекта, НомерДляОчистки);
Таким образом, решение проблемы со счетчиком сообщений в связке ERP и УПП кроется в обеспечении полноценного «диалога» между базами. Даже если вы не передаете полезную нагрузку из УПП в ERP, ответный файл должен быть сформирован штатным механизмом с соблюдением всех требований протокола обмена БСП. Тщательная отладка в модуле ОбменДаннымиСервер поможет вам увидеть, на каком именно этапе система «теряет» подтверждение.