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