Почему в 1С у пользователя с полными правами отключается роль из расширения и как это исправить?

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

Часто при доработке типовых конфигураций 1С, например, 1С:УНФ 3.0, разработчики сталкиваются с неочевидным поведением системы. Одна из таких ситуаций — вы создали в расширении новую роль, назначили ее пользователям, в том числе тем, у кого есть "Полные права", а через некоторое время обнаруживаете, что у администраторов эта роль пропадает. При этом у обычных пользователей все остается на месте. Рассмотрим, почему так происходит и как это исправить.

Сразу отметим: это не ошибка, а штатное поведение механизма Библиотеки стандартных подсистем (БСП), на которой построены почти все современные конфигурации 1С. Проанализируем причину и разберем по шагам надежное решение.

Выясним причину: особенность работы БСП с ролями администраторов

Основная причина "отключения" роли кроется в механизме оптимизации прав доступа. Логика системы следующая:

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

Для реализации этой оптимизации в БСП существует специальное регламентное или фоновое задание (например, "Обновление ролей пользователей"), которое периодически запускается и выполняет "очистку". Оно находит пользователей с полными правами и удаляет у них все роли, которые считает лишними.

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

Разберем по шагам решение проблемы

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

  1. Находим нужный объект для доработки

    Логика управления ролями администраторов обычно сосредоточена в общем модуле УправлениеДоступомСлужебный. Именно его нам и нужно будет доработать.

  2. Создаем расширение и заимствуем процедуру

    Если у вас еще нет расширения для доработок, создайте его. Далее добавьте в расширение общий модуль УправлениеДоступомСлужебный. Нам нужно будет расширить одну из его процедур. В зависимости от версии БСП и конфигурации, это может быть процедура ОбновитьРолиПользователей или, как в более современных версиях, ТекущиеСвойстваПользователей. В нашем случае, ориентируясь на обсуждение и практику, мы будем работать с процедурой ТекущиеСвойстваПользователей.

  3. Добавляем код для включения роли в список исключений

    Самый правильный и безопасный способ — использовать аннотацию &После. Это позволит нашему коду выполниться сразу после основного кода типовой процедуры, не изменяя и не ломая его.

    В модуле УправлениеДоступомСлужебный вашего расширения создайте процедуру со следующим кодом:

    
    &После("ТекущиеСвойстваПользователей")
    Процедура Расш1_ТекущиеСвойстваПользователей(Свойства)
        
        // Исходная типовая процедура уже отработала и заполнила структуру "Свойства".
        // В этой структуре есть коллекция "ДополнительныеРолиАдминистратора",
        // которая и является тем самым списком исключений.
        // Нам нужно просто добавить в нее имя нашей роли.
        
        // Вместо "МояРоль" укажите системное имя вашей роли из расширения.
        Свойства.ДополнительныеРолиАдминистратора.Вставить("МояРоль", Истина);
        
    КонецПроцедуры
    

    Проанализируем этот код:

    • Аннотация &После("ТекущиеСвойстваПользователей") указывает платформе, что наш код нужно выполнить сразу после завершения работы оригинальной процедуры ТекущиеСвойстваПользователей.
    • В качестве параметра Свойства мы получаем структуру, которую уже заполнила типовая процедура.
    • Мы обращаемся к ключу этой структуры ДополнительныеРолиАдминистратора. Это соответствие, которое хранит имена ролей, не подлежащих удалению.
    • Методом Вставить() мы добавляем в эту коллекцию имя нашей роли (например, "МояРоль"). Важно указать именно системное имя роли, как оно задано в конфигураторе.
  4. Обновляем конфигурацию и проверяем результат

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

Этот подход является стандартной практикой для доработки всех современных конфигураций на базе БСП, включая 1С:ERP, 1С:Управление торговлей, 1С:Комплексная автоматизация и другие. Он гарантирует, что ваша доработка не сломается при очередном обновлении типовой конфигурации и будет работать корректно.

← На главную