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

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

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

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

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


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

Почему подписка на событие ПередУдалением не срабатывает?

Разберем механизм работы платформы при удалении объектов с контролем ссылочной целостности:

  1. Метод УдалитьОбъекты() с флагом проверки ссылок выполняет поиск всех ссылок на удаляемый объект в базе данных (внутренний аналог функции НайтиПоСсылкам()).
  2. Если на документ найдена ссылка в измерении или реквизите регистра сведений, на котором не установлен признак Ведущее, платформа прерывает операцию и выдает сообщение о невозможности удаления из-за наличия ссылок.
  3. Транзакция физического удаления документа даже не открывается, а значит, события ПередУдалением и связанные с ними подписки не вызываются.

Платформа 1С игнорирует ссылки на удаляемый объект только в двух базовых случаях:

  1. Измерение независимого регистра сведений имеет признак Ведущее. При удалении документа платформа каскадно очищает записи регистра.
  2. Регистр сведений имеет режим записи Подчинение регистратору, а удаляемый документ выступает регистратором этих записей.

Основное решение: использование свойства Ведущее и скрытие лишних команд из интерфейса

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

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

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

Альтернативные способы реализации

Если по архитектурным причинам включение свойства Ведущее невозможно, проанализируем альтернативные варианты:

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