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