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