При разработке и сопровождении конфигураций на базе Библиотеки стандартных подсистем (БСП) разработчики часто сталкиваются с ситуацией: пользователю через режим «1С:Предприятие» назначена группа доступа, в профиле которой содержится нужная роль, однако платформенная функция РольДоступна() продолжает возвращать Ложь. Разберем детально, почему так происходит, как устроена подсистема управления доступом и какими методами следует выполнять проверку прав.
Функция глобального контекста РольДоступна() является платформенным механизмом. Она проверяет фактический список ролей, назначенный конкретному пользователю информационной базы в конфигураторе (или программно в объекте ПользовательИнформационнойБазы) и зафиксированный на момент старта текущего клиентского сеанса.
Справочники БСП (Справочник.ГруппыДоступа, Справочник.ПрофилиГруппДоступа) представляют собой прикладную надстройку. Расстановка флажков в профилях сама по себе не меняет состав прав в текущем сеансе до тех пор, пока подсистема не запишет роли в учетную запись пользователя платформы, а пользователь не перезапустит сеанс.
Проанализируем ключевые причины, из-за которых РольДоступна() возвращает отрицательный результат:
ПолныеПрава или профиль «Администратор», логика БСП намеренно не включает избыточные прикладные роли в состав ролей пользователя информационной базы. В этом случае вызов РольДоступна("ПрикладнаяРоль") для администратора всегда вернет Ложь.ИдентификаторыОбъектовМетаданных.Рассмотрим, какие процедуры и функции отвечают за передачу состава ролей из групп доступа в список ролей пользователя информационной базы. Основная логика сосредоточена в модуле объекта справочника ГруппыДоступа и общем модуле УправлениеДоступомСлужебный.
Посмотрим на пример вызова процедур обновления:
// Модуль объекта справочника "ГруппыДоступа"
ОбновитьРолиПользователейПриИзмененииГруппыДоступа(ПарольПользователяСервиса);
// Общий модуль "УправлениеДоступомСлужебный"
УправлениеДоступомСлужебный.ОбновитьРолиПользователей(МассивПользователей, ПарольПользователяСервиса);
Эти процедуры сопоставляют профили всех групп, в которые входит пользователь, формируют результирующий массив ролей и выполняют запись в объект ПользовательИнформационнойБазы.
По стандартам разработки «1С» прямой вызов метода РольДоступна() в прикладном коде не рекомендуется. Разберем правильные варианты проверки прав:
Пользователи.РолиДоступны() или ПользователиКлиентСервер.РолиДоступны(). Она учитывает административные права, наличие роли ПолныеПрава и привилегированный режим:
// Проверка одной или нескольких ролей через БСП
Если Пользователи.РолиДоступны("ДобавлениеИзменениеДокументовПродажи") Тогда
// Действие доступно пользователю или администратору
КонецЕсли;
ПравоДоступа(), а не проверять конкретную роль по имени:
// Проверка фактического права на объект
Если ПравоДоступа("ИнтерактивноеДобавление", Метаданные.Документы.РеализацияТоваровУслуг) Тогда
// Разрешено создание документа
КонецЕсли;
Справочники.ИдентификаторыОбъектовМетаданных.ОбновитьДанные();
Таким образом, для стабильной работы механизмов доступа в конфигурациях на базе БСП необходимо использовать специализированные методы Пользователи.РолиДоступны(), контролировать перезапуск сеанса после изменения групп доступа и учитывать внутреннюю оптимизацию платформы и библиотечных модулей.