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