Как программно удалить регистрацию изменений документа и всех его движений в планах обмена 1С

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

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

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

Разберем работу метода УдалитьРегистрациюИзменений и пример запуска обмена

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

Рассмотрим стандартные варианты вызова этого метода (также полезна может быть универсальная регистрация объектов для обмена по организации):

  1. Полная очистка узла: Если вызвать ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена), передав только первый параметр, система удалит абсолютно все зарегистрированные изменения для этого узла по всем объектам метаданных, входящим в план обмена.
  2. Очистка по типу метаданных: Если передать второй параметр, например, Метаданные.Документы.РеализацияТоваровУслуг, система удалит регистрацию всех документов данного типа.
  3. Очистка конкретного объекта: Если во второй параметр передать ссылку на конкретный документ или массив ссылок, из очереди будут удалены только эти конкретные записи.

Важный нюанс: Как справедливо заметили участники обсуждения, при передаче в метод объекта метаданных документа (например, РеализацияТоваровУслуг), система удаляет регистрацию только самих ссылок на документы. Если этот документ при проведении делает записи в регистры накопления, сведения или бухгалтерии, и эти регистры также включены в план обмена с признаком "Авторегистрация", то записи регистров останутся в очереди обмена!

Проблема регистрации движений и способы её решения

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

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

Программный алгоритм удаления регистрации движений

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

Проанализируем пример кода, который позволяет автоматизировать этот процесс:


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

// 1. Удаляем регистрацию самих документов
ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена, МетаданныеДокумента);

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

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

Использование Библиотеки стандартных подсистем (БСП)

Если ваша конфигурация построена на базе БСП (что актуально для большинства современных решений, таких как ERP, УТ 11, БП 3.0), рекомендуется использовать встроенные механизмы. В БСП существует программный интерфейс для управления регистрацией, который более интеллектуально обрабатывает зависимости.

Рассмотрим полезные функции:

Тонкие моменты при работе с регистрами

Стоит отдельно рассмотреть ситуацию с удалением регистрации для конкретного экземпляра документа. Если вы хотите удалить регистрацию только одной реализации и только её движений, метод УдалитьРегистрациюИзменений также справится с этим, если передать в него отбор.

Посмотрим на пример удаления по конкретной ссылке:


// Ссылка на конкретный документ
ДокСсылка = ВыбраннаяРеализация;

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

// Удаляем регистрацию движений именно этого документа
Для каждого РегМетаданные Из ДокСсылка.Метаданные().Движения Цикл
    // Создаем ключ записи или используем метаданные с отбором
    // Платформа позволяет передать набор записей с установленным фильтром по регистратору
    НаборЗаписей = РегистрыНакопления[РегМетаданные.Имя].СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Регистратор.Установить(ДокСсылка);
    
    ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена, НаборЗаписей);
КонецЦикла;

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

Резюме

Подведем итог. Для качественной очистки очереди обмена нам необходимо:

  1. Определить, требуется ли полная очистка типа или частичная (например, удаление объектов к выгрузке до определенной даты).
  2. Обязательно учитывать коллекцию Движения в метаданных документа.
  3. Использовать цикл по метаданным регистров для удаления всех связанных записей.
  4. По возможности использовать типовые инструменты БСП для минимизации ошибок ручного кодинга.

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

← На главную