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