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

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

При настройке регулярного обмена данными между информационными базами 1С (например, при выгрузке из «1С:Управление торговлей 10.3» в «1С:Бухгалтерию предприятия 2.0») разработчики и администраторы часто сталкиваются с ситуацией: процесс завершается успешно и без ошибок, однако в базе-источнике объекты не снимаются с регистрации. Таблица изменений продолжает расти, с каждым сеансом объем выгрузки увеличивается, что приводит к замедлению работы и избыточной нагрузке на систему.

Выясним причину такого поведения платформы 1С:Предприятие и разберем по шагам все способы решения данной проблемы.

Принцип работы механизма квитирования на платформе 1С

Проанализируем архитектуру планов обмена. В платформе 1С механизм очистки зарегистрированных изменений жестко привязан к номерам сообщений (квитированию доставки) и свойствам узла НомерОтправленного и НомерПринятого:

  1. При формировании пакета выгрузки через объект ЗаписьСообщенияОбмена всем зарегистрированным объектам в таблице изменений присваивается номер текущего исходящего сообщения.
  2. База-приемник считывает входящий файл через объект ЧтениеСообщенияОбмена и фиксирует номер принятого пакета.
  3. Платформа 1С в базе-источнике автоматически удаляет записи из таблицы регистрации только в тот момент, когда она считывает ответный файл из базы-приемника, в заголовке которого номер подтвержденного пакета равен или больше номера отправленного сообщения.

Если в схеме настроен строго односторонний обмен (файл уходит из источника в приемник, но база-источник никогда не считывает ответный пакет), регистрация изменений в источнике не очистится никогда. Рассмотрим варианты исправления ситуации.

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

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

Для этого выполним следующие действия:

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

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

Вариант 2. Автоматическое снятие изменений при выгрузке

Если обмен выполняется с использованием типовой обработки УниверсальныйОбменДаннымиXML (интерактивно или в рамках регламентного задания), можно применить встроенную опцию мгновенного снятия регистрации.

Посмотрим на параметры обработки:

  1. На вкладке «Выгрузка данных» находим и включаем флаг «Снимать изменения при выгрузке».
  2. Если выгрузка инициируется программно, устанавливаем свойство объекта: Обработка.УдалятьРегистрациюИзмененийПриВыгрузке = Истина;.

При таком подходе платформа удаляет записи из таблицы изменений непосредственно в момент записи данных в XML-файл, не дожидаясь квитанции от базы-приемника.

Вариант 3. Программное управление регистрацией изменений

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

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


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

Если необходимо снять регистрацию только по конкретному типу метаданных (например, очистить документы без очистки справочников):


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

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


// Удаление регистрации по номеру отправленного сообщения
НомерСообщения = 125;
ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена, НомерСообщения);

Вариант 4. Сброс счетчиков сообщений и ручной контроль

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


// Сброс счетчиков номеров сообщений узла
УзелОбъект = УзелОбмена.ПолучитьОбъект();
УзелОбъект.НомерОтправленного = 0;
УзелОбъект.НомерПринятого = 0;
УзелОбъект.Записать();

Для визуального контроля зарегистрированных данных и выборочного удаления записей без написания кода используем типовую обработку «Регистрация изменений для обмена», которая позволяет просматривать текущее дерево изменений по каждому узлу и удалять ненужные объекты интерактивно.

← На главную