Как программно скрыть поле на форме при выборе значения из выпадающего списка в 1С?

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

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

Распространенная ошибка: обращение к интерфейсу вместо данных

Многие начинающие разработчики пытаются узнать выбранное значение, обращаясь напрямую к свойству элемента формы, например: Элементы.ВариантыЗавершенияЗаказа.СписокВыбора. Посмотрим, почему этот подход не работает.

В платформе 1С (особенно в управляемых формах) существует строгое разделение на «данные» (реквизиты объекта) и «интерфейс» (элементы формы, кнопки, декорации). Свойство СписокВыбора у элемента формы содержит лишь коллекцию доступных вариантов, которые система предлагает пользователю в выпадающем меню. Узнать, что именно сейчас выбрал пользователь, через этот список невозможно. Для проверки текущего значения мы всегда должны обращаться к самим данным — то есть к реквизиту формы или объекта (например, Объект.ВариантыЗавершенияЗаказа).

Правильная архитектура решения

Проанализируем ситуацию: в какой момент форма должна пересчитывать видимость поля? Таких моментов два:

  1. Когда пользователь интерактивно меняет статус прямо на форме. Для этого мы задействуем обработчик события ПриИзменении у поля статуса заказа.
  2. Когда форма только открывается. Если мы откроем старый документ, в котором уже установлен статус «Успешно», поле причины отмены должно быть скрыто изначально. Для этого используем событие ПриСозданииНаСервере (или ПриЧтенииНаСервере).

Правилом хорошего тона в 1С является вынос общей логики управления видимостью в отдельную процедуру. Рассмотрим подробнее, как это должно выглядеть в программном модуле формы.

Пример программного кода

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


&НаКлиенте
Процедура ВариантыЗавершенияЗаказаПриИзменении(Элемент)
    // Вызываем общую процедуру обновления видимости при ручном выборе
    УстановитьВидимостьПричиныОтмены();
КонецПроцедуры

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Вызываем ту же процедуру при открытии формы
    УстановитьВидимостьПричиныОтмены();
КонецПроцедуры

&НаСервере
Процедура УстановитьВидимостьПричиныОтмены()
    // Проверяем само выбранное значение реквизита объекта!
    Если Объект.ВариантыЗавершенияЗаказа = "Успешно" Тогда
        Элементы.ПричинаОтмены.Видимость = Ложь;
    Иначе
        Элементы.ПричинаОтмены.Видимость = Истина;
    КонецЕсли;
КонецПроцедуры

Обратите внимание: в примере выше мы сравниваем реквизит со строкой "Успешно". На практике варианты завершения чаще всего хранятся в перечислениях. Если это так, то условие будет выглядеть следующим образом:


Если Объект.ВариантыЗавершенияЗаказа = Перечисления.ВариантыЗавершения.Успешно Тогда
    Элементы.ПричинаОтмены.Видимость = Ложь;
Иначе
    Элементы.ПричинаОтмены.Видимость = Истина;
КонецЕсли;

Важный нюанс: Видимость против Доступности

Посмотрим на еще один важный аспект работы с элементами формы. В 1С есть два похожих, но принципиально разных программных свойства: Видимость и Доступность.

Если мы установим Элементы.ПричинаОтмены.Видимость = Ложь, поле физически исчезнет с экрана. Место, которое оно занимало, освободится, а элементы, расположенные ниже или правее, сдвинутся, заполняя пустоту (зависит от настроек группировок). Это делает интерфейс более чистым и избавляет пользователя от лишней информации.

Однако иногда дизайн формы требует жесткой структуры, чтобы элементы не «прыгали» при переключении статусов. В таком случае мы выясним, что лучше использовать свойство Доступность. Если установить Элементы.ПричинаОтмены.Доступность = Ложь, поле останется на своем месте, но станет серым, и пользователь не сможет в него ничего написать или нажать. Выбор между видимостью и доступностью зависит исключительно от требований к эргономике конкретного рабочего места.

← На главную