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