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