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

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

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

Разберем подробно, как решать эту задачу для двух разных типов форм: управляемых и обычных, так как подходы к ним существенно различаются.

Управление кнопками в управляемых формах (v8.2, v8.3)

Управляемые формы предоставляют наиболее гибкие механизмы настройки интерфейса. Здесь мы можем использовать как программный код, так и декларативные настройки (без программирования).

Способ 1. Использование свойства «Видимость»

В отличие от старых версий платформы, в управляемых формах у элементов (в том числе у кнопок) есть прямое свойство Видимость. Проанализируем ситуацию: если мы устанавливаем Видимость = Ложь, кнопка не просто становится серой, она полностью исчезает с панели, а соседние кнопки сдвигаются на ее место.

Для реализации динамического переключения рассмотрим следующий пример кода. Предположим, у нас есть реквизит ТипОперации и кнопка с именем ФормаПечатьБланка.


&НаКлиенте
Процедура ТипОперацииПриИзменении(Элемент)
    УстановитьВидимостьКнопок();
КонецПроцедуры

&НаСервере
Процедура УстановитьВидимостьКнопок()
    // Если тип операции - Почта, показываем кнопку
    Элементы.ФормаПечатьБланка.Видимость = (Объект.ТипОперации = ПредопределенноеЗначение("Перечисление.ТипыОпераций.Почта"));
КонецПроцедуры

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

Способ 2. Условное оформление формы

Как справедливо отмечено в сообщениях форума, в управляемых формах можно обойтись без единой строчки кода. Рассмотрим по шагам:

  1. Откроем редактор формы и перейдем на закладку «Условное оформление».
  2. Добавим новый элемент оформления.
  3. В колонке «Оформление» выберем свойство «Видимость» и установим значение Ложь.
  4. В колонке «Условие» укажем наше правило (например, Объект.ТипОперации Не Равно Почта).
  5. В колонке «Оформляемые поля» выберем нашу кнопку.

Платформа сама будет отслеживать изменения реквизита и скрывать/показывать кнопку автоматически. Если же требуется перенести настроенные правила в программный код, можно использовать обработку для декомпиляции условного оформления формы.

Управление кнопками в обычных формах (Толстый клиент)

В обычных формах ситуация сложнее. Командные панели здесь являются коллекциями объектов, и у кнопок внутри коллекции КнопкиКоманднойПанели часто отсутствует прямое свойство Видимость.

Способ 1. Управление доступностью

Самый простой способ — сделать кнопку неактивной. Она останется видимой, но пользователь не сможет ее нажать. Проанализируем пример обращения к кнопке на основной панели действий:

ЭлементыФормы.ОсновныеДействияФормы.Кнопки.ПечататьБланк.Доступность = Ложь;

Этот метод хорош тем, что он не «дергает» интерфейс: кнопки не прыгают, и структура панели остается стабильной.

Способ 2. Программное удаление и добавление кнопки

Если стоит задача именно скрыть кнопку, нам придется манипулировать коллекцией кнопок. Рассмотрим, как это сделать правильно. Выясним причину, по которой простое удаление может быть неудобным: если мы удалим кнопку, нам придется писать код для ее повторного создания, когда условие снова станет истинным. Наглядный пример реализации подобного алгоритма демонстрирует обработка с примером динамического добавления и удаления элементов формы.

Пример удаления кнопки по индексу или имени:


// Получаем коллекцию кнопок
КнопкиПанели = ЭлементыФормы.КоманднаяПанель1.Кнопки;

// Ищем кнопку по имени
НужнаяКнопка = КнопкиПанели.Найти("ПечатьБланка");

Если НужнаяКнопка <> Неопределено Тогда
    ИндексКнопки = КнопкиПанели.Индекс(НужнаяКнопка);
    КнопкиПанели.Удалить(ИндексКнопки);
КонецЕсли;

Способ 3. Визуальный «хак» с отображением

Опытные разработчики иногда используют комбинированный метод: если кнопку нельзя скрыть, можно изменить ее отображение так, чтобы она стала «невидимой» или максимально неприметной. Разберем этот пример:


// Сделаем кнопку недоступной
ЭлементыФормы.ОсновныеДействияФормы.Кнопки.Согласовать.Доступность = Ложь;

// Уберем надпись, оставив только картинку (которую можно заменить на пустую)
ЭлементыФормы.ОсновныеДействияФормы.Кнопки.Согласовать.Отображение = ОтображениеКнопкиКоманднойПанели.Картинка;

Общие рекомендации для эффективной работы

Независимо от типа форм, при управлении видимостью элементов стоит придерживаться нескольких правил, которые помогут избежать ошибок и замедления работы программы:

  1. События инициализации: Всегда устанавливайте начальное состояние кнопок при открытии формы. В управляемых формах это ПриСозданииНаСервере, в обычных — ПриОткрытии.
  2. Оптимизация серверных вызовов: Если вы работаете в управляемом приложении, старайтесь минимизировать количество переходов между клиентом и сервером. Если видимость зависит от простых условий, которые можно вычислить на клиенте, делайте это на клиенте (хотя свойство Видимость элементов формы чаще всего требует контекста сервера).
  3. Использование групп: Если нужно скрыть сразу группу кнопок, объедините их в один контейнер (группу кнопок). Тогда вам достаточно будет изменить видимость всего одной Группы, и все вложенные элементы исчезнут автоматически. Это гораздо производительнее, чем менять свойства каждой кнопки по отдельности.
  4. Обновление отображения: В управляемых формах после программного изменения данных, влияющих на интерфейс, иногда полезно вызвать метод ЭтаФорма.ОбновитьОтображениеДанных(), чтобы форсировать перерисовку элементов.

Таким образом, выбор метода зависит от конкретных задач бизнеса и типа используемых в конфигурации форм. Для новых разработок (УФ) предпочтительным является Условное оформление, а для поддержки старых систем (ОФ) — управление Доступностью или программная модификация состава кнопок.

← На главную