При формировании тяжелых отчетов или выполнении фоновых процессов в типовых конфигурациях 1С разработчики и пользователи нередко сталкиваются с исключением: «У пользователя недостаточно прав на исполнение операции над базой данных» со ссылкой на общий модуль ДлительныеОперации. Проанализируем, почему возникает эта ошибка, как локализовать проблемный объект конфигурации и какими способами решить данную проблему.
Рассмотрим типовую ситуацию. В коде общего модуля ДлительныеОперации в процедуре контроля состояния фонового задания происходит перехват ошибки:
Функция ЗаданиеВыполнено(Знач ИдентификаторЗадания) Экспорт
Задание = НайтиЗаданиеПоИдентификатору(ИдентификаторЗадания);
// ...
Если Задание.Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно Тогда
ОшибкаЗадания = Задание.ИнформацияОбОшибке;
Если ОшибкаЗадания <> Неопределено Тогда
ПоказатьПолныйТекстОшибки = Истина;
КонецЕсли;
// ...
Если ПоказатьПолныйТекстОшибки Тогда
ТекстОшибки = КраткоеПредставлениеОшибки(Задание.ИнформацияОбОшибке);
ВызватьИсключение(ТекстОшибки);
КонецЕсли;
КонецФункции
Строка ВызватьИсключение(ТекстОшибки) лишь транслирует ошибку, которая произошла внутри изолированного фонового сеанса. Настоящая причина скрыта глубже: фоновое задание попыталось прочитать или изменить данные, на которые у пользователя не хватает прав.
Разберем основные факторы, приводящие к падению фонового задания по правам доступа:
РАЗРЕШЕННЫЕ. Если в тексте запроса схемы компоновки данных (СКД) отсутствует директива РАЗРЕШЕННЫЕ, платформа формирует выборку по всей таблице. Как только в результат попадает строка, закрытая RLS (например, по определенной организации, ЦФО или подразделению), платформа прерывает выполнение и выбрасывает исключение. При наличии слова РАЗРЕШЕННЫЕ недоступные строки просто исключаются из результата.Регистратор или субконто. Если у пользователя нет базового права «Чтение» хотя бы на один тип документа, который может выступать регистратором в выбранном периоде, обращение к его реквизитам вызовет ошибку прав доступа.Для устранения ошибки нам необходимо выяснить, к какой именно таблице или полю база данных ограничила доступ. Разберем по шагам, как локализовать сбой.
Отладка - Подключение - Автоматическое подключение - Фоновые задания. В меню Отладка - Настройка останова по ошибке включим флаг «Останавливаться по ошибке». Это позволит остановиться непосредственно на строке упавшего запроса внутри фонового задания, не доходя до общего модуля ДлительныеОперации.QERR и EXCP. Событие QERR зафиксирует текст запроса и внутреннее имя таблицы СУБД, на которой произошел сбой RLS.После того как проблемный объект и контекст вызова определены, рассмотрим варианты исправления ситуации.
1. Корректировка запросов СКД и добавление РАЗРЕШЕННЫЕ
Проанализируем текст запроса набора данных в отчете. Добавим во все секции ВЫБРАТЬ ключевое слово РАЗРЕШЕННЫЕ. Для безопасного обращения к полям составного типа используем приведение типов:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
Обороты.Счет КАК Счет,
Обороты.Субконто1 КАК Статья,
ВЫРАЗИТЬ(Обороты.Регистратор КАК Документ.БюджетнаяОперация) КАК Регистратор,
Обороты.СуммаОборот КАК Сумма
ИЗ
РегистрБухгалтерии.Бюджетирование.Обороты(&НачалоПериода, &КонецПериода, Авто, , , , ) КАК Обороты
2. Проверка ролей, профилей и групп доступа
Если пользователю действительно необходимы эти данные, перейдем в администрирование пользователей. Проверим, назначены ли права «Чтение» и «Просмотр» на все типы документов-регистраторов, входящих в состав регистра. В пользовательском режиме проверим настройки групп доступа: убедимся, что пользователю назначены корректные значения по видам доступа (организации, подразделения, сценарии бюджетирования).
3. Выполнение операций в привилегированном режиме
Если отчет формирует сводные показатели, где не требуется детальная проверка прав на отдельные строки и документы, вынесем формирование результата в процедуру привилегированного общего модуля или программно включим привилегированный режим:
УстановитьПривилегированныйРежим(Истина);
// Формирование отчета или чтение агрегированных данных
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
УстановитьПривилегированныйРежим(Ложь);
4. Обновление вспомогательных данных RLS
В конфигурациях на базе БСП при несоответствии прав на рабочей базе запустим регламентное задание Заполнение данных для ограничения доступа. Это пересчитает регистры ключей доступа и устранит ошибки расхождения прав.