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