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