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