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