Имя: Пароль:
1C
1С v8
прверка РольДоступна() на клиенте Бухгалтерия 3.0
,
0 Новый1сник2
 
14.11.22
12:50
Доброго дня!

подскажите, как проверить РольДоступна() на клиенте. выдает ошибку

{ОбщийМодуль.ОбщегоНазначенияКлиентСервер.Модуль(2865,8)}: Процедура или функция с указанным именем не определена (РольДоступна)
        Если <<?>>РольДоступна("АдминистраторСистемы") Тогда (Проверка: Тонкий клиент)
1 Мимохожий Однако
 
14.11.22
12:52
Ты пытаешься на клиенте получить серверную функцию
2 timurhv
 
14.11.22
12:54
Пользователи.РолиДоступны()
3 Aleksey
 
14.11.22
12:56
При использовании в конфигурации Библиотеки стандартных подсистем (БСП) следует использовать функцию РолиДоступны общего модуля Пользователи:
Например, без использования БСП:

Если РольДоступна(...) Или <ЭтоПолноправныйПользователь> Или ПривилегированныйРежим() Тогда ...

Либо аналогичная проверка с использованием БСП:

Если Пользователи.РолиДоступны(...) Тогда ...
(с) https://its.1c.ru/db/v8std/content/737/hdoc
4 ass1c
 
14.11.22
12:56
(2) у модуля "Пользователи" вроде нет флага "ВызовСервера"
5 Новый1сник2
 
14.11.22
13:00
(3)  Если Пользователи.РолиДоступны(...) Тогда
применяется к текущему пользователю? или пользователя нужно как то указать?
6 Aleksey
 
14.11.22
13:01
(5) ну это же процедура из БСП, открой конфигуратор и увидишь
7 Aleksey
 
14.11.22
13:02
Результат = Пользователи.РолиДоступны(ИменаРолей, Пользователь, УчитыватьПривилегированныйРежим);
РолиДоступны = Пользователи.РолиДоступны("ПолныеПрава, БазовыеПрава");

(с) https://its.1c.ru/db/bsp315doc/content/1676/hdoc
8 Aleksey
 
14.11.22
13:04
(4) судя по документации

Доступность
Сервер, Толстый клиент, Внешнее соединение

Т.е. как раз на тонком клиенте не будет работать, а на сервере вполне
9 Новый1сник2
 
14.11.22
13:06
Результат = Пользователи.РолиДоступны("АдминистраторСистемы", <<?>>ПараметрыСеанса.ТекущийПользователь); (Проверка: Тонкий клиент)
10 Новый1сник2
 
14.11.22
13:07
(8) на сервере и просто РольДоступна() работает
11 Aleksey
 
14.11.22
13:11
(10) кто бы спорил.
Я тебе просто привел цитату из стандартов разработки + документация БСП
Что по стандартам при использовании БСП рекомендуется использовать Пользователи.РолиДоступны(), которые доступны только на сервере

А там дальше уже сам думай что тебе делать с этой информацией, или проигнорировать или топать на сервер и там спрашивать.
В любом случае у тонкого клиента только форма, нет доступа к объектам, а значит за доступностью к объектам тебе по любому нужно топать на сервер
12 FIXXXL
 
14.11.22
13:11
(9) сделай в форме функцию &НаСервереБезКонтекста и дергай ее с клиента
13 Новый1сник2
 
14.11.22
13:20
(12) там не форма, общий модуль, и &НаСервереБезКонтекста, проверял, не работает
14 Новый1сник2
 
14.11.22
13:25
вот так вроде работает

    Если М_Общий.ЕстьРоль("АдминистраторСистемы",ПользователиКлиентСервер.ТекущийПользователь()) Тогда
            Отказ = Ложь;
    Иначе
        Отказ = Истина;
    КонецЕсли;
15 Новый1сник2
 
14.11.22
13:26
эту функцию добавил в М_Общий

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

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

Функция ЕстьПраво(ИмяРоли) Экспорт
    
    Возврат РольДоступна(ИмяРоли) ИЛИ ЕстьПравоПолныеПрава();
    
КонецФункции // ЕстьПраво()

Функция ЕстьПравоПолныеПрава() Экспорт
    
    Возврат РольДоступна("ПолныеПрава");
    
КонецФункции // ЕстьПравоПолныеПрава()
18 FIXXXL
 
14.11.22
13:39
(13) ну сделай свой модуль-прокладку с галкой ВызовСервера
19 Новый1сник2
 
14.11.22
13:43
сделал уже как (15), проверил работает
20 Новый1сник2
 
14.11.22
13:44
благодарю за подсказки