Почему роль из расширения не отображается у пользователя и как это исправить?

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

При разработке расширений для типовых конфигураций (таких как ERP, Управление торговлей или Комплексная автоматизация) программисты часто сталкиваются с ситуацией: новая роль создана, добавлена в профиль групп доступа, профиль назначен пользователю, но в режиме "1С:Предприятие" роль не отображается как активная, а проверка РольДоступна() возвращает Ложь. Рассмотрим подробнее, почему это происходит, и разберем по шагам правильные способы решения этой задачи — в этом поможет инструментарий разработчика для анализа прав доступа.

Причина №1: Особенности работы БСП при наличии полных прав

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

Однако, если вы добавили в расширение новые объекты (справочники, документы), роль ПолныеПрава из основной конфигурации о них ничего "не знает". Чтобы администраторы и пользователи с полными правами получили доступ к вашим объектам, воспользуемся следующим алгоритмом:

  1. Зайдем в конфигуратор и добавим (заимствуем) роль ПолныеПрава в ваше расширение.
  2. В самом расширении откроем права этой роли (поможет отчет для анализа и сравнения ролей пользователей) и проставим галочки на те объекты, которые вы создали в расширении.
  3. После этого пользователям с полными правами не нужно будет назначать отдельную роль — доступ появится автоматически.

Причина №2: Синхронизация ролей и справочник идентификаторов

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

Если система "не видит" роль в профиле, попробуем обновить эти данные (поможет отчет по детальному анализу прав доступа пользователей). Для этого можно запустить сеанс с параметром командной строки:

/С ЗапуститьОбновлениеИнформационнойБазы

Или вызвать метод программно из консоли кода:

Справочники.ИдентификаторыОбъектовРасширений.ОбновитьДанные();

Причина №3: Проблема "второго входа" при программном назначении

Иногда разработчики пытаются назначить роль программно при старте системы. Рассмотрим пример кода, который часто используют в процедуре ПередНачаломРаботыСистемы:


Процедура ДобавитьРоль() Экспорт
    ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
    Если Не ПользовательИБ.Роли.Содержит(Метаданные.Роли.ИмяВашейРоли) Тогда
        ПользовательИБ.Роли.Добавить(Метаданные.Роли.ИмяВашейРоли);
        ПользовательИБ.Записать();
    КонецЕсли;
КонецПроцедуры

Проанализируем ситуацию: почему этот код срабатывает только со "второго раза"? Дело в том, что список ролей пользователя (токен доступа) формируется платформой в момент авторизации. Когда выполняется код внутри сеанса, вы меняете данные в базе данных, но текущий активный сеанс продолжает работать со старым набором прав, который был актуален на секунду раньше. Изменения вступят в силу только при создании нового сеанса. Именно поэтому программное добавление ролей через ПользователиИнформационнойБазы в теле текущего сеанса считается плохой практикой.

Правильный подход к назначению ролей в ERP/БСП

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

Рассмотрим правильный порядок действий:

  1. Создание роли: Убедитесь, что в расширении у роли установлены флаги "Использовать в управлении доступом".
  2. Создание Профиля: В режиме "1С:Предприятие" создайте новый Профиль групп доступа и добавьте туда вашу роль из расширения. Если роль не видна, воспользуйтесь обновлением идентификаторов, как описано выше.
  3. Назначение Группы доступа: Создайте Группу доступа, выберите созданный профиль и добавьте туда нужных пользователей.
  4. Синхронизация: После записи группы доступа БСП сама вызовет методы платформы для обновления ролей в списке ПользователиИнформационнойБазы.

Важный нюанс: Чтобы роль из расширения корректно подхватилась механизмами БСП, само расширение должно иметь тип назначения Дополнение. В расширениях типа Исправление (Patch) работа с правами доступа может быть ограничена. Для комплексного аудита и быстрой настройки профилей или групп БСП можно использовать инструмент для управления правами доступа.

Как проверить доступность роли в коде расширения

Если вам нужно ограничить проведение документа (например, "Операция рег. учет"), даже если у пользователя есть полные права, используйте проверку РольДоступна() в модуле объекта перед записью или проведением. Но помните: если вы хотите, чтобы роль "отнимала" права у администратора, стандартная логика "разрешено всё, что не запрещено" здесь не сработает. В 1С права суммируются. Если одна роль (ПолныеПрава) разрешает проведение, а вторая (ВашаРоль) просто не имеет на него прав, проведение всё равно будет разрешено. В таком случае в коде нужно явно прописать условие:


&Перед("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    Если РежимПроведения = РежимПроведенияДокумента.Проведение 
        И Не РольДоступна("ВашаСпециальнаяРоль") Тогда
        
        ТекстСообщения = "У вас недостаточно прав для проведения данного документа!";
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
        Отказ = Истина;
        
    КонецЕсли;
КонецПроцедуры

Таким образом, мы объединяем возможности метаданных и программный контроль, что позволяет гибко управлять безопасностью системы даже в сложных конфигурациях уровня ERP.

← На главную