Как программно сделать кнопку недоступной на форме в 1С

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

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

Разберем, как устроена работа команд и кнопок в платформе 1С:Предприятие 8.3, почему нельзя отключить команду напрямую и какими способами можно правильно заблокировать интерфейсный элемент.

Разница между командой формы и кнопкой формы

Для понимания архитектуры управляемых форм важно разделять два понятия:

  1. Команда формы — это логический объект конфигуратора, который описывает само действие (процедуру-обработчик), его заголовок, картинку и подсказку. У объекта КомандаФормы в платформе 1С нет свойств Доступность или Видимость. Запретить команду через единый флаг на уровне самой команды невозможно.
  2. Кнопка формы — это графический элемент интерфейса (объект КнопкаФормы в коллекции Элементы), отображаемый на панели или в контекстном меню и связанный с конкретной командой. Именно у кнопки есть свойства Доступность и Видимость.

Способ 1. Управление свойством Доступность у элемента формы

Проанализируем базовый способ: прямое обращение к элементу управления. Если нам требуется сделать кнопку серой и неактивной при открытии документа, мы меняем свойство Доступность у самого элемента формы.

Посмотрим на пример кода, который вызывается в процедуре ПриСозданииНаСервере или ПриОткрытии:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Проверяем бизнес-условие
    КнопкаРазрешена = (Объект.СуммаДокумента > 0) И Не Объект.Проведен;
    
    // Управляем доступностью элемента интерфейса
    Элементы.КнопкаСогласовать.Доступность = КнопкаРазрешена;
КонецПроцедуры

Если вместо неактивной (серой) кнопки требуется полностью скрыть ее из командной панели, используем свойство Видимость:

Элементы.КнопкаСогласовать.Видимость = КнопкаРазрешена;

Способ 2. Отключение всех кнопок, связанных с одной командой

Что делать, если одна и та же команда выведена сразу в несколько мест — например, в командную панель формы и в контекстное меню табличной части? Чтобы не прописывать отключение каждой кнопки по отдельности, обойдем коллекцию элементов формы программно.

Разберем пример серверной процедуры, которая отключает все кнопки указанной команды:


&НаСервере
Процедура УстановитьДоступностьКоманды(ИмяКоманды, Доступность)
    Для Каждого Элемент Из Элементы Цикл
        Если ТипЗнч(Элемент) = Тип("КнопкаФормы") И Элемент.ИмяКоманды = ИмяКоманды Тогда
            Элемент.Доступность = Доступность;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Способ 3. Проверка условия в теле обработчика команды

Даже если кнопка визуально заблокирована, всегда существует вероятность вызова действия через горячие клавиши или программные вызовы. В соответствии со стандартами разработки 1С интерфейсные ограничения обязательно должны дублироваться проверкой в бизнес-логике.

Добавим в сам клиентский обработчик команды условие проверки перед выполнением полезного действия:


&НаКлиенте
Процедура ВыполнитьДействие(Команда)
    // Защита от несанкционированного выполнения
    Если НЕ ПроверитьВозможностьВыполнения() Тогда
        ПоказатьПредупреждение(, "Выполнение операции недоступно для текущего состояния документа!");
        Возврат;
    КонецЕсли;
    
    // Основной алгоритм команды
    ВыполнитьДействиеНаСервере();
КонецПроцедуры

Особенности работы в типовых конфигурациях (УНФ)

В конфигурациях, созданных на базе Библиотеки стандартных подсистем (включая 1С:Управление нашей фирмой), доступность элементов формы часто пересчитывается автоматически типовыми механизмами (например, при изменении статуса документа, проведении или переходе в режим просмотра).

При реализации собственного кода учитываем следующие нюансы:

  1. Свойство команды «ИзменяетСохраняемыеДанные»: если у команды формы установлен этот флаг, то при переходе формы в режим ТолькоПросмотр = Истина платформа автоматически делает неактивными все кнопки этой команды без написания дополнительного кода.
  2. События формы: если статус документа меняется пользователем прямо на форме (например, изменили состояние в выпадающем списке), проверку доступности кнопки нужно вызывать не только в ПриСозданииНаСервере, но и в обработчике ПриИзменении соответствующего реквизита.
  3. Доработка через расширения: при изменении формы в расширении конфигурации логику управления кнопками рекомендуется размещать в обработчиках с директивой &После("ПриСозданииНаСервере"), чтобы стандартные подсистемы УНФ не перетерли установленную доступность.
← На главную