Как исправить ошибку «У пользователя недостаточно прав на исполнение операции над базой данных» при выполнении длительных операций?

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

При формировании тяжелых отчетов или выполнении фоновых процессов в типовых конфигурациях 1С разработчики и пользователи нередко сталкиваются с исключением: «У пользователя недостаточно прав на исполнение операции над базой данных» со ссылкой на общий модуль ДлительныеОперации. Проанализируем, почему возникает эта ошибка, как локализовать проблемный объект конфигурации и какими способами решить данную проблему.

Рассмотрим типовую ситуацию. В коде общего модуля ДлительныеОперации в процедуре контроля состояния фонового задания происходит перехват ошибки:


Функция ЗаданиеВыполнено(Знач ИдентификаторЗадания) Экспорт
    Задание = НайтиЗаданиеПоИдентификатору(ИдентификаторЗадания);
    // ...
    Если Задание.Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно Тогда
        ОшибкаЗадания = Задание.ИнформацияОбОшибке;
        Если ОшибкаЗадания <> Неопределено Тогда
            ПоказатьПолныйТекстОшибки = Истина;
        КонецЕсли;
    // ...
    Если ПоказатьПолныйТекстОшибки Тогда
        ТекстОшибки = КраткоеПредставлениеОшибки(Задание.ИнформацияОбОшибке);
        ВызватьИсключение(ТекстОшибки);
    КонецЕсли;
КонецФункции

Строка ВызватьИсключение(ТекстОшибки) лишь транслирует ошибку, которая произошла внутри изолированного фонового сеанса. Настоящая причина скрыта глубже: фоновое задание попыталось прочитать или изменить данные, на которые у пользователя не хватает прав.

Выясним причины возникновения ошибки

Разберем основные факторы, приводящие к падению фонового задания по правам доступа:

  1. Ограничение доступа на уровне записей (RLS) без указания ключевого слова РАЗРЕШЕННЫЕ. Если в тексте запроса схемы компоновки данных (СКД) отсутствует директива РАЗРЕШЕННЫЕ, платформа формирует выборку по всей таблице. Как только в результат попадает строка, закрытая RLS (например, по определенной организации, ЦФО или подразделению), платформа прерывает выполнение и выбрасывает исключение. При наличии слова РАЗРЕШЕННЫЕ недоступные строки просто исключаются из результата.
  2. Неявное обращение к связанным объектам через точку (разыменование ссылок). В отчетах (например, в бюджетных отчетах или оборотно-сальдовых ведомостях) часто выводятся поля составного типа, такие как Регистратор или субконто. Если у пользователя нет базового права «Чтение» хотя бы на один тип документа, который может выступать регистратором в выбранном периоде, обращение к его реквизитам вызовет ошибку прав доступа.
  3. Разница в составе данных между рабочими и тестовыми базами. Часто на тестовой копии базы отчет формируется успешно, а на рабочей падает через 10–15 секунд после старта. Это объясняется тем, что в рабочей базе присутствуют реальные закрытые документы или актуализированы таблицы ключей доступа (механизм производительного RLS), с которыми и сталкивается запрос.
  4. Инициализация параметров сеанса в фоновом задании. Фоновое задание запускается в отдельном сеансе на сервере. Если параметры сеанса, участвующие в шаблонах RLS, инициализируются кодом на клиенте, фоновое задание получит пустые значения параметров, что приведет к блокировке доступа ко всем записям.

Методы точной диагностики проблемы

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

  1. Анализ журнала регистрации по событиям отказа в доступе. Не следует ограничиваться фильтром по событию «Ошибка выполнения». Перейдем в журнал регистрации и установим отбор по событию «Доступ. Отказ в доступе». В поле «Метаданные» платформа явно зафиксирует имя таблицы, а в поле «Данные» — конкретное заблокированное право.
  2. Отключение перехвата исключений при отладке. В конфигураторе подключим автоматическую отладку фоновых заданий через меню Отладка - Подключение - Автоматическое подключение - Фоновые задания. В меню Отладка - Настройка останова по ошибке включим флаг «Останавливаться по ошибке». Это позволит остановиться непосредственно на строке упавшего запроса внутри фонового задания, не доходя до общего модуля ДлительныеОперации.
  3. Синхронный запуск отчета. Временно отключим признак фонового выполнения в настройках отчета или в форме отчета, вызвав компоновку синхронно. В таком случае платформа выведет полный стек вызовов с указанием конкретной строки схемы компоновки данных.
  4. Настройка технологического журнала. Для глубокого анализа настроим сбор событий QERR и EXCP. Событие QERR зафиксирует текст запроса и внутреннее имя таблицы СУБД, на которой произошел сбой RLS.

Способы устранения ошибки

После того как проблемный объект и контекст вызова определены, рассмотрим варианты исправления ситуации.

1. Корректировка запросов СКД и добавление РАЗРЕШЕННЫЕ

Проанализируем текст запроса набора данных в отчете. Добавим во все секции ВЫБРАТЬ ключевое слово РАЗРЕШЕННЫЕ. Для безопасного обращения к полям составного типа используем приведение типов:


ВЫБРАТЬ РАЗРЕШЕННЫЕ
    Обороты.Счет КАК Счет,
    Обороты.Субконто1 КАК Статья,
    ВЫРАЗИТЬ(Обороты.Регистратор КАК Документ.БюджетнаяОперация) КАК Регистратор,
    Обороты.СуммаОборот КАК Сумма
ИЗ
    РегистрБухгалтерии.Бюджетирование.Обороты(&НачалоПериода, &КонецПериода, Авто, , , , ) КАК Обороты

2. Проверка ролей, профилей и групп доступа

Если пользователю действительно необходимы эти данные, перейдем в администрирование пользователей. Проверим, назначены ли права «Чтение» и «Просмотр» на все типы документов-регистраторов, входящих в состав регистра. В пользовательском режиме проверим настройки групп доступа: убедимся, что пользователю назначены корректные значения по видам доступа (организации, подразделения, сценарии бюджетирования).

3. Выполнение операций в привилегированном режиме

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


УстановитьПривилегированныйРежим(Истина);
// Формирование отчета или чтение агрегированных данных
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
УстановитьПривилегированныйРежим(Ложь);

4. Обновление вспомогательных данных RLS

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

← На главную