Почему не очищается регистрация объектов после обмена данными в 1С и как это исправить?

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

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

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

Как устроен механизм подтверждения (квитирования) в 1С

Для того чтобы понять суть проблемы, проанализируем внутреннее устройство планов обмена. Платформа «1С:Предприятие 8» использует транзакционный механизм гарантированной доставки сообщений. Он базируется на строгом учете номеров сообщений и работает по следующему алгоритму:

  1. Таблицы регистрации изменений: Для каждого объекта метаданных, включенного в состав плана обмена, система автоматически создает скрытую служебную таблицу регистрации изменений (например, Справочник.Номенклатура.Изменения). В этой таблице фиксируются ссылки на измененные элементы, узел-получатель и служебное поле НомерСообщения, которое изначально имеет значение NULL.
  2. Формирование пакета выгрузки: При старте обмена и вызове метода ВыбратьИзменения() платформа выбирает все записи с пустым номером сообщения и присваивает им номер текущего исходящего пакета (например, 15). Теперь эти объекты заблокированы под номером сообщения 15.
  3. Ожидание подтверждения (квитанции): База-источник отправляет файл обмена в базу-приемник. Сама база-источник при этом не удаляет записи регистрации. Она ждет сигнала от приемника о том, что файл №15 был успешно получен и обработан.
  4. Квитирование: При следующем сеансе связи база-приемник присылает ответный технический заголовок, в котором указывает: «Сообщение №15 успешно загружено». Только после получения этого подтверждения база-источник выполняет метод ПланыОбмена.УдалитьРегистрациюИзменений(УзелПриемник, 15), который очищает записи регистрации с номерами сообщений, меньшими или равными 15.

Таким образом, если обмен настроен строго в одну сторону («выгрузили файл и забыли»), база-источник никогда не получит подтверждения от приемника. Поле НомерСообщения останется заполненным, и при следующей выгрузке платформа снова включит эти объекты в пакет обмена.

Решение 1. Настройка двустороннего обмена (рекомендуемый способ)

Самый простой и надежный способ решить проблему штатными средствами — настроить двусторонний обмен данными, даже если бизнес-логика требует передачи данных только в одну сторону.

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

Для реализации этого сценария выполним следующие шаги:

  1. Настроим расписание или ручной запуск обмена в базе-приемнике для отправки ответного сообщения.
  2. Убедимся, что каналы связи (сетевой каталог, FTP-сервер или веб-сервис) открыты для записи в обе стороны. Часто разработчики забывают предоставить права на запись в транспортный каталог для базы-приемника, из-за чего файлы квитирования просто не создаются.

Решение 2. Программное квитирование при одностороннем обмене

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

Важное предупреждение о безопасности данных (Race Condition):
Ни в коем случае нельзя использовать «слепую» очистку всей регистрации по узлу без указания номера сообщения. Разберем опасную ситуацию на примере:

Представим, что выгрузка тяжелого справочника длится 5 минут. На 1-й минуте выгрузился «Контрагент А». На 3-й минуте пользователь в базе-источнике изменил номер телефона этого контрагента. В таблице регистрации для него мгновенно появилась новая запись с НомерСообщения = NULL. Если на 5-й минуте после окончания выгрузки мы жестко очистим всю регистрацию по узлу, то сотрем и это новое изменение. Телефон контрагента в базе-приемнике никогда не обновится.

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


// Получаем узел обмена с базой-приемником
УзелОбмена = ПланыОбмена.СинхронизацияДанных.НайтиПоКоду("ПРИЕМНИК");

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

Метод ПланыОбмена.УдалитьРегистрациюИзменений(), вызванный с указанием номера сообщения, удалит только те записи, которые реально попали в выгруженный файл. Все изменения, произошедшие в процессе выгрузки, останутся зарегистрированными и будут переданы в следующий раз. Если же требуется выборочно снять документы с регистрации вручную, можно применить обработку для отмены регистрации документов за период в плане обмена.

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

Проанализируем частые ошибки, которые совершают программисты при попытке решить проблему программно:

Применяя правильные подходы к квитированию сообщений — будь то настройка двусторонней синхронизации БСП или аккуратное программное удаление регистрации по номеру сообщения — мы гарантируем стабильную, быструю и корректную работу механизмов интеграции в системах 1С. Для контроля состояния обменов и своевременного выявления сбоев подойдёт решение для мониторинга синхронизаций данных между базами 1С.

← На главную