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