Почему функция РольДоступна() возвращает Ложь в БСП и как правильно проверять права

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

При разработке и доработке конфигураций на базе Библиотеки Стандартных Подсистем (БСП) — таких как «Управление торговлей» (УТ 11), «Бухгалтерия предприятия» (БП 3.0), «ERP Управление предприятием» — разработчики часто сталкиваются с неожиданным поведением глобальной функции РольДоступна(). Функция возвращает Ложь даже тогда, когда роль явно входит в профиль группы доступа, назначенной пользователю, или даже если у пользователя административные (полные) права.

Рассмотрим подробно причины такого поведения платформенного метода и разберем штатные механизмы 1С для корректной проверки прав и ролей.

Причины некорректного срабатывания РольДоступна()

Проанализируем архитектурные особенности, из-за которых платформенная функция РольДоступна() ведет себя не так, как ожидается:

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

Правильные способы проверки ролей в БСП

Для корректной работы с правами в подсистемах БСП следует отказаться от прямой платформенной функции РольДоступна() при проверке бизнес-ролей и использовать специализированные модули подсистемы управления доступом.

1. Использование функции УправлениеДоступом.ЕстьРоль()

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

Пример использования на сервере:


Если УправлениеДоступом.ЕстьРоль("_ИзменениеДопДанных") Тогда
    // Разрешаем выполнение операции или открытие формы
КонецЕсли;

Если проверка выполняется на клиенте в управляемой форме, необходимо использовать клиентский аналог:


Если УправлениеДоступомКлиент.ЕстьРоль("_ИзменениеДопДанных") Тогда
    // Изменяем видимость или доступность элементов формы
КонецЕсли;

2. Передача объектов метаданных вместо строк

Чтобы избежать ошибок при опечатках и обеспечить контроль ссылок при переименовании объектов в Конфигураторе, рекомендуется передавать в функции проверки объект метаданных роли, а не ее строковое имя:


Если УправлениеДоступом.ЕстьРоль(Метаданные.Роли._ИзменениеДопДанных) Тогда
    Элементы.Формы.КнопкаЗагрузки.Доступность = Истина;
КонецЕсли;

3. Использование функции Пользователи.РолиДоступны()

Другой штатный инструмент БСП — функция Пользователи.РолиДоступны(). Она позволяет проверить как одну роль, так и массив ролей. Функция возвращает Истина, если у пользователя есть хотя бы одна из указанных ролей или если он обладает полноправными административными правами.


МассивРолей = Новый Массив;
МассивРолей.Добавить(Метаданные.Роли._ИзменениеДопДанных);

Если Пользователи.РолиДоступны(МассивРолей) Тогда
    // Выполняем действие
КонецЕсли;

4. Проверка конкретного права через ПравоДоступа()

Стандарты разработки 1С рекомендуют управлять интерфейсом (доступностью кнопок, закладок, полей) не через имена ролей, а через проверку прав на конкретные объекты метаданных или действия. Для этого используется платформенное функция ПравоДоступа():


Если ПравоДоступа("Изменение", Метаданные.Справочники.Номенклатура) Тогда
    // Пользователь имеет право редактировать справочник
КонецЕсли;

Резюме

Платформенная функция РольДоступна() в современных типовых конфигурациях подходит только для быстрых проверок базовых системных ролей (например, РольДоступна("ПолныеПрава")). Во всех остальных случаях при работе с конфигурациями на базе БСП следует применять функции УправлениеДоступом.ЕстьРоль(), УправлениеДоступомКлиент.ЕстьРоль() или ПравоДоступа().

← На главную