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

17.07.19

Администрирование - Роли и права

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

 

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

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

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

 

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

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

 

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

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

 

Решение

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

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

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

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

проверка права роли

См. также

SALE! 20%

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 10400 руб.

02.09.2020    122114    670    389    

714

Запрет доступа к данным по зарплате для БП 3.0 и КА 2.5

Зарплата Роли и права Платформа 1С v8.3 Бухгалтерский учет Управление правами 1С:Бухгалтерия 3.0 1С:Комплексная автоматизация 2.х Молдова Россия Казахстан Бухгалтерский учет Платные (руб)

Расширение позволяет максимально полно ограничить доступ пользователей к данным по заработной плате, а именно закрывает доступ к документам начисления и выплаты заработной платы, не позволяет просматривать бухгалтерские отчеты по счету учета зарплаты а также убирает зарплатные проводки из журнала проводок. Расширение запрещает просматривать платежные документы на выплату зарплаты, так же не доступны регламентные отчеты в ПФР и ИФНС. Расширение предлагает готовые настроенные профили "Бухгалтер без зарплаты", "Только просмотр без зарплаты".

5700 руб.

27.05.2021    32730    204    89    

165

Автоподбор ролей для профилей и групп доступа в любых типовых базах 1С УТ 11, КА 2, ERP2, Розница 2/3, УНФ 16/3, БП 3, ЗУП 3 и подобных (УФ, Платформа 8.3.14+)

Инструменты администратора БД Роли и права 8.3.14 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Документооборот 1С:Зарплата и кадры государственного учреждения 3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Роли… Вы тратите много времени и сил на подбор ролей среди около 2400 в ERP или 1500 в Рознице 2, пытаясь понять какими правами они обладают? Вы все время смотрите права в конфигураторе или отчетах чтоб создать нормальные профили доступа? Вы хотите наглядно видеть какие права дает профиль и редактировать все в простом виде? А может хотите просто указать подсистему и дать права на просмотр и добавление на объекты и не лезть в дебри прав и чтоб обработка сама подобрала нужные роли? Все это теперь стало возможно! Обновление от 15.12.2023, версия 1.1.

12000 руб.

06.12.2023    2973    13    1    

34

SALE! 20%

Infostart УДиФ: Управление данными и формами

Инструменты администратора БД Инструментарий разработчика Роли и права Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

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

10000 8000 руб.

10.11.2023    3524    11    1    

34

Расширение для разграничения доступа к контрагентам и обработка для группового назначения доступа для Бухгалтерии (RLS) 3.0.143.42

Роли и права Платформа 1С v8.3 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Расширение предназначено для Бухгалтерии предприятия (версии ПРОФ и КОРП). Типовая конфигурация остается на поддержке. С помощью расширения менеджер по продажам будет иметь доступ к контрагентам и списку их документов только в случае, если он является для них ответственным. Пользователю с полными правами также доступна обработка «Назначение ответственных» для группового добавления/удаления ответственного в карточке контрагента. Есть версия данного расширения для клиентов Fresh - в магазине расширений (Fresh)

9360 руб.

14.09.2022    5759    7    4    

9

Роли для кладовщика

Логистика, склад и ТМЦ Роли и права Платформа 1С v8.3 Бухгалтерский учет Управление правами 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Расширение, которое позволяет использовать отдельные роли для доступа к складским документам, для доступа к документам раздела "Производство" и для доступа к документам раздела "Покупки".

2520 руб.

21.05.2019    1692306    552    192    

133

Универсальная система оповещений в базе или по почте по произвольным условиям, расписанием, ролям и пользователям (Расширение / конфигурация для платформ 8.3.6+, для ЛЮБЫХ баз)

Роли и права Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 11 Платные (руб)

Данная система разработана как альтернатива стандартной системе напоминаний. Но имеет ряд существенных преимуществ: отображение в базе или с отправкой по почте, свое расписание, возможность фильтрации по ролям и пользователям, формирование своих запросов и макетов, шаблоны писем, работа в фоне. А также может блокировать работу пользователей при заданных условиях. Может работать в составе любой конфигурации. Имеется справка с описанием возможностей. (Обновление от 20.02.2024, версия 2.2, расширение)

18000 руб.

29.11.2019    24689    13    8    

33
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. dhurricane 29.06.19 23:18 Сейчас в теме
Признаться, содержание поста я нахожу несколько... странным.

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

Во-вторых, неожиданный путь решения Вы выбрали. Не подошла Вам стандартная функция "УправлениеДоступом.ЕстьРоль" тем, что она первым делом проверяет, полные права ли у пользователя. Не первым ли делом на ум приходит простейший из путей решения проблемы - скопировать функцию, удалив у нее лишние проверки? Опять же, и привязки к Документообороту в этом случае не было бы.
native-api; Jenya78; user960349; О.Ж; +4 Ответить
10. advokat90 16.05.20 18:48 Сейчас в теме
(1) К Документообороту это решение не подходит в текущем его виде, т.к. справочник "ГруппыДоступа" там сейчас не используется.
native-api; Varozh; +2 Ответить
2. ignat013 29.06.19 23:45 Сейчас в теме
Стандартная РольДоступна чем не удовлетворила?
4. ni_cola 331 03.07.19 15:13 Сейчас в теме
(2) В статье написано чем
uralkit@uralkit.ru; Рамзес; k0ketbi4; hasanov; Izumov; +5 Ответить
3. V1V 112 30.06.19 14:24 Сейчас в теме
Пользователи.РолиДоступны() может проверять для выбранного пользователя.
5. ni_cola 331 03.07.19 15:13 Сейчас в теме
(3) Для полноправного не может
6. rudnitskij 05.07.19 12:54 Сейчас в теме
То есть, если у пользователя есть роль Полные права, то функция РольДоступна() вернёт Ложь, даже если ему эта роль назначена через профиль доступа. Поэтому эта функция нам не подходит...
А вот хр.... не совсем так. Или может, не во всех конфигурациях.
А может, не на всех версиях платформы. У меня на 1С:Предприятие 8.3 (8.3.13.1644) возвращает ложь или истина в зависимости от наличия доп прав - при том, что у моего юзера полные права
7. dhurricane 05.07.19 13:00 Сейчас в теме
(6) В конфигурациях на основе БСП в штатном режиме при включении пользователя в предопределенную группу доступа "Администратор", пользователю назначаются только 2 роли: ПолныеПрава и Администрирование. Все остальные отключаются вне зависимости от того, включен ли пользователь в какие-либо еще группы доступа. Поэтому-то функция "РольДоступна" возвращает Ложь.

Возможность назначить такому пользователю нужную роль через конфигуратор конечно остается, но в будущем в определенные моменты она вновь может "слететь".
uralkit@uralkit.ru; Garik8866; Gendelf; sstas007; user809597; pvlunegov; CAH9I; +7 Ответить
15. Cyberhawk 135 03.09.20 21:17 Сейчас в теме
(7)
при включении пользователя в предопределенную группу доступа "Администратор", пользователю назначаются только 2 роли: ПолныеПрава и Администрирование. Все остальные отключаются вне зависимости от того, включен ли пользователь в какие-либо еще группы доступа
Не совсем: роль "Интерактивное открытие внешних отчетов и обработок" не отключается.
Hexed; dhurricane; +2 Ответить
11. bayce 45 15.07.20 20:35 Сейчас в теме
8. korelski 30 05.12.19 08:48 Сейчас в теме
если добавить в свой общий модуль расширения "Функция ЕстьРоль() Экспорт", то система выдаст ошибку, что такая функция уже есть. Поэтому рациональнее использовать свое наименование, что-нибудь на подобии ЕстьРольПользователя( бла бла бла
А так схема рабочая и главное быстродействующая.
Светлый ум; +1 Ответить
9. alex1cm 67 28.04.20 19:04 Сейчас в теме
Эта функция не работает, если пользователь сначала включен в группу пользователей, а потом уже группа пользователей добавлена в профиль пользователя. В этом случае запрос оказывается пустой, как будто у пользователя вообще нет доступных ролей.
16. salikoff 18.10.20 21:51 Сейчас в теме
(9) Совершенно верно, Справочник.ГруппыДоступа.Пользователи имеет составной тип данных, и в качестве значения может иметь тип ГруппыПользователей. Таким образом, для правильной работы запрос должен быть гораздо сложнее того, что представил автор.
12. bayce 45 15.07.20 20:37 Сейчас в теме
Лучше скопировать стандартную функцию УправлениеДоступом.ЕстьРоль() и закомментировать вот эту часть:
//Если Пользователи.ЭтоПолноправныйПользователь(Пользователь) Тогда
// Возврат Истина;
//КонецЕсли;
1c_ssnik; kabantus; legenda-nsh; Dzamba; user960349; user1456656; +6 Ответить
19. user809597 11.02.21 15:24 Сейчас в теме
(12) Возможно, я изобретаю велосипед, но в ДО 2.1.27.1 Справочник.ГруппыДоступа и РегистрСведений.СоставыГруппПользователей уже неактуальны

Поэтому в скопированной ЕстьРоль надо ещё изменить стандартный запрос на
ВЫБРАТЬ ПЕРВЫЕ 1
ИСТИНА КАК ЗначениеИстина
ИЗ
Справочник.РабочиеГруппы.Состав КАК ГруппыДоступаПользователи
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПолномочияПользователей КАК СоставыГруппПользователей
ПО (СоставыГруппПользователей.Владелец = &Пользователь)
И (СоставыГруппПользователей.Владелец = ГруппыДоступаПользователи.Пользователь)
И (НЕ ГруппыДоступаПользователи.Ссылка.ПометкаУдаления)

После этого заработало
belyakooov; +1 Ответить
20. user809597 12.02.21 09:19 Сейчас в теме
(19) ну то есть, ещё с отбором по роли, конечно, и лучше вот так

ВЫБРАТЬ ПЕРВЫЕ 1
	ИСТИНА КАК ЗначениеИстина
ИЗ
	Справочник.РабочиеГруппы.Состав КАК СоставыГруппПользователей
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПолномочияПользователей КАК ПолномочияПользователей
		ПО (ПолномочияПользователей.Владелец = &Пользователь)
			И (ПолномочияПользователей.Владелец = СоставыГруппПользователей.Пользователь)
			И (НЕ СоставыГруппПользователей.Ссылка.ПометкаУдаления)
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.Роли КАК ПрофилиГруппДоступаРоли
		ПО (ПолномочияПользователей.Полномочия = ПрофилиГруппДоступаРоли.Ссылка)
			И (ПрофилиГруппДоступаРоли.Роль.Имя = &Роль)
			И (НЕ ПрофилиГруппДоступаРоли.Ссылка.ПометкаУдаления)
Показать
13. bayce 45 15.07.20 20:39 Сейчас в теме
БСП вообще странно сделано
14. user1454737 25.08.20 17:03 Сейчас в теме
Всегда пользовался функцией РольДоступна (IsInRole)

Синтаксис:
РольДоступна(<Роль>)

Параметры:
<Роль> (обязательный)
Тип: Строка, ОбъектМетаданных: Роль.
Название роли как она задана в конфигураторе или объект описания метаданного роли.
Возвращаемое значение:
Тип: Булево.
Истина - роль доступна текущему пользователю; Ложь - в противном случае.
Описание:
Определяет доступность указанной роли текущему пользователю.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер).
Примечание:
Если передан неверный тип параметра или указано неверное значение, генерируется исключение.
17. kudim 21.10.20 16:12 Сейчас в теме
Спорна сама ситуация когда пользователю с полными правами нужно что-то ограничивать.
Ограничивать в первую очередь нужно количество пользователей с такими правами.
criptid; Рамзес; abadonna83; SinChao; native-api; Mizhgan42; Rega; Gendelf; Izumov; soci0pat; user809597; kamsky93; Fristayla; Dmitri93; +14 Ответить
21. user816558 26.02.21 12:19 Сейчас в теме
(17)
17. kudim 21.10.20 16:12
Спорна сама ситуация когда пользователю с полными правами нужно что-то ограничивать.
Ограничивать в первую очередь нужно количество пользователей с такими правами.


А если посмотреть с другой стороны? Не запрещать, а разрешать:)

Доступ к изменению чего либо при наличии какой либо роли, тогда возникает описанная автором топика потребность в доработки функции.
18. kimkarus 10 21.01.21 11:28 Сейчас в теме
22. Xershi 1474 17.03.21 12:15 Сейчас в теме
Сделал функцию более универсальной и оптимизировал код. Обновите публикацию.
Функция ЕстьРоль(ИмяРоли, Пользователь = Неопределено) Экспорт

	Если Пользователь = Неопределено Тогда
		Пользователь = Пользователи.ТекущийПользователь();
	КонецЕсли;
	
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
	               |	ГруппыДоступаПользователи.Пользователь КАК Пользователь
	               |ИЗ
	               |	Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи
	               |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.Роли КАК ПрофилиГруппДоступаРоли
	               |		ПО ГруппыДоступаПользователи.Ссылка.Профиль = ПрофилиГруппДоступаРоли.Ссылка
	               |ГДЕ
	               |	ПрофилиГруппДоступаРоли.Роль.Имя = &Роль
	               |	И ГруппыДоступаПользователи.Пользователь = &Пользователь
	               |
	               |ОБЪЕДИНИТЬ ВСЕ
	               |
	               |ВЫБРАТЬ
	               |	ГруппыПользователейСостав.Пользователь
	               |ИЗ
	               |	Справочник.ГруппыПользователей.Состав КАК ГруппыПользователейСостав,
	               |	Справочник.ПрофилиГруппДоступа.Роли КАК ПрофилиГруппДоступаРоли,
	               |	Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи
	               |ГДЕ
	               |	ПрофилиГруппДоступаРоли.Роль.Имя = &Роль
	               |	И ГруппыПользователейСостав.Пользователь = &Пользователь
	               |
	               |ОБЪЕДИНИТЬ ВСЕ
	               |
	               |ВЫБРАТЬ
	               |	ГруппыВнешнихПользователейСостав.ВнешнийПользователь
	               |ИЗ
	               |	Справочник.ГруппыВнешнихПользователей.Состав КАК ГруппыВнешнихПользователейСостав
	               |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи
	               |			ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.Роли КАК ПрофилиГруппДоступаРоли
	               |			ПО ГруппыДоступаПользователи.Ссылка.Профиль = ПрофилиГруппДоступаРоли.Ссылка
	               |		ПО ГруппыВнешнихПользователейСостав.Ссылка = ГруппыДоступаПользователи.Пользователь
	               |ГДЕ
	               |	ПрофилиГруппДоступаРоли.Роль.Имя = &Роль
	               |	И ГруппыВнешнихПользователейСостав.ВнешнийПользователь = &Пользователь";
	
	Запрос.УстановитьПараметр("Пользователь",	Пользователь);
	Запрос.УстановитьПараметр("Роль",			ИмяРоли);
	
	УстановитьПривилегированныйРежим(Истина);
	РезультатЗапроса = Запрос.Выполнить();
	УстановитьПривилегированныйРежим(Ложь);
	
	Возврат Не РезультатЗапроса.Пустой();		
	
КонецФункции
Показать
criptid; kabantus; Bahyt; Serg O.; Egovigor; user988448; arshanskiyav; Sergeevich; Светлый ум; join2us; Сто27001; +11 Ответить
23. join2us 15 22.04.21 19:22 Сейчас в теме
(22) применил as is в 1.6.23.117, спс
24. Xershi 1474 22.04.21 21:36 Сейчас в теме
(23) там я кажись напутал с соединениями.
У себя поправил, а тут с ошибкой кажись.
35. aairt 21.03.23 10:27 Сейчас в теме
(24) кажись ты это специально сделал )
40. cheche13 27.07.23 15:08 Сейчас в теме
(24) А можешь написать с исправленными соединениями? Спасибо
41. Xershi 1474 27.07.23 19:24 Сейчас в теме
(40) как раз была задача:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
	ГруппыДоступаПользователи.Пользователь КАК Пользователь
ИЗ
	Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.Роли КАК ПрофилиГруппДоступаРоли
		ПО ГруппыДоступаПользователи.Ссылка.Профиль = ПрофилиГруппДоступаРоли.Ссылка
ГДЕ
	ПрофилиГруппДоступаРоли.Роль.Имя = &Роль
	И ГруппыДоступаПользователи.Пользователь = &Пользователь

ОБЪЕДИНИТЬ ВСЕ

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

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	ГруппыВнешнихПользователейСостав.ВнешнийПользователь
ИЗ
	Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.Роли КАК ПрофилиГруппДоступаРоли
		ПО ГруппыДоступаПользователи.Ссылка.Профиль = ПрофилиГруппДоступаРоли.Ссылка
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыВнешнихПользователей.Состав КАК ГруппыВнешнихПользователейСостав
		ПО ГруппыДоступаПользователи.Пользователь = ГруппыВнешнихПользователейСостав.ВнешнийПользователь
ГДЕ
	ПрофилиГруппДоступаРоли.Роль.Имя = &Роль
	И ГруппыВнешнихПользователейСостав.ВнешнийПользователь = &Пользователь
Показать
kabantus; +1 Ответить
26. Светлый ум 406 09.07.21 12:01 Сейчас в теме
(22) На отрослевках и самописках - самое то!
+ 1
32. dalim 45 16.06.22 10:23 Сейчас в теме
(22)В БГУ 2.0.83.63 работает. Спасибо!
25. ninch 51 07.07.21 12:58 Сейчас в теме
Спасибо. Очень помогло
27. fomix 33 10.08.21 20:39 Сейчас в теме
РольДоступна() и функция из БСП: Пользователи.РолиДоступны() и УправлениеДоступом.ЕстьРоль(), как показала практика полный отстой. Автор + в карму!
Рамзес; Vary; +2 Ответить
28. Artjur 16.08.21 16:46 Сейчас в теме
Спасибо. Все работает как есть на УНФ.
29. Gendelf 15.12.21 09:59 Сейчас в теме
Спасибо, работает на ERP
30. aston7777 17.02.22 15:13 Сейчас в теме
Взял данную
Функция ЕстьРоль(ИмяРоли, Пользователь = Неопределено) Экспорт

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


Запихнул в общий модуль с галочкой сервер. а в модуле менеджера вызываю ее по коду
Если УпроПроПраваДоступа.ЕстьРоль("ОтделЗакупок", Неопределено) тогда
				СтандартнаяОбработка = Ложь;
				ВыбраннаяФорма = "Документ.Заказ.Форма.ФормаЗакупщика";


и в тонком клиенте работает, а в толстом ругается на


Ошибка инициализации модуля: Документ.Заказ.МодульМенеджера
по причине:
{Документ.Заказ.МодульМенеджера(55,8)}: Переменная не определена (УпроПроПраваДоступа)
Если <<?>>УпроПроПраваДоступа.ЕстьРоль("ОтделЗакупок", Неопределено) тогда
31. Astarot 6 29.04.22 09:56 Сейчас в теме
Спасибо. Помогло Ут+CRM
33. belyakooov 24 17.10.22 11:26 Сейчас в теме
Для документооборота такой запрос:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
	1 
	ИЗ
	Справочник.ПрофилиГруппДоступа.Роли КАК ПрофилиГруппДоступаРоли
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПолномочияПользователей КАК ПолномочияПользователей
		ПО (ПолномочияПользователей.Полномочия = ПрофилиГруппДоступаРоли.Ссылка
				И ПрофилиГруппДоступаРоли.Роль.Имя = &Роль
				И ПолномочияПользователей.Владелец = &Пользователь)
Показать
34. vhavagyan 14.12.22 01:21 Сейчас в теме
36. Serg O. 224 05.05.23 10:44 Сейчас в теме
Спасибо за статью, вот уж блин ... засада
конечно логично проверять РольДоступна("какая-то там") ИЛИ РольДоступна("ПолныеПрава")

и как-бы не логично пользователя с полными правами "урезать", так-то оно правильно
Но... реальность далека от идеала.

------------------------------------------------------------------------------------------------
маленький вопрос - зачем в запросе "ВЫБРАТЬ РАЗРЕШЕННЫЕ
если ниже включается
УстановитьПривилегированныйРежим(Истина);
который и так всё видит
37. Serg O. 224 05.05.23 12:01 Сейчас в теме
ещё одна добавочка... в функцию - наверное надо всё-таки проверку стандартную где-то оставить, если роль включена в конфигураторе

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

	Если Пользователь = Неопределено Тогда    
		рез = РольДоступна(ИмяРоли);  // +++ OS стандартная проверка так же может быть (если роль включена в конфигураторе!)
		Если рез Тогда Возврат рез КонецЕсли;
		
		Пользователь = ПользователиКлиентСервер.ТекущийПользователь();
	КонецЕсли;

// ....
КонецФункции
Показать
38. Serg O. 224 05.05.23 14:54 Сейчас в теме
и ещё одна "добавка" .... Пользователь - это не просто Пользователь, а другой справочник - Группа Пользователей
(может только у меня такое в конфигурации КА 2.5 )
+ внизу переключение Привилегированного Режима для пользователя с Полными правами не нужно ...

итоговая функция для замены РольДоступна() на РольДоступнаБСП()

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

	Если Пользователь = Неопределено Тогда    
		рез = РольДоступна(ИмяРоли);  // +++ OS стандартная проверка так же может быть (если роль включена в конфигураторе!)
		Если рез Тогда Возврат рез КонецЕсли;
		
		Пользователь = ПользователиКлиентСервер.ТекущийПользователь();
	КонецЕсли;
	
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ 1 
		|ИЗ
		|	Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.Роли КАК ПрофилиГруппДоступаРоли
		|		ПО ГруппыДоступаПользователи.Ссылка.Профиль = ПрофилиГруппДоступаРоли.Ссылка
		|ГДЕ
		|	ПрофилиГруппДоступаРоли.Роль.Имя = &Роль
		|	И (ГруппыДоступаПользователи.Пользователь = &Пользователь 
		// +++ OS Пользователь = Группа Руководителей!
		|	ИЛИ ГруппыДоступаПользователи.Пользователь В (ВЫБРАТЬ РАЗЛИЧНЫЕ
		|				ГруппаПользователейСостав.Ссылка КАК Группа 
		|			ИЗ Справочник.ГруппыПользователей.Состав КАК ГруппаПользователейСостав
		|			ГДЕ ГруппаПользователейСостав.Пользователь = &Пользователь)
		|	  )";
	Запрос.УстановитьПараметр("Пользователь", Пользователь);
	Запрос.УстановитьПараметр("Роль", ИмяРоли);
	
	Если НЕ РольДоступна("ПолныеПрава") Тогда // +++ OS
		УстановитьПривилегированныйРежим(Истина);
			РезультатЗапроса = Запрос.Выполнить();
		УстановитьПривилегированныйРежим(Ложь);
	Иначе
		РезультатЗапроса = Запрос.Выполнить();
	КонецЕсли;	
	
	Возврат НЕ РезультатЗапроса.Пустой();
КонецФункции
Показать
39. Serg O. 224 15.05.23 13:17 Сейчас в теме
+ заметка к выполнению запроса в Привилегированном Режиме - если он уже установлен, то код его выключит!
чтобы этого не происходило - нужно просто выполнить запрос, а для пользователя с полными прав - Привилегированном Режиме и вовсе не нужен. Само переключение в привелигированный режим и обратно - так же занимает время (и иногда значительное)

Если РольДоступна("ПолныеПрава") Или ПривилегированныйРежим() Тогда // +++ OS чтобы не слетал ПривилегированныйРежим() или есть Полные права
        РезультатЗапроса = Запрос.Выполнить();
    Иначе
        УстановитьПривилегированныйРежим(Истина);
            РезультатЗапроса = Запрос.Выполнить();
        УстановитьПривилегированныйРежим(Ложь);
    КонецЕсли;
42. KostyaBuykevich 31.01.24 10:14 Сейчас в теме
А я просто делаю так:
Если УправлениеДоступом.ЕстьРоль("ОграниченныйДоступКЗаявкамНаОплату") И НЕ УправлениеДоступом.ЕстьРоль("ПолныеПрава") Тогда 
... 
КонецЕсли
43. NNNenenko 06.03.24 14:41 Сейчас в теме
(42) Это хорошо работает, пока не включите разделения доступа к записям и уже функция "УправлениеДоступом.ЕстьРоль()" будет еще требовать в объекте нахождение процедуры ЗаполнитьНаборыЗначенийДоступа, которой очень часто в дорабатываемом объекте нет.
Такие ситуации можно словить, когда например дорабатывается документ (прием на работу, увольнение и тд) в ЗУП под определенную роль и включено разграничение по записям, а вот процедуры ЗаполнитьНаборыЗначенийДоступа в объекте нет, что возвращает ошибку.
Оставьте свое сообщение