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