Как получить тарифную ставку сотрудника в 1С:ЗУП 3.1 под пользователем с ограниченными правами?

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

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

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

Выясняем причину: как работает механизм получения кадровых данных

Для начала проанализируем, как в современных версиях 1С:ЗУП 3.1 реализовано получение сведений о сотрудниках. Для этих целей используется специализированная экспортная функция КадровыйУчет.КадровыеДанныеСотрудников. Этот программный интерфейс обращается к различным периодическим регистрам сведений, динамически формируя сложные запросы.

Поведение функции напрямую зависит от ее первого параметра — ТолькоРазрешенные. Рассмотрим два сценария работы системы при его использовании под пользователем с ограниченными правами:

  1. Когда первый параметр ТолькоРазрешенные = Истина:
    В этом случае платформа автоматически добавляет в итоговый SQL-запрос ключевое слово РАЗРЕШЕННЫЕ. Если у пользователя настроен механизм RLS (ограничение доступа на уровне записей) и в его профиле отсутствуют права на чтение конкретного сотрудника, его оклада или плановых начислений, система не прерывает работу аварийно. Она просто молча исключает запрещенные данные из выборки. На выходе мы получаем пустую строку или значение по умолчанию, из-за чего ТарифнаяСтавка возвращает 0.
  2. Когда первый параметр ТолькоРазрешенные = Ложь:
    В данном сценарии запрос выполняется без конструкции РАЗРЕШЕННЫЕ. Система пытается прочитать данные напрямую из таблиц базы данных. Так как у текущего пользователя физически нет прав доступа к этим регистрам или справочникам, платформа незамедлительно блокирует операцию и генерирует системную ошибку нарушения прав доступа.

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

Решение проблемы: правильное применение привилегированного режима

Для обхода ограничений прав доступа в платформе 1С:Предприятие 8 предусмотрен механизм работы в привилегированном режиме. Он позволяет временно отключить проверку прав доступа (включая RLS) для выполняемого участка кода.

Рассмотрим по шагам алгоритм правильной реализации этой задачи во внешней обработке:

  1. Перенос кода на сервер: Включение привилегированного режима невозможно выполнить на стороне клиента. Весь код, отвечающий за выборку данных, должен располагаться в модуле объекта внешней обработки либо в серверной процедуре формы с директивой &НаСервере.
  2. Включение режима: Перед вызовом функции получения кадровых данных необходимо вызвать инструкцию УстановитьПривилегированныйРежим(Истина).
  3. Запрос данных: В саму функцию КадровыеДанныеСотрудников в качестве первого параметра мы обязательно передаем Ложь. Поскольку в данный момент код выполняется в привилегированном режиме, система проигнорирует отсутствие прав у текущего пользователя и успешно вернет реальное значение оклада из базы данных.
  4. Выключение режима: Сразу после получения данных крайне важно вернуть исходное состояние безопасности системы, вызвав УстановитьПривилегированныйРежим(Ложь). Это исключит потенциальные уязвимости в последующем коде.

Практический пример реализации кода

Посмотрим на пример программной реализации. Создадим серверную функцию во внешней обработке, которая принимает ссылку на сотрудника и возвращает его тарифную ставку на определенную дату:


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

Важные архитектурные нюансы в 1С:ЗУП 3.1

При работе с механизмами кадрового учета в ЗУП 3.1 рекомендуем всегда учитывать следующие важные особенности платформы и конфигурации:

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

← На главную