Как управлять видимостью и доступностью кнопки на форме в зависимости от роли пользователя в 1С?

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

Часто перед разработчиком встает задача ограничить доступ к определенным действиям на форме для разных групп пользователей. Самый простой способ — скрыть кнопку или сделать ее неактивной. Однако, написанный код может не работать, и важно понять почему. Рассмотрим типичную ситуацию: нужно скрыть кнопку «Выполнить» для всех, кроме пользователей с ролью «Администратор», но код в процедуре ПриОткрытии() не дает никакого эффекта. Чтобы разобраться в проблеме, сначала полезно провести анализ прав доступа к объекту, а затем найти правильное решение в коде.

Разбираем причину: Клиент vs Сервер и Управляемые vs Обычные формы

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

  1. Контекст выполнения. Начальные свойства элементов формы, такие как видимость и доступность, рекомендуется устанавливать на сервере в момент ее создания. Для этого идеально подходит серверная процедура &НаСервере ПриСозданииНаСервере(). Она выполняется один раз, когда форма генерируется, и до того, как она будет передана пользователю на клиент. Процедура ПриОткрытии() выполняется уже на клиенте, когда форма получена с сервера, и попытки изменить некоторые свойства на этом этапе могут быть проигнорированы.
  2. Тип формы. В современных конфигурациях, таких как 1С:ERP, используются управляемые формы. Для доступа к элементам в них используется коллекция Элементы. Синтаксис ЭлементыФормы, который использовался в исходном примере, — это наследие обычных форм и в управляемом приложении работать не будет. Эта ошибка часто вводит в заблуждение, особенно если в конфигурации остались старые объекты с обычными формами.

Таким образом, чтобы код сработал, его нужно разместить в правильном месте (на сервере) и использовать правильный синтаксис (для управляемых форм). Если же вы ищете способ решать такие задачи без программирования, можно использовать готовое расширение для контроля видимости и доступности элементов управляемой формы.

Пошаговое решение: Настраиваем видимость кнопки правильно

Разберем по шагам, как корректно настроить видимость или доступность кнопки на управляемой форме.

  1. Откройте нужную форму в конфигураторе. Убедитесь, что вы редактируете именно ту форму, которая открывается у пользователя. В сложных объектах, как справочник «Регламентные и фоновые задания», может быть несколько форм. Если вам нужно настроить доступ и видимость реквизитов справочников универсально, убедитесь, что вы выбрали основную управляемую форму элемента.
  2. Перейдите в модуль формы. Найдите вкладку «Модуль» в нижней части окна редактора формы.
  3. Создайте процедуру ПриСозданииНаСервере. Если такой процедуры еще нет, напишите ее. Система автоматически добавит необходимые директивы и параметры.
  4. Напишите код для управления видимостью. Используйте функцию РольДоступна() для проверки прав текущего пользователя и обращайтесь к кнопке через коллекцию Элементы.

Посмотрим на пример правильного кода:


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

Важно: Имена ДействияФормы и Выполнить должны точно соответствовать именам командной панели и кнопки в дереве элементов вашей формы. Аналогичным образом настраивается доступ и видимость реквизитов документов в их экранных формах.

Важные нюансы: Видимость или Доступность?

У вас есть два способа ограничить действие кнопки:

Если вы хотите просто заблокировать кнопку, а не скрывать ее, измените свойство Доступность:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Делаем кнопку недоступной для всех, кроме администратора
    Элементы.ДействияФормы.Кнопки.Выполнить.Доступность = РольДоступна("Администратор");
    
КонецПроцедуры

Этот вариант кода более лаконичен и делает то же самое, что и код с условием Если...Тогда....

Проверка ролей и частые ошибки

При работе с ролями всегда проверяйте их точное наименование в конфигураторе. Часто в типовых конфигурациях используются системные роли, например, АдминистраторСистемы. Также существует специальное право ПолныеПрава, которое можно проверить так же: РольДоступна("ПолныеПрава"). Эта проверка вернет Истина, если у пользователя есть хотя бы одна роль с флагом «Полные права».

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

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

← На главную