Как удалить движения в подчиненном регистре сведений при пометке на удаление непроводимого документа?

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

В разработке на платформе 1С:Предприятие часто возникает ситуация: создан документ, у которого свойство Проведение отключено (установлено в значение «Запретить»), однако документ выполняет функции регистратора для подчиненного регистра сведений (например, фиксирует факт отправки SMS или состояние интеграции). Записи в регистр формируются вручную либо программно при нажатии определенной кнопки.

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

Почему стандартное удаление движений не работает

Проанализируем платформенные механизмы работы с подчиненными регистрами:

  1. Отсутствие статуса проведения: Если у документа отключено проведение, платформа никогда не устанавливает признак Проведен = Истина. Соответственно, обработчик ОбработкаУдаленияПроведения не вызывается, а свойство документа Удаление движений не применяется при установке пометки удаления.
  2. Пометка на удаление не очищает регистры автоматически: Установка флага ПометкаУдаления интерактивно в списке документов лишь меняет состояние реквизита объекта, но не удаляет физические строки из таблиц подчиненных регистров сведений.
  3. Удаление в формах — неверный подход: Пытаться перехватывать событие пометки на удаление в формах списка или выбора не рекомендуется. Документ может быть помечен на удаление программно, через групповую обработку или фоновое задание, и логика из формы просто не выполнится.

Способ 1. Очистка движений в модуле объекта документа

Рассмотрим основной и самый надежный способ — перенос логики управления движениями в модуль объекта документа. Событие ПередЗаписью модуля объекта вызывается всегда, независимо от того, где именно была вызвана пометка на удаление (в форме списка, форме выбора или из внешнего кода).

Посмотрим на пример реализации в модуле объекта документа:


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

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

Способ 2. Очистка через независимый НаборЗаписей менеджера регистра

Если требуется очистить записи регистра из внешней обработки, подписки на событие или модуля менеджера без обращения к полному объекту документа, воспользуемся объектом РегистрСведенийНаборЗаписей.

Разберем по шагам алгоритм работы с набором записей:

  1. Создаем новый набор записей через менеджер регистра сведений.
  2. Устанавливаем отбор по измерению Регистратор, передавая ссылку на документ.
  3. Записываем набор без добавления строк — платформа удалит все существующие записи с данным регистратором.

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


НаборЗаписей = РегистрыСведений.ИмяРегистраСведений.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокумент);

// Запись пустого набора удаляет все движения по данному регистратору
НаборЗаписей.Записать();

Такой подход удобен при разработке подписок на события (например, ПередЗаписью или ПриЗаписи документа), если типовая конфигурация находится на поддержке и прямое редактирование модуля объекта нежелательно.

Альтернативные архитектурные решения

Выясним, какие еще варианты структуры данных можно применить, если документ принципиально не должен проводиться:

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