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