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