Проверка наличия роли у пользователя

Допустим, мы добавили новую роль в конфигурацию. Потом добавили её в профиль группы доступа и назначили соответствующую группу доступа пользователю. Однако, в конфигурациях на основе БСП все известные программные проверки данной роли при включении пользователя в предопределенную группу доступа «Администраторы» не работают. В статье приведено решение данной задачи.

 

Проверка с помощью функции глобального контекста РольДоступна()

Если в программном коде необходимо проверить установлена ли какая-либо роль у текущего пользователя, то можно воспользоваться функцией глобального контекста РольДоступна(<Роль>), которая возвращает значение Истина, если указанная в скобках роль доступна и Ложь, если не доступна. 

Однако, в конфигурациях на основе БСП при включении пользователя в предопределенную группу доступа Администраторы, пользователю назначаются только две роли: Полные права и Администрирование (в этом можно убедиться с помощью Конфигуратора: Администрирование — Пользователи — Пользователь — Прочие). Все остальные роли отключаются вне зависимости от того, включен ли пользователь в какие-либо еще группы доступа. Система считает, что другие роли этому пользователю не нужны. Поэтому функция РольДоступна() возвращает в этом случае Ложь, что не подходит для решения нашей задачи.

 

Проверка с помощью функций БСП

Проверить наличие роли можно также с помощью функций БСП: Пользователи.РолиДоступны() и УправлениеДоступом.ЕстьРоль(). Но данные функции для полноправного пользователя (с ролями Полные права или Администратор системы) вернут всегда Истину независимо от того, назначена ли данная роль пользователю или нет:

 

Можно было пойти по легкому пути, скопировать данные функции и убрать в них проверку на полноправного пользователя, но мы не ищем легких путей это бы нам не помогло, так как функция Пользователи.РолиДоступны() все равно используют функцию глобального контекста РольДоступна(), а функция УправлениеДоступом.ЕстьРоль() слишком громоздка (текст функции около 300 строк при этом текст основного запроса около 200 строк).

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

 

Решение

Для решения этой задачи в любой конфигурации на базе БСП я использую свою функцию:

Функция ЕстьРоль(ИмяРоли, Пользователь = Неопределено) Экспорт

Если Пользователь = Неопределено Тогда
Пользователь = ПользователиКлиентСервер.ТекущийПользователь();
КонецЕсли;

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| 1
|ИЗ
| Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи
|  ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.Роли КАК ПрофилиГруппДоступаРоли
|  ПО ГруппыДоступаПользователи.Ссылка.Профиль = ПрофилиГруппДоступаРоли.Ссылка
|ГДЕ
| ПрофилиГруппДоступаРоли.Роль.Имя = &Роль
| И ГруппыДоступаПользователи.Пользователь = &Пользователь";

Запрос.УстановитьПараметр("Пользователь", Пользователь);
Запрос.УстановитьПараметр("Роль", ИмяРоли);

УстановитьПривилегированныйРежим(Истина);
РезультатЗапроса = Запрос.Выполнить();
УстановитьПривилегированныйРежим(Ложь);

Если РезультатЗапроса.Пустой() Тогда
Возврат Ложь;
Иначе
Возврат Истина;
КонецЕсли;

КонецФункции

Буду признателен, если Вы будите делиться своим опытом решения данной задачи.

8 Comments

  1. dhurricane

    Признаться, содержание поста я нахожу несколько… странным.

    Во-первых, Вы до самого конца почему-то не указывали, что решение подходит лишь для Документооборота. В БСП нет регистра «ПолномочияПользователей», а значит его нет и во-многих других типовых конфигурациях. Кажется, что в подобном случае правильнее было бы указать целевую конфигурацию если уж не в заголовке, то хотя бы в аннотации к посту.

    Во-вторых, неожиданный путь решения Вы выбрали. Не подошла Вам стандартная функция «УправлениеДоступом.ЕстьРоль» тем, что она первым делом проверяет, полные права ли у пользователя. Не первым ли делом на ум приходит простейший из путей решения проблемы — скопировать функцию, удалив у нее лишние проверки? Опять же, и привязки к Документообороту в этом случае не было бы.

    Reply
  2. ignat013

    Стандартная РольДоступна чем не удовлетворила?

    Reply
  3. V1V

    Пользователи.РолиДоступны() может проверять для выбранного пользователя.

    Reply
  4. ni_cola

    (2) В статье написано чем

    Reply
  5. ni_cola

    (3) Для полноправного не может

    Reply
  6. rudnitskij

    То есть, если у пользователя есть роль Полные права, то функция РольДоступна() вернёт Ложь, даже если ему эта роль назначена через профиль доступа. Поэтому эта функция нам не подходит…

    А вот хр…. не совсем так. Или может, не во всех конфигурациях.

    А может, не на всех версиях платформы. У меня на 1С:Предприятие 8.3 (8.3.13.1644) возвращает ложь или истина в зависимости от наличия доп прав — при том, что у моего юзера полные права

    Reply
  7. dhurricane

    (6) В конфигурациях на основе БСП в штатном режиме при включении пользователя в предопределенную группу доступа «Администратор», пользователю назначаются только 2 роли: ПолныеПрава и Администрирование. Все остальные отключаются вне зависимости от того, включен ли пользователь в какие-либо еще группы доступа. Поэтому-то функция «РольДоступна» возвращает Ложь.

    Возможность назначить такому пользователю нужную роль через конфигуратор конечно остается, но в будущем в определенные моменты она вновь может «слететь».

    Reply
  8. korelski

    если добавить в свой общий модуль расширения «Функция ЕстьРоль() Экспорт», то система выдаст ошибку, что такая функция уже есть. Поэтому рациональнее использовать свое наименование, что-нибудь на подобии ЕстьРольПользователя( бла бла бла

    А так схема рабочая и главное быстродействующая.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *