Почему не удаляются помеченные документы в 1С при отсутствии ссылок?

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

Типовая обработка Удаление помеченных объектов при попытке удаления документа может выдавать ошибку Не удалось удалить, даже если в окне поиска связанных данных не отображается ни одной ссылки на удаляемый объект. Подобная ситуация возникает даже под учетной записью с полными правами или при попытке непосредственного удаления в привилегированном режиме.

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

Почему платформенный механизм удаления зависит от кода конфигурации

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

Проанализируем основные причины, по которым документ не может быть удален при отсутствии прямых ссылок:

  1. Событие модуля документа ПередУдалением: в коде модуля объекта разработчики могут прописать явные проверки условий, при невыполнении которых переменной Отказ присваивается значение Истина.
  2. Подписки на события: в конфигурации могут присутствовать подписки на событие ПередУдалением (для конкретного документа или общего типа ДокументОбъект), в которых типовой или доработанный код блокирует операцию.
  3. Удаление движений по регистрам: при удалении документа-регистратора платформа выполняет очистку его записей в регистрах бухгалтерии, накопления, сведений или расчета. В этот момент срабатывают обработчики ПередЗаписью и ПриЗаписи соответствующих наборов записей, в которых также может быть установлен флаг Отказ = Истина.
  4. Дата запрета изменения данных: если дата документа попадает в закрытый период, встроенные механизмы библиотеки стандартных подсистем (БСП) отменяют удаление.
  5. Служебные подсистемы: версионирование объектов, регистрация изменений для планов обмена или регламентные задания могут вызывать блокировку транзакции.

Поиск блокирующего кода через отладчик

Для того чтобы точно определить место, где платформа прерывает операцию удаления, выполним диагностику в Конфигураторе.

  1. Откроем информационную базу в режиме Конфигуратор.
  2. В главном меню перейдем в раздел Отладка → Остановка по ошибке и включим отслеживание системных исключений.
  3. В дереве метаданных найдем нужный документ, откроем его Модуль объекта и найдем процедуру ПередУдалением. Установим точку останова.
  4. Проверим ветку Общие → Подписки на события. Найдем все подписки, у которых источник содержит наш тип документа, а событием является ПередУдалением. Установим точки останова в назначенных процедурах общих модулей.
  5. Запустим сеанс в режиме 1С:Предприятие и повторим удаление документа через обработку Удаление помеченных объектов.

Рассмотрим типовой пример обработчика в модуле документа, который запрещает удаление:


Процедура ПередУдалением(Отказ)
    
    // Блокировка удаления по определенному статусу или реквизиту
    Если Проведен Тогда
        Отказ = Истина;
        Сообщить("Запрещено удалять проведенный документ напрямую!");
        Возврат;
    КонецЕсли;
    
КонецПроцедуры

Программный обход проверок с помощью свойства Загрузка

Если требуется удалить данные в административном порядке в обход проверок бизнес-логики и подписок на события, используем свойство ОбменДанными.Загрузка. Большинство типовых механизмов и проверок платформы отключаются, если данный флаг взведен в значение Истина.

Разберем пример внешней обработки для корректного удаления документа с предварительной очисткой движений:


// Получаем ссылку на удаляемый документ
ДокументСсылка = Документы.ЗаказПокупателя.НайтиПоНомеру("000000001", ТекущаяДата());

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

Проверка даты запрета изменения данных

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

  1. Перейдем в раздел Администрирование → Настройки пользователей и прав → Даты запрета изменения.
  2. Временно сместим дату запрета на более ранний период относительно даты удаляемого документа либо отключим ее действие для текущего пользователя.
  3. Повторим операцию удаления через стандартное меню.

Проверка ссылочной целостности базы данных

В некоторых случаях ошибка удаления вызвана внутренними нарушениями индексов или наличием скрытых записей в таблицах итогов. Для устранения этих проблем выполним регламентные процедуры обслуживания:

  1. Создадим резервную копию информационной базы.
  2. Откроем Конфигуратор → Администрирование → Тестирование и исправление...
  3. Отметим флажками следующие пункты:
    1. Реиндексация таблиц информационной базы;
    2. Проверка логической целостности;
    3. Проверка ссылочной целостности (с режимом «Очищать ссылки» или «Создавать объекты»).
  4. Нажмем кнопку Выполнить и после завершения процедуры повторим удаление объектов.
← На главную