Как программно настроить видимость элементов и страниц формы по ролям в обычном приложении 1С?

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

В процессе разработки в среде 1С:Предприятие 8.3 (Обычное приложение) часто возникает задача адаптации интерфейса под конкретные права пользователя. Типичный сценарий: при запуске программы открывается обработка, в которой часть функционала (например, определенные вкладки или кнопки) должна быть доступна только администраторам, а рядовые пользователи должны видеть лишь ограниченный набор инструментов. Разберем пошагово, как реализовать это корректно, эффективно и безопасно.

Выбор правильного события для управления интерфейсом

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

Рассмотрим подробнее событие ПередОткрытием. Оно является наиболее предпочтительным для настройки интерфейса. Почему это так? Данное событие срабатывает до того, как форма будет отрисована на экране пользователя. Если мы скроем элементы именно здесь, пользователь не заметит процесса трансформации формы. Если же использовать событие ПриОткрытии, может возникнуть эффект "мерцания": форма сначала отобразится со всеми элементами, а через долю секунды часть из них исчезнет. Кроме того, в ПередОткрытием мы можем полностью заблокировать открытие формы, установив параметр Отказ = Истина, если у пользователя нет необходимых прав.

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

Реализация программного скрытия элементов

Для управления элементами в обычном приложении мы обращаемся к коллекции ЭлементыФормы. Выясним причину, по которой код из управляемых форм (где используется просто Элементы) здесь не подходит: в обычном приложении объектная модель формы иная.

Разберем пример кода, который скрывает ненужные страницы панели для пользователя с ролью "Пользователь":


Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
    
    // Проверяем, обладает ли текущий пользователь ролью "Пользователь"
    Если РольДоступна("Пользователь") Тогда
        
        // Обращаемся к коллекции страниц панели формы
        // Предположим, что панель называется "ОсновнаяПанель"
        ЭлементыФормы.ОсновнаяПанель.Страницы.Страница1.Видимость = Ложь;
        ЭлементыФормы.ОсновнаяПанель.Страницы.Страница2.Видимость = Ложь;
        
        // Оставляем видимой только нужную страницу
        ЭлементыФормы.ОсновнаяПанель.Страницы.Страница3.Видимость = Истина;
        
        // Можно также установить текущую страницу программно
        ЭлементыФормы.ОсновнаяПанель.ТекущаяСтраница = ЭлементыФормы.ОсновнаяПанель.Страницы.Страница3;
        
    КонецЕсли;

КонецПроцедуры

Использование функции ПравоДоступа вместо РольДоступна

Хотя метод РольДоступна прост в использовании, проанализируем ситуацию с точки зрения гибкости разработки. Использование конкретных имен ролей "зашивает" логику прав в программный код. Если завтра название роли изменится или появится новая роль с аналогичными полномочиями, нам придется переписывать код во всех формах.

Более профессиональный подход — использовать функцию ПравоДоступа. Мы можем проверять наличие права на использование конкретного объекта метаданных (например, самой обработки). Посмотрим на пример:


Если НЕ ПравоДоступа("ИнтерактивноеОткрытие", Метаданные.Обработки.МояСлужебнаяОбработка) Тогда
    // Скрываем расширенные настройки, если нет прав на объект
    ЭлементыФормы.ГруппаАдминистрирование.Видимость = Ложь;
КонецЕсли;

Это позволяет управлять правами через конфигуратор, не меняя текст модулей при каждом изменении состава ролей в системе.

Особенности работы со страницами и панелями

В обычном приложении страницы формы всегда являются частью объекта типа Панель. При работе с ними нужно учитывать несколько нюансов:

  1. Отображение закладок: Даже если вы скроете все страницы панели, кроме одной, сама панель может продолжать отображать "корешки" вкладок сверху. Чтобы интерфейс выглядел чистым, проверьте свойство панели ОтображатьЗакладки. Его можно переключить в значение Ложь программно.
  2. Компоновка формы: В отличие от управляемых форм, в обычном приложении скрытие элемента не приводит к автоматическому перемещению соседних элементов. На месте скрытой кнопки может остаться пустое место. Однако для страниц внутри панелей это не проблема — панель сама управляет пространством своих дочерних страниц.
  3. Доступность или Видимость: Иногда лучше использовать Доступность = Ложь. В этом случае элемент останется видимым, но станет "серым" и неактивным. Это помогает пользователю понять, что такая функция в программе есть, но для её использования требуются дополнительные права.

Групповое управление элементами формы

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


Для Каждого Элемент Из ЭлементыФормы Цикл
    // Скрываем все элементы, имена которых начинаются с "Админ_"
    Если Лев(Элемент.Имя, 6) = "Админ_" Тогда
        Элемент.Видимость = ПравоДоступа("Администрирование", Метаданные);
    КонецЕсли;
КонецЦикла;

Безопасность данных: важная оговорка

Необходимо понимать, что свойство Видимость = Ложь — это исключительно визуальная настройка интерфейса. Она не является надежным средством защиты данных. Опытный пользователь может попытаться получить доступ к данным через консоль запросов или универсальные обработки.

Важные моменты для обеспечения безопасности:

Таким образом, мы выяснили, что наиболее эффективным методом настройки видимости в обычном приложении 1С является использование события ПередОткрытием совместно с проверкой прав через РольДоступна или ПравоДоступа. Правильное обращение к коллекции ЭлементыФормы и учет особенностей компоновки панелей позволяют создать удобный и интуитивно понятный интерфейс для любой категории пользователей.

← На главную