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

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

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

Метод Набора Записей: Основное решение

Рассмотрим стандартную ситуацию: у нас есть план обмена, и нам нужно удалить из него регистрацию конкретной записи регистра сведений — поможет инструмент для массовой регистрации и удаления объектов в планах обмена. В отличие от справочника, запись регистра не является ссылочным объектом. Для идентификации записи в платформе 1С используется объект НаборЗаписей.

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

Посмотрим на пример кода, который решает эту задачу:


// 1. Получаем узел плана обмена, для которого нужно удалить регистрацию
УзелОтражатель = ПланыОбмена.ОбменСЗП.НайтиПоКоду("001");

// 2. Создаем пустой набор записей регистра
НаборЗаписей = РегистрыСведений.QRКодСотрудника.СоздатьНаборЗаписей();

// 3. Устанавливаем отборы по измерениям, которые однозначно определяют запись
НаборЗаписей.Отбор.Сотрудник.Установить(ВыбранныйСотрудник);
НаборЗаписей.Отбор.ТипПрохода.Установить(ВыбранныйТип);

// 4. Вызываем удаление регистрации для конкретного узла и набора
ПланыОбмена.УдалитьРегистрациюИзменений(УзелОтражатель, НаборЗаписей);

Важно обратить внимание на то, что для выполнения этой операции не требуется вызывать метод НаборЗаписей.Прочитать(). Платформа анализирует только структуру отбора в переданном объекте и на её основе находит соответствующие записи в служебной таблице изменений (_ChngR).

Обязательные требования к отборам

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

  1. Признак «Основной отбор»: В отборе должны участвовать только те измерения, у которых в метаданных установлен флаг Основной отбор. Обычно это все измерения регистра, если не задано иное.
  2. Полнота ключа: Если вы хотите удалить регистрацию конкретной записи, вы должны установить значения для всех ключевых измерений.
  3. Периодические регистры: Если мы работаем с периодическим регистром сведений, свойство Период также является важной частью ключа. Если нужно удалить регистрацию за конкретный момент времени, его обязательно нужно добавить в отбор.

Особенности регистров, подчиненных регистратору

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

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

Массовое удаление и оптимизация производительности

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

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


МассивНаборов = Новый Массив;

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

ПланыОбмена.УдалитьРегистрациюИзменений(Узел, МассивНаборов);

Удаление по номеру сообщения: Если ваша задача — очистить изменения после успешной отправки данных, самым эффективным способом будет использование номера сообщения. Рассмотрим пример:

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

Анализ таблицы изменений перед удалением

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   Т.Сотрудник,
    |   Т.ТипПрохода,
    |   Т.Узел
    |ИЗ
    |   РегистрСведений.QRКодСотрудника.Изменения КАК Т
    |ГДЕ
    |   Т.Узел = &Узел";

Запрос.УстановитьПараметр("Узел", НужныйУзел);
Результат = Запрос.Выполнить().Выгрузить();

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

Резюме

Подведем итоги нашего исследования. Для успешного удаления регистрации изменений РС необходимо:

  1. Использовать объект НаборЗаписей, а не ссылку.
  2. Тщательно проверять установку всех измерений, входящих в основной отбор.
  3. Для периодических регистров учитывать Период.
  4. Для регистров с подчинением регистратору использовать ссылку на Документ.
  5. В сложных случаях использовать универсальную выгрузку-загрузку регистров с шифрованием для безопасной передачи данных.

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

← На главную