Почему не работают роли, созданные в расширении конфигурации 1С, и как это исправить?

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

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

Суть проблемы: конфликт платформы и БСП

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

Кроме того, существует особенность работы платформы в определенных режимах совместимости (особенно 8.3.12 – 8.3.14), где роль из расширения может быть не видна в сеансе, если она не назначена явно пользователю информационной базы определенным образом.

Рассмотрим пошагово, как диагностировать и решить эту задачу.

Решение 1: Программное назначение роли при старте

Самый действенный способ заставить роль из расширения работать — это принудительно добавить её пользователю информационной базы программно в момент запуска системы. Однако здесь есть важный нюанс: мы не можем просто добавить роль в текущий сеанс "на лету", мы должны изменить сохраненные настройки пользователя базы данных.

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

Рассмотрим пример кода, который необходимо поместить в общий модуль расширения или в модуль управляемого приложения с аннотацией &Перед для события ПередНачаломРаботыСистемы:


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

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

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

Проблема "Второго входа"

Многие коллеги, применив вышеуказанный код, сталкиваются с ситуацией, описанной в сообщении 17: "Если пользователю установить роль и перезайти, то проверка показывает, что роль не назначена. Но если перезайти второй раз — всё работает".

Давайте разберем причину этого поведения. Это фундаментальная особенность работы сеансов в платформе 1С:

  1. Пользователь вводит логин и пароль. Платформа создает сеанс, считывая текущие права из базы данных.
  2. Запускается событие ПередНачаломРаботыСистемы.
  3. Наш код добавляет роль в базу данных (метод Записать() объекта пользователя).
  4. Но! Текущий сеанс уже инициализирован со "старым" набором прав. Изменение пользователя в БД не обновляет права текущего запущенного сеанса мгновенно.

Таким образом, первый запуск служит только для записи прав в базу. Чтобы права применились, пользователь должен выйти и зайти снова (создать новый сеанс).

Как это обойти?
Если критично, чтобы права заработали с первого раза, можно добавить проверку и принудительный перезапуск. Однако, чаще всего достаточно один раз выполнить вход под пользователем, либо смириться с тем, что права применятся со следующего входа.

Важные проверки перед настройкой

Если даже после программного добавления роль не работает, давайте проверим настройки самого расширения и конфигуратора.

1. Безопасный режим и профили безопасности

Расширение, которое пытается программно изменять пользователей информационной базы (метод Пользователь.Записать()), не должно работать в безопасном режиме.

Если используется клиент-серверный вариант с профилями безопасности, убедитесь, что расширению разрешено администрирование пользователей.

2. Интерактивные права

Частая ошибка: роль создана, права на чтение объекта даны, но забыты интерактивные права. В редакторе роли в конфигураторе убедитесь, что для вашего справочника или документа установлены флаги:

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

3. Режим совместимости

Как указано в обсуждении, поведение ролей в расширениях сильно зависит от версии платформы и режима совместимости. В версиях платформы 8.3.12 – 8.3.14 наблюдались проблемы с применением ролей. Рекомендуется использовать режим совместимости 8.3.16 и выше.

Альтернативный подход: Использование ролей-доноров

Если вы не хотите прописывать код при запуске системы (например, чтобы не замедлять старт или не давать расширению лишних привилегий), можно использовать метод "роли-донора".

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

В этом случае платформа автоматически "склеит" права основной роли и права, добавленные в расширении. Это работает более стабильно и не требует программного вмешательства в список пользователей ИБ.

Резюме

Для корректной работы ролей, созданных в расширении:

  1. Убедитесь, что у расширения отключен безопасный режим.
  2. Используйте программное добавление роли пользователю в процедуре ПередНачаломРаботыСистемы.
  3. Помните, что права, назначенные программно, применятся только при следующем входе пользователя в систему (проблема двух сеансов).
  4. Проверяйте интерактивные права внутри самой роли.
← На главную