Почему при удалении помеченных объектов под полными правами возникает ошибка «Нарушение прав доступа» и как её исправить?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При обслуживании и очистке информационных баз на базе современных типовых конфигураций (таких как 1С:Управление торговлей 11, 1С:ERP, 1С:Комплексная автоматизация) администраторы и программисты нередко сталкиваются с парадоксальной ситуацией: пользователь с полными административными правами пытается удалить помеченные на удаление документы, но система блокирует операцию ошибкой «Нарушение прав доступа».

Разберем детально механизм возникновения этой ошибки и рассмотрим проверенные способы её решения как в пользовательском режиме, так и программно.

Выясним причину: почему полных прав оказывается недостаточно

Проанализируем архитектурные особенности платформы «1С:Предприятие» и механизмов Библиотеки стандартных подсистем (БСП):

  1. Каскадная очистка движений и подчиненных объектов. При физическом удалении документа система автоматически выполняет удаление записей во всех регистрах (накопления, сведений, бухгалтерии), где документ выступает регистратором, а также удаляет подчиненные объекты (присоединенные файлы, задачи, версионирование). Если в конфигурации включено ограничение на уровне записей (RLS), проверка прав инициируется на каждый зависимый объект.
  2. Разница между стандартным удалением платформы и обработкой БСП. Стандартный сервис платформы (пункт меню Все функции — Стандартные — Удаление помеченных объектов) запускает удаление напрямую в сеансе пользователя с полным контролем ограничений RLS и вызовом пользовательских подписок на события. Если обработчики событий обращаются к служебным данным без привилегированного контекста, платформа фиксирует нарушение прав. Встроенная же прикладная обработка конфигурации выполняет физическое удаление в серверных процедурах в привилегированном режиме.
  3. Неактуальность служебных таблиц прав доступа. В типовых решениях права доступа к объектам рассчитываются динамически и кэшируются в специальных регистрах сведений (ключи доступа, наборы значений доступа). Если фоновые задания обновления прав не успели обработать измененные или помеченные объекты, возникает несоответствие прав при попытке модификации.

Способ 1. Использование встроенной обработки конфигурации вместо стандартной функции

Самое простое и эффективное решение в пользовательском режиме — запустить специализированную обработку, входящую в состав конфигурации, а не стандартный сервисный механизм платформы:

  1. Откроем главное меню и перейдем в раздел Функции для технического специалиста (или Все функции).
  2. Раскроем ветку Обработки (обратите внимание: не ветку «Стандартные», а именно «Обработки»).
  3. Найдем и откроем обработку Удаление помеченных объектов.
  4. Выберем режим удаления (полное или выборочное) и запустим процедуру.

Встроенная обработка конфигурации разработана с учетом архитектуры БСП: она корректно очищает ссылки, инициирует удаление в привилегированном режиме на сервере и обходит ограничения RLS, вызывающие ошибку прав доступа.

Способ 2. Программное удаление объектов в привилегированном режиме

Если мы разрабатываем собственную внешнюю обработку или скрипт регламентной очистки базы, стандартного метода Объект.Удалить() в пользовательском контексте будет недостаточно. Посмотрим на типичный ошибочный пример:


Выборка = Документы.РеализацияТоваровУслуг.Выбрать();
Пока Выборка.Следующий() Цикл
    ДокОбъект = Выборка.ПолучитьОбъект();
    Если ДокОбъект.ПометкаУдаления Тогда
        ДокОбъект.Удалить(); // Вызовет ошибку "Нарушение прав доступа" при включенном RLS
    КонецЕсли;
КонецЦикла;

Чтобы исключить влияние RLS и блокировок прав при каскадном удалении связанных регистров, программный код необходимо выполнять с установкой привилегированного режима. Рассмотрим корректный пример реализации серверной процедуры:


УстановитьПривилегированныйРежим(Истина);

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

УстановитьПривилегированныйРежим(Ложь);

Использование метода УстановитьПривилегированныйРежим(Истина) временно отключает проверку прав доступа и RLS на время выполнения серверного кода, что гарантирует успешное удаление объекта и его движений.

Способ 3. Обновление служебных данных ограничения доступа

Если ошибка возникает регулярно даже при стандартных операциях записи или удаления, проанализируем состояние регламентных заданий подсистемы управления доступом:

  1. Перейдем в раздел НСИ и администрирование — Обслуживание — Регламентные операции.
  2. Найдем регламентное задание Обновление данных ограничения доступа (или Заполнение данных для ограничения доступа).
  3. Запустим задание вручную и дождемся его успешного завершения.

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

← На главную