Типовая обработка Удаление помеченных объектов при попытке удаления документа может выдавать ошибку Не удалось удалить, даже если в окне поиска связанных данных не отображается ни одной ссылки на удаляемый объект. Подобная ситуация возникает даже под учетной записью с полными правами или при попытке непосредственного удаления в привилегированном режиме.
Разберем детально механизм работы платформы при удалении объектов, выясним, почему программный код влияет на платформенное удаление, и рассмотрим по шагам способы диагностики и устранения данной проблемы.
Распространенное заблуждение заключается в том, что стандартная процедура удаления помеченных объектов работает в обход программного кода конфигурации. На самом деле платформа 1С:Предприятие при интерактивном или программном удалении объекта инициирует стандартную цепочку системных событий.
Проанализируем основные причины, по которым документ не может быть удален при отсутствии прямых ссылок:
Отказ присваивается значение Истина.ПередУдалением (для конкретного документа или общего типа ДокументОбъект), в которых типовой или доработанный код блокирует операцию.ПередЗаписью и ПриЗаписи соответствующих наборов записей, в которых также может быть установлен флаг Отказ = Истина.Для того чтобы точно определить место, где платформа прерывает операцию удаления, выполним диагностику в Конфигураторе.
ПередУдалением. Установим точку останова.ПередУдалением. Установим точки останова в назначенных процедурах общих модулей.Рассмотрим типовой пример обработчика в модуле документа, который запрещает удаление:
Процедура ПередУдалением(Отказ)
// Блокировка удаления по определенному статусу или реквизиту
Если Проведен Тогда
Отказ = Истина;
Сообщить("Запрещено удалять проведенный документ напрямую!");
Возврат;
КонецЕсли;
КонецПроцедуры
Если требуется удалить данные в административном порядке в обход проверок бизнес-логики и подписок на события, используем свойство ОбменДанными.Загрузка. Большинство типовых механизмов и проверок платформы отключаются, если данный флаг взведен в значение Истина.
Разберем пример внешней обработки для корректного удаления документа с предварительной очисткой движений:
// Получаем ссылку на удаляемый документ
ДокументСсылка = Документы.ЗаказПокупателя.НайтиПоНомеру("000000001", ТекущаяДата());
Если Не ДокументСсылка.Пустая() Тогда
// 1. Очищаем движения документа по регистрам
ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
ДокументОбъект.ОбменДанными.Загрузка = Истина;
Для Каждого НаборЗаписей Из ДокументОбъект.Движения Цикл
НаборЗаписей.Прочитать();
Если НаборЗаписей.Количество() > 0 Тогда
НаборЗаписей.Очистить();
НаборЗаписей.ОбменДанными.Загрузка = Истина;
НаборЗаписей.Записать();
КонецЕсли;
КонецЦикла;
// 2. Непосредственное удаление объекта
Попытка
ДокументОбъект.Удалить();
Сообщить("Документ успешно удален из базы данных.");
Исключение
Сообщить("Ошибка при удалении: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
Если документ не удаляется типовым инструментом, проанализируем настройки подсистемы Дата запрета изменения. При установленной дате запрета платформа блокирует изменение и удаление любых документов, чья дата меньше установленной границы.
В некоторых случаях ошибка удаления вызвана внутренними нарушениями индексов или наличием скрытых записей в таблицах итогов. Для устранения этих проблем выполним регламентные процедуры обслуживания: