В процессе эксплуатации конфигурации «1С:Зарплата и Управление Персоналом» (редакция 3.0) пользователи с ограниченными правами (не администраторы) могут столкнуться с ошибкой при попытке сформировать штатные кадровые отчеты, в частности отчет «Образования сотрудников». Ошибка блокирует формирование отчета и выдает сообщение о недостатке прав доступа, даже если все необходимые профили групп доступа, казалось бы, настроены корректно.
В этой статье мы подробно разберем причины возникновения ошибки У пользователя недостаточно прав на исполнение операции над базой данных, рассмотрим рабочий метод устранения проблемы через настройки отчета, а также изучим универсальный алгоритм отладки сложных проблем с правами RLS (Record Level Security) в отчетах на базе СКД.
Ситуация выглядит следующим образом: Администратор системы формирует отчет без проблем. Однако, когда пользователь с настроенными профилями (например, Кадровик расчетчик) пытается нажать кнопку «Сформировать», процесс прерывается критической ошибкой.
Типичный текст ошибки выглядит так:
{ОбщийМодуль.ВариантыОтчетов.Модуль(1616)}: Ошибка при вызове метода контекста (СкомпоноватьРезультат)
по причине: Ошибка исполнения отчета
по причине: Ошибка при выполнении обработчика - 'ПриКомпоновкеРезультата'
по причине: {ОбщийМодуль.ЗарплатаКадрыОтчеты.Модуль(334)}: Ошибка при вызове метода контекста (Вывести)
...
по причине: У пользователя недостаточно прав на исполнение операции над базой данных.
Анализ Журнала регистрации часто не дает конкретики, указывая лишь на сам факт отказа в доступе, но не на конкретную таблицу или запись, вызвавшую конфликт.
Проблема кроется в механизме ограничения прав доступа на уровне записей (RLS) в старых редакциях ЗУП (версии 3.0 и ранних 3.1). Отчет «Образования сотрудников» строится на базе данных физических лиц. В системе права часто разграничиваются по Организациям или Подразделениям (Группы доступа физических лиц).
Когда отчет запускается без явных отборов, система пытается выполнить запрос ко всей базе данных. В процессе компоновки данных (СКД) происходят следующие процессы:
Особенность заключается в том, что даже конструкции ВЫБРАТЬ РАЗРЕШЕННЫЕ в тексте запроса могут не спасти, если ошибка возникает на этапе вычисления полей или обращения к связанным таблицам в общих модулях, которые достраивают запрос динамически.
Самым быстрым и эффективным решением, которое не требует вмешательства в код конфигурации, является корректная настройка фильтров в пользовательском режиме.
Как выяснилось в ходе анализа, ошибка провоцируется попыткой системы обратиться к пустому значению подразделения или к подразделениям, недоступным пользователю, при формировании полного списка.
Что нужно сделать:
Суть метода заключается в том, что явный отбор физически исключает из выборки «проблемные» записи (например, уволенных сотрудников без актуального подразделения или сотрудников с пустыми ссылками) до того, как система попытается получить их представления и проверить права RLS.
Если поле «Подразделение» не выведено в шапку отчета, его необходимо добавить через расширенные настройки:
Если простое добавление отбора не помогает, или вы столкнулись с аналогичной проблемой в другом отчете, необходимо точно определить, на какой таблице или записи «спотыкается» платформа. Для этого мы воспользуемся методикой перехвата запроса СКД и его выполнения в консоли запросов под ограниченным пользователем.
Разберем этот процесс по шагам.
Для выполнения этих действий вам понадобятся полные права (или доступ к конфигуратору) и возможность запускать внешние обработки.
/debug или флаг «Разрешить отладку» в настройках сервера 1С).Нам нужно перехватить запрос в тот момент, когда он уже полностью сформирован компоновщиком, но еще не выполнен.
Откройте общий модуль, отвечающий за компоновку отчетов. В ЗУП 3.0 это обычно ЗарплатаКадрыОтчеты или модуль объекта самого отчета. Согласно стеку ошибки, проблема возникает в методе ПриКомпоновкеРезультата.
Найдите в модуле отчета процедуру:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
// ... какой-то код ...
ЗарплатаКадрыОтчеты.ПриКомпоновкеРезультатаВТабличныйДокумент(ЭтотОбъект, ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка);
КонецПроцедуры
Поставьте точку останова (F9) на строке вызова ЗарплатаКадрыОтчеты.ПриКомпоновкеРезультатаВТабличныйДокумент или внутри неё, перед тем как происходит выполнение.
Запустите отчет в режиме «1С:Предприятие» под отладкой. Когда сработает точка останова, нам нужно «вытащить» итоговый запрос.
В окне «Вычислить выражение» (Shift+F9) обратитесь к схеме компоновки данных:
ЭтотОбъект.СхемаКомпоновкиДанных.НаборыДанных.Данные.Запрос (путь может отличаться в зависимости от имени набора данных в схеме).
ЭтотОбъект.СхемаКомпоновкиДанных.Параметры или настройки компоновщика. Запишите значения ключевых параметров.Теперь самое важное — воспроизведение ошибки в изолированной среде.
Консоль запросов выдаст ошибку доступа. Но, в отличие от общего сообщения в отчете, здесь можно попытаться упрощать запрос.
Методика локализации:
ЛЕВОЕ СОЕДИНЕНИЕ).В рассмотренном случае (сообщения 16 и 17) проблема была связана с механизмом замены представлений. В ЗУП многие отчеты используют конструкцию, где вместо прямых ссылок выводятся их строковые представления для удобства.
Если в настройках СКД для поля (например, «Подразделение») не отключено использование представлений, и при этом не стоит отбор, система пытается построить запрос вида:
ВЫБРАТЬ
Сотрудник,
ПРЕДСТАВЛЕНИЕ(Подразделение)
ИЗ ...
При наличии RLS, если Подразделение является ПустойСсылкой или ссылкой на объект вне зоны видимости пользователя, функция ПРЕДСТАВЛЕНИЕ() может вызвать исключение безопасности, так как она пытается прочитать данные объекта для формирования строки.
Установка отбора:
ГДЕ Подразделение = &НужноеПодразделение
позволяет отсечь все недоступные и пустые ссылки еще на уровне фильтрации записей СУБД, до того как платформа попытается сформировать представления для результата.
Если вы столкнулись с ошибкой прав доступа в типовых отчетах ЗУП 3.0: