Почему новая роль не назначается пользователю через профиль групп доступа в 1С

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

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

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

Почему роли, добавленные вручную, сбрасываются

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

Проанализируем основные причины, по которым новая роль может игнорироваться:

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

Способ 1. Запуск обновления информационной базы через параметры запуска

Самый простой и штатный способ зарегистрировать новые метаданные в тестовой базе — запустить сеанс с ключом обновления. В этом случае система автоматически актуализирует служебные таблицы и справочники метаданных.

Выполним следующие шаги:

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

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

Способ 2. Программное обновление параметров работы пользователей и метаданных

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

Посмотрим на пример кода для вызова процедур актуализации параметров БСП:


// 1. Принудительно регистрируем новые объекты конфигурации в БСП
Справочники.ИдентификаторыОбъектовМетаданных.ОбновитьДанныеСправочника();

// 2. Обновляем общие параметры работы пользователей
Константы.ПараметрыРаботыПользователей.СоздатьМенеджерЗначения().ОбновитьОбщиеПараметры();

// 3. Актуализируем список ролей пользователей ИБ
УправлениеДоступом.ОбновитьРолиПользователей();

Рассмотрим, как работает данный код:

  1. Метод ОбновитьДанныеСправочника() сопоставляет метаданные конфигуратора со строками справочника ИдентификаторыОбъектовМетаданных и создает недостающие записи для нашей роли.
  2. Метод ОбновитьОбщиеПараметры() сбрасывает кэшированные настройки подсистемы работы с пользователями.
  3. Процедура ОбновитьРолиПользователей() модуля УправлениеДоступом (или аналогичный метод модуля Пользователи) пересчитывает права для всех пользователей информационной базы с учетом состава назначенных профилей.

Способ 3. Использование типовой обработки «Обновление вспомогательных данных»

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

  1. Запустим режим «1С:Предприятие» от имени пользователя с полными правами.
  2. Откроем меню Функции для разработчика (или Все функции).
  3. В списке стандартных обработок найдем обработку Обновление вспомогательных данных.
  4. Запустим процесс обновления. Система в фоновом или интерактивном режиме перезаполнит идентификаторы и служебные константы.

Особенности работы с ролями в расширениях

Если созданная роль находится не в основной конфигурации, а вынесена в расширение, обратим внимание на следующие нюансы:

  1. Метаданные расширений регистрируются в отдельном справочнике — ИдентификаторыОбъектовРасширений. Если обновление метаданных основной конфигурации не помогло, необходимо убедиться, что отработала процедура заполнения идентификаторов расширений.
  2. Проверим свойства расширения: переключатель Использовать основные роли для всех пользователей и состав списка Основные роли. Некорректное комбинирование этих настроек может блокировать применение ролей расширения к конкретным учетным записям.

Как правильно проверять права в программном коде

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

Чтобы избежать этой проблемы, в среде БСП всегда используем штатную функцию:


Если Пользователи.РолиДоступны("МояРоль") Тогда
    // Действие разрешено как пользователям с явной ролью,
    // так и системным администраторам с полными правами
    ВыполнитьДействие();
КонецЕсли;

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

← На главную