Почему не работают и как правильно настроить роли из расширения в 1С:Предприятие 8.3?

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

При переходе на новые версии платформы «1С:Предприятие 8.3» разработчики часто сталкиваются с ситуацией, когда добавленные в расширение роли отказываются работать. Мы создаем роль в расширении, пытаемся назначить ее пользователю (программно или интерактивно), но в режиме Предприятия ничего не меняется. Пользователь по-прежнему не видит новые объекты метаданных, а в Конфигураторе у его учетной записи не появляется характерный значок, свидетельствующий об использовании ролей из расширения.

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

---

Выясняем причину: почему программный код не дает ожидаемого результата

Довольно часто разработчики пытаются назначить роль из расширения пользователю информационной базы напрямую с помощью программного кода. Для этого создается внешняя обработка со следующим кодом:


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

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

  1. Кэширование данных Конфигуратора. Список пользователей в Конфигураторе динамически не обновляется при записи пользователя ИБ из сеанса Предприятия. Чтобы увидеть визуальные изменения в Конфигураторе, необходимо как минимум обновить список пользователей через меню или полностью перезапустить Конфигуратор.
  2. Конфликт с логикой БСП. Это самая частая причина неудачи. В современных типовых конфигурациях (УТ, ERP, КА, БП, ЗУП), построенных на базе БСП, правами пользователей управляет специализированная подсистема «Управление доступом». БСП регулярно синхронизирует фактический список ролей платформы у пользователя с назначенными ему Профилями и Группами доступа. Если вы программно добавили роль напрямую в базу данных в обход подсистемы БСП, система при первом же удобном случае (например, при выполнении регламентного задания ОбновитьРолиПользователей или перезаписи пользователя) просто сотрет эту «несанкционированную» роль, посчитав ее избыточной или некорректной.
  3. Ошибки времени выполнения. Программный код записи роли может выполняться в транзакции, которая впоследствии откатывается из-за внутренних проверок платформы или БСП, при этом разработчик может даже не увидеть ошибку, если она была перехвачена в блоке Попытка...Исключение.

---

Подводный камень платформы: появление роли в расширении блокирует доступ

Рассмотрим очень важную особенность поведения платформы «1С:Предприятие 8.3» при работе с правами в расширениях. Проанализируем два сценария поведения системы, о которых критически важно знать каждому разработчику:

Решение проблемы блокировки: Если вам потребовалось создать хотя бы одну роль в расширении, вам необходимо заимствовать в это же расширение стандартную роль (например, ПолныеПрава или АдминистраторСистемы) и внутри расширения явно прописать для этой заимствованной роли права «Чтение», «Просмотр», «Редактирование» на все новые объекты вашего расширения. В противном случае даже под учетной записью администратора вы перестанете видеть новые документы или справочники расширения.

---

Как правильно настраивать роли из расширения в конфигурациях с БСП

Для того чтобы новые роли из расширения корректно применялись и не затирались механизмами БСП, нам необходимо отказаться от прямого программного назначения ролей через объект ПользовательИнформационнойБазы и использовать штатные механизмы конфигурации. Разберем этот процесс по шагам.

Шаг 1. Обновление идентификаторов метаданных

БСП хранит информацию о структуре конфигурации и расширений в справочнике ИдентификаторыОбъектовМетаданных (и сопутствующем ему справочнике идентификаторов расширений). Без актуализации этих данных БСП просто «не знает» о существовании вашей новой роли.

Для обновления метаданных запустите информационную базу в режиме Предприятия с параметрами запуска:

ЗапускОбновленияИнформационнойБазы

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

Шаг 2. Создание профиля групп доступа

После того как метаданные обновились, мы настраиваем права стандартным для БСП способом:

  1. Переходим в раздел Администрирование — Настройки пользователей и прав — Профили групп доступа.
  2. Создаем новый профиль (например, «Работа с расширением Кладовщик»).
  3. В списке разрешенных действий (ролей) находим нашу роль из расширения. Она будет отображаться в общем списке. Отмечаем ее флажком.
  4. Записываем профиль.

Шаг 3. Назначение прав пользователю

Теперь создаем группу доступа на основании созданного профиля:

  1. Переходим в справочник Группы доступа.
  2. Создаем новую группу доступа, выбираем в качестве профиля наш только что созданный профиль.
  3. В табличную часть «Участники группы» добавляем необходимых пользователей.
  4. Записываем группу доступа.

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

---

Альтернативный вариант: Инициализация роли в модуле сеанса

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

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


Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
    
    // Проверяем, нужно ли назначить роль текущему пользователю
    ТекущийПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
    
    // Ищем, добавлена ли уже роль, чтобы избежать избыточной записи
    РольДобавлена = Ложь;
    Для Каждого ТекущаяРоль Из ТекущийПользовательИБ.Роли Цикл
        Если ТекущаяРоль.Имя = "Кладовщик" Тогда
            РольДобавлена = Истина;
            Прервать;
        КонецЕсли;
    КонецЦикла;
    
    Если Не РольДобавлена Тогда
        // Проверяем наличие роли в метаданных (в т.ч. в расширениях)
        Если Метаданные.Роли.Найти("Кладовщик") <> Неопределено Тогда
            Попытка
                ТекущийПользовательИБ.Роли.Добавить(Метаданные.Роли.Кладовщик);
                ТекущийПользовательИБ.Записать();
            Исключение
                ЗаписьЖурналаРегистрации("ОшибкаНазначенияРоли", 
                    УровеньЖурналаРегистрации.Ошибка,,, 
                    ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
            КонецПопытки;
        КонецЕсли;
    КонецЕсли;

КонецПроцедуры

Этот код гарантированно выполнится при старте системы от имени текущего пользователя (или в привилегированном режиме, если обернуть запись пользователя в соответствующий метод). После первого успешного выполнения роль закрепится за пользователем ИБ, и код можно будет деактивировать или оставить для автоматического контроля новых пользователей.

---

Особенности клиент-серверного варианта и свойства «Основные роли»

При работе в клиент-серверном варианте платформы «1С:Предприятие 8.3» накладываются дополнительные требования безопасности:

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

← На главную