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