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