При разработке и сопровождении конфигураций на обычных формах часто возникает задача разграничения прав пользователей. Нередко разработчики пытаются программно управлять доступностью пунктов главного меню или кнопок командных панелей аналогично тому, как это делается на формах объектов через свойство Доступность. Разберем, почему стандартный механизм интерфейсов накладывает ограничения и как правильно решить поставленную задачу.
Проанализируем структуру работы с интерфейсами в обычном приложении. Объект метаданных Интерфейс в платформе 1С:Предприятие не предоставляет разработчику объектной модели для динамического управления отдельными элементами, подменю или кнопками панелей инструментов. В коллекциях встроенного языка нет возможности обратиться к конкретному пункту меню и установить для него значение Доступность = Ложь.
Через глобальный контекст и объект ГлавныйИнтерфейс доступно только переключение интерфейсов целиком с помощью метода ГлавныйИнтерфейс.ПереключитьИнтерфейс(). Управлять состоянием отдельных веток внутри одного назначенного интерфейса программно невозможно.
Тем не менее решить задачу разграничения доступа к функциям системы можно несколькими стандартными и проверенными способами.
Рассмотрим основной архитектурный подход, заложенный разработчиками платформы. Если группе пользователей не должны быть доступны определенные пункты меню или команды, для них создается отдельный интерфейс.
ИнтерфейсМенеджера) и включим в него только те подсистемы, меню и панели, с которыми должна работать целевая группа.Выясним, как платформа 1С автоматически обрабатывает доступность команд главного меню на основе назначенных прав. Если пункт меню привязан к стандартному действию объекта метаданных (например, открытие формы списка справочника или журнала документов), система сама регулирует его отображение.
Просмотр и Чтение для тех объектов метаданных, доступ к которым необходимо закрыть.Если бизнес-требования жестко требуют визуального отображения команд в виде неактивных («серых») кнопок, стандартное меню интерфейса не подойдет. В этом случае навигационную панель реализуют на главной форме рабочего стола.
Посмотрим на пример реализации. Создадим форму рабочего стола и добавим на нее командные кнопки. В модуле формы в процедуре ПриОткрытии опишем проверку доступных прав:
Процедура ПриОткрытии()
// Проверяем наличие роли или права доступа к объекту
ДоступностьЖурнала = ПравоДоступа("Чтение", Метаданные.Документы.РеализацияТоваровУслуг);
// Управляем доступностью элементов формы
ЭлементыФормы.КнопкаОткрытьРеализации.Доступность = ДоступностьЖурнала;
ЭлементыФормы.КнопкаСформироватьОтчет.Доступность = РольДоступна("ПолныеПрава");
КонецПроцедуры
На обычной форме элементы управления поддерживают свойства Доступность и ТолькоПросмотр, что позволяет реализовать любую гибкую логику блокировки кнопок и полей ввода.
Если пункт меню привязан к выполнению процедуры общего модуля, выполним проверку прав непосредственно перед исполнением алгоритма. Разберем по шагам, как предотвратить несанкционированное действие:
Процедура ДействиеПунктМеню() Экспорт
Если Не РольДоступна("ОтветственныйЗаПроведение") Тогда
Предупреждение("У вас недостаточно прав для выполнения этой операции!");
Возврат;
КонецЕсли;
// Основная логика процедуры
ВыполнитьОбработкуДанных();
КонецПроцедуры
Таким образом, комбинируя разграничение ролей, создание отдельных интерфейсов и навигационные формы рабочего стола, можно реализовать любые требования к безопасности и внешнему виду интерфейса в обычном приложении 1С.