При работе с механизмами обмена данными в 1С программисты часто сталкиваются с необходимостью тонкой настройки регистрации объектов. Для ускорения подготовительных этапов часто используют быстрое создание узла плана обмена в типовых конфигурациях. Если для ссылочных типов (справочников или документов) удаление регистрации происходит интуитивно понятно через передачу ссылки в метод УдалитьРегистрациюИзменений (например, когда настроена регистрация документов и справочников после определенной даты), то работа с регистрами сведений (РС) имеет свои особенности. В этой статье мы подробно разберем, как правильно очищать таблицу изменений для РС, проанализируем типичные ошибки и рассмотрим продвинутые способы оптимизации этого процесса.
Рассмотрим стандартную ситуацию: у нас есть план обмена, и нам нужно удалить из него регистрацию конкретной записи регистра сведений — поможет инструмент для массовой регистрации и удаления объектов в планах обмена. В отличие от справочника, запись регистра не является ссылочным объектом. Для идентификации записи в платформе 1С используется объект НаборЗаписей.
Разберем по шагам, как это реализовать программно. Основная идея заключается в том, что во второй параметр метода ПланыОбмена.УдалитьРегистрациюИзменений() мы должны передать не саму запись, а специально подготовленный объект НаборЗаписей с установленными фильтрами по измерениям. В некоторых сценариях вместо ручного удаления удобнее применять универсальный перенос данных между разными конфигурациями (удобно через универсальный перенос данных между разными конфигурациями 1С), который берет на себя часть задач по синхронизации.
Посмотрим на пример кода, который решает эту задачу:
// 1. Получаем узел плана обмена, для которого нужно удалить регистрацию
УзелОтражатель = ПланыОбмена.ОбменСЗП.НайтиПоКоду("001");
// 2. Создаем пустой набор записей регистра
НаборЗаписей = РегистрыСведений.QRКодСотрудника.СоздатьНаборЗаписей();
// 3. Устанавливаем отборы по измерениям, которые однозначно определяют запись
НаборЗаписей.Отбор.Сотрудник.Установить(ВыбранныйСотрудник);
НаборЗаписей.Отбор.ТипПрохода.Установить(ВыбранныйТип);
// 4. Вызываем удаление регистрации для конкретного узла и набора
ПланыОбмена.УдалитьРегистрациюИзменений(УзелОтражатель, НаборЗаписей);
Важно обратить внимание на то, что для выполнения этой операции не требуется вызывать метод НаборЗаписей.Прочитать(). Платформа анализирует только структуру отбора в переданном объекте и на её основе находит соответствующие записи в служебной таблице изменений (_ChngR).
Проанализируем причину, по которой система может выдавать ошибку при попытке удаления регистрации. Одной из самых частых причин является неполный отбор. Чтобы метод отработал корректно, необходимо соблюдать следующие правила:
Основной отбор. Обычно это все измерения регистра, если не задано иное.Период также является важной частью ключа. Если нужно удалить регистрацию за конкретный момент времени, его обязательно нужно добавить в отбор.Выясним важный нюанс: если ваш регистр сведений имеет режим записи Запись по регистратору, то механизм регистрации изменений работает иначе. В таких регистрах изменения регистрируются не по наборам записей измерений, а по ссылке на документ-регистратор.
В этом случае попытка использовать НаборЗаписей с отбором по измерениям может не принести результата. Рассмотрим, как правильно действовать в такой ситуации: для удаления регистрации изменений в подчиненных регистрах во второй параметр метода УдалитьРегистрациюИзменений следует передавать ссылку на документ-регистратор.
В высоконагруженных системах поштучное удаление регистрации может привести к деградации производительности. В таких случаях часто используется выгрузка и загрузка данных XML адаптивная с гибкими отборами, которая позволяет более гибко управлять составом передаваемых данных.
Использование массивов: Метод УдалитьРегистрациюИзменений поддерживает передачу массива во втором параметре. Мы можем собрать несколько наборов записей в массив и передать их одним вызовом. Это значительно сокращает количество транзакций к базе данных.
МассивНаборов = Новый Массив;
// Цикл по обрабатываемым данным
Пока Выборка.Следующий() Цикл
Набор = РегистрыСведений.МойРегистр.СоздатьНаборЗаписей();
Набор.Отбор.Ключ.Установить(Выборка.Ключ);
МассивНаборов.Добавить(Набор);
КонецЦикла;
ПланыОбмена.УдалитьРегистрациюИзменений(Узел, МассивНаборов);
Удаление по номеру сообщения: Если ваша задача — очистить изменения после успешной отправки данных, самым эффективным способом будет использование номера сообщения. Рассмотрим пример:
ПланыОбмена.УдалитьРегистрациюИзменений(Узел, НомерПринятогоСообщения);
Прежде чем удалять регистрацию, иногда полезно убедиться, какие именно данные там находятся. Для этого можно использовать не только запросы к таблицам изменений, но и специализированный мониторинг синхронизаций данных для баз на платформе 1С.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Т.Сотрудник,
| Т.ТипПрохода,
| Т.Узел
|ИЗ
| РегистрСведений.QRКодСотрудника.Изменения КАК Т
|ГДЕ
| Т.Узел = &Узел";
Запрос.УстановитьПараметр("Узел", НужныйУзел);
Результат = Запрос.Выполнить().Выгрузить();
Такой подход позволяет нам проанализировать очередь обмена и программно решить, какие именно регистрации больше не актуальны.
Подведем итоги нашего исследования. Для успешного удаления регистрации изменений РС необходимо:
НаборЗаписей, а не ссылку.Период.Соблюдение этих правил позволит вам эффективно управлять очередями обмена и избегать типичных ошибок, связанных с некорректными типами параметров в методах планов обмена.