Имя: Пароль:
1C
1С v8
Запрет редактирования если нет специальной Роли
,
0 Amig0_0
 
14.04.20
15:19
Добрый день, уважаемые.
Такая задача:

Есть не типовая роль. Если она есть у пользователя, он может редактировать документ, если нет - не может. Легко проверяется с помощью РольДоступна(). Но помимо этого этот документ может редактировать человек с ролью "Главный бухгалтер" и вот эта роль уже создана в Предприятии. https://yadi.sk/i/VDbb-hWKMEdmkA
Эту роль РольДоступна() не видит, а функция БСП ЕстьРоль() всегда возвращает ИСТИНА, если пользователь полноправный. Комментирование кусочка проверяющего на полноправность

//
Если Пользователи.ЭтоПолноправныйПользователь(Пользователь) Тогда
//Возврат Истина;
КонецЕсли;
//

приводит к исключительной ситуации.

https://yadi.sk/i/pHand1jcvpS6hQ

Мне кажется, что я полез не в ту степь. Кто-нибудь сталкивался с подобными решениями? Заранее спасибо!
1 Amig0_0
 
14.04.20
15:21
БУХ для Бел.2.1
2 AAA
 
14.04.20
15:39
Как вариант, можно сделать расширение, в котором переопределить метод модуля менеджера пользователей ЭтоПолноправныйПользователь(Пользователь). В нем и учесть эту специальную роль
3 Amig0_0
 
14.04.20
15:53
(2) Да, как вариант, но нужно более точечное решение. БлавБух не равно полноправный пользователь. Только для "этого" документа...
4 timurhv
 
14.04.20
16:38
(0) Потому что у администраторов стоит роль "ПолныеПрава", остальные автоматом сбрасываются, либо игнорируются. Даже если в конфигураторе добавить роль, то потом она слетит. Так работает БСП.
5 timurhv
 
14.04.20
16:43
6 Amig0_0
 
14.04.20
16:47
(4) Да, именно так. Роль слететь не слетит, просто ее игнорит ПолныеПрава в функции ".ЭтоПолноправныйПользователь(" как я уже писал раньше.
Я тут покопался, люди лепят запрос на основе справочника ГруппыДоступа и регистра с Ролями, но как - то это мутно выглядит)) Если что-нибудь наколхожу - покажу результат!)
7 Amig0_0
 
14.04.20
16:48
(5) Да, эта статья гуляет везде) И у Чистова на форуме и на Инфостата, но не работает... У меня при любом раскладе возвращает ЛОЖЬ. Пологаю проблема в условии "ПрофилиГруппДоступаРоли.Роль.Имя = &Роль"...
8 fisher
 
14.04.20
16:52
Ничего не понял. Полноправный пользователь должен иметь права в любом случае. На то он и полноправный. В чем проблема давать права при наличии спец-роли ИЛИ если пользователь равноправный?
9 fisher
 
14.04.20
16:52
Тьфу. Полноправный.
10 WorkOut_Man
 
14.04.20
16:53
Надо просто порядок в ролях навести и пользоваться штатным функционалом
11 Amig0_0
 
14.04.20
17:00
(8) (10) Да, возможно упрощу программно и разберусь с текущими ролями...
Единственное, хотелось бы нарыть нормально работающую (5) функцию. Она, чисто теоретически то что мне нужно))
12 AAA
 
14.04.20
17:23
С ролями навести порядок надо. Но например для запуска внешних обработок недостаточно полных прав
13 WorkOut_Man
 
14.04.20
17:25
(11) Там в БСП если поковыряться вроде есть функция проверки административной роли и обычного пользователя.
14 Amig0_0
 
14.04.20
17:54
В общем)))
Расковырял типовую БСП Функцию УправлениеДоступом.ЕстьРоль("ПолныеПрава") и заколхозил так:

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

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

Точечно проверяет наличие роли если спросить в Строковом выражении.
15 Amig0_0
 
14.04.20
17:57
Решение , скажем мягко такое себе... Но у мне на текущий момент подходит. Подумаю / порыщу в интернетах еще, но пока запилю этот вариант. Дело в том , что в базе сплошь у всех административные права и пользователей очень много. Заблочить 2 документа (такое ТЗ) проще лишней функцией, а не перспективу, безусловно нужно разобрать права доступа и роли...

Если у кого еще будут советы / варианты пишите плиз) Спасибо!