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