Как скрыть подсистему в интерфейсе 1С для определенных ролей?

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

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

Метод 1. Проверка прав на объект метаданных «Подсистема»

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

Рассмотрим алгоритм проверки:

  1. Откроем роль, назначенную пользователю, через дерево метаданных — сделать это быстрее поможет обработка анализа прав доступа, ролей и профилей пользователей.
  2. Перейдем в ветку Общие -> Подсистемы.
  3. Найдем нужную подсистему и проверим галочку Просмотр. Если она установлена, платформа будет пытаться отобразить этот раздел, игнорируя настройки командного интерфейса в некоторых сценариях.

Важно помнить: если у пользователя несколько ролей, право Просмотр должно быть снято во всех ролях, кроме той, которой доступ разрешен.

Метод 2. Анализ состава объектов подсистемы

Выясним причину "принудительного" отображения. Платформа 1С обладает встроенной логикой: если пользователю доступен какой-либо объект (справочник, документ, отчет), который включен в подсистему "А" и не включен больше ни в одну другую доступную пользователю подсистему, система может вывести подсистему "А", чтобы обеспечить доступ к функционалу.

Проанализируем ситуацию:

Метод 3. Использование функциональных опций (самый надежный способ)

Если манипуляции с ролями не приносят стабильного результата, воспользуемся механизмом Функциональных опций (ФО) — перед этим полезно провести детальный анализ прав и доступа пользователей к объектам метаданных. Это наиболее профессиональный подход, позволяющий программно управлять интерфейсом на уровне платформы.

Разберем реализацию по шагам:

  1. Создадим параметр сеанса: Назовем его, например, ДоступенРазделПродажи с типом Булево.
  2. Создадим функциональную опцию: Назовем её ОтображатьРазделПродажи. В качестве источника укажем наш параметр сеанса.
  3. Настроим состав: На вкладке "Состав" выберем ту самую подсистему, которую нужно скрыть.
  4. Установим значение: В модуле сеанса (в процедуре УстановкаПараметровСеанса) пропишем логику:

Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
    Если ТребуемыеПараметры = Неопределено Или ТребуемыеПараметры.Найти("ДоступенРазделПродажи") <> Неопределено Тогда
        // Проверяем наличие роли у текущего пользователя
        ДоступРазрешен = РольДоступна("ПолныеПрава") Или РольДоступна("РуководительОтделаПродаж");
        ПараметрыСеанса.ДоступенРазделПродажи = ДоступРазрешен;
    КонецЕсли;
КонецПроцедуры

Теперь, если у пользователя нет указанных ролей, параметр сеанса примет значение Ложь, и платформа полностью исключит подсистему из командного интерфейса еще до момента отрисовки окна.

Метод 4. Очистка кэша и настроек пользователя

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

  1. Очистка в базе: Перейдем в Администрирование -> Настройки пользователей и прав -> Очистка настроек. Выберем пользователя и удалим настройки командного интерфейса.
  2. Очистка кэша: Попробуем запустить базу с параметром /ClearCache. Это заставит платформу заново пересчитать структуру интерфейса.

Метод 5. Программное обновление интерфейса

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


// В управляемом приложении можно обновить интерфейс целиком
ОбновитьИнтерфейс();

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

Особенности вложенных подсистем

Проанализируем вопрос наследования видимости. Если подсистема является подчиненной (вложенной), её видимость напрямую зависит от родителя. Однако автоматического наследования "галочек" в 1С нет. Каждый уровень проверяется отдельно. Если родительская подсистема скрыта по ролям, то и все дочерние будут скрыты, даже если в них стоят галочки. Но если родитель виден, а дочерняя — нет, то дочерняя скроется, а остальные части родительского раздела останутся доступными.

Резюме: Для гарантированного скрытия раздела рекомендуем комбинировать Метод 1 (отключение права "Просмотр" в роли) и Метод 3 (привязка подсистемы к функциональной опции). Это исключает влияние "случайных" прав на объекты и гарантирует чистоту интерфейса для пользователя.

← На главную