При разработке и сопровождении конфигураций 1С часто возникает задача: в независимом регистре сведений хранятся данные со ссылкой на документ, и при физическом удалении этого документа из базы данных (например, через стандартную обработку Удаление помеченных объектов) необходимо очистить связанные записи регистра. При этом простое удаление записей в момент установки пометки удаления не подходит, так как пометку могут снять.
Рассмотрим, как работает контроль ссылочной целостности в платформе 1С, почему типовые подписки на события не помогают в данном сценарии и как правильно решить задачу.
Посмотрим на пример попытки перехвата через подписку на событие ПередУдалением. Разработчик создает подписку, рассчитывая в ней очистить регистр. Однако при запуске интерактивного удаления с контролем ссылок операция даже не доходит до вызова этого события:
// Попытка программной очистки перед непосредственным удалением
Процедура ПередУдалениемДокумента(Источник, Отказ) Экспорт
Набор = РегистрыСведений.МойРегистр.СоздатьНаборЗаписей();
Набор.Отбор.Документ.Установить(Источник.Ссылка);
Набор.Записать();
КонецПроцедуры
Разберем механизм работы платформы при удалении объектов с контролем ссылочной целостности:
УдалитьОбъекты() с флагом проверки ссылок выполняет поиск всех ссылок на удаляемый объект в базе данных (внутренний аналог функции НайтиПоСсылкам()).ПередУдалением и связанные с ними подписки не вызываются.Платформа 1С игнорирует ссылки на удаляемый объект только в двух базовых случаях:
Штатным и наиболее производительным решением в платформе 1С является установка флага Ведущее у измерения регистра, в котором хранится ссылка на документ. В этом случае платформа автоматически выполняет каскадное удаление записей на уровне СУБД в рамках общей транзакции удаления объекта.
Часто разработчики избегают этого флага, так как при его установке платформа автоматически добавляет команды перехода к регистру в панель навигации (меню «Перейти») формы документа. Если таких регистров много, интерфейс документа перегружается. Выясним причину и устраним ее без отказа от штатного механизма:
Использовать стандартные команды. После этого платформа перестает автоматически генерировать гиперссылки перехода в командном интерфейсе любых связанных форм документов и справочников, сохраняя при этом функционал каскадного удаления данных по признаку Ведущее.Если по архитектурным причинам включение свойства Ведущее невозможно, проанализируем альтернативные варианты:
Строка(Документ.УникальныйИдентификатор()). Контроль ссылок перестанет блокировать удаление документа, а очистку осиротевших записей можно возложить на регламентное задание.Ссылка.ПометкаУдаления = Истина) и заранее очищает связанные записи в независимом регистре сведений перед запуском регламентного или интерактивного удаления помеченных объектов.