Как скрыть или отобразить группы элементов на управляемой форме в зависимости от значения булево?

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

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

Оптимальное переключение видимости на клиенте

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

Разберем, как упростить код без использования избыточных условий Если ... Тогда. Поскольку реквизит ЮрЛицо имеет тип Булево, его значение можно напрямую присваивать свойству Видимость.

Для поля ввода или флажка создадим обработчик события ПриИзменении на клиенте:


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

&НаКлиенте
Процедура УстановитьВидимостьЭлементов()
    
    Элементы.ГруппаЮрЛица.Видимость = Объект.ЮрЛицо;
    Элементы.ГруппаФизЛица.Видимость = НЕ Объект.ЮрЛицо;
    
КонецПроцедуры

Инициализация состояния формы при открытии и чтении данных

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

Проанализируем события формы, в которых требуется настройка видимости:

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

Посмотрим на пример организации серверного кода:


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

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
    
    УстановитьВидимостьЭлементовНаСервере();
    
КонецПроцедуры

&НаСервере
Процедура УстановитьВидимостьЭлементовНаСервере()
    
    Элементы.ГруппаЮрЛица.Видимость = Объект.ЮрЛицо;
    Элементы.ГруппаФизЛица.Видимость = НЕ Объект.ЮрЛицо;
    
КонецПроцедуры

Альтернативный вариант: переключение страниц без закладок

Если на форме много полей и управление видимостью отдельных групп становится громоздким, удобнее использовать элемент формы вида Группа страниц с режимом отображения ОтображениеЗакладок.НеОтображать.

Разберем реализацию этого способа:

  1. Создаем на форме группу с видом Страницы (например, ГруппаСтраницыВида) и выключаем у нее отображение закладок.
  2. Внутрь добавляем две страницы: СтраницаЮрЛицо и СтраницаФизЛицо, в которые переносим соответствующие реквизиты.
  3. В обработчике события меняем активную страницу в одну строку кода:

&НаКлиенте
Процедура ЮрЛицоПриИзменении(Элемент)
    
    Элементы.ГруппаСтраницыВида.ТекущаяСтраница = ?(Объект.ЮрЛицо, Элементы.СтраницаЮрЛицо, Элементы.СтраницаФизЛицо);
    
КонецПроцедуры

Важные особенности при работе со скрытыми реквизитами

При динамическом управлении интерфейсом следует учитывать два ключевых правила платформы 1С:

  1. Очистка значений: простое скрытие группы элементов с формы не очищает данные из реквизита Объект. Если пользователь сначала заполнил данные юридического лица, а затем переключил признак на физическое лицо, данные скрытых полей останутся в объекте и будут записаны в базу данных. При смене режима рекомендуется программно очищать неактуальные реквизиты.
  2. Проверка заполнения: если для скрываемого реквизита на уровне объекта или формы установлено свойство ПроверкаЗаполнения = ВыдаватьОшибку, платформа выдаст ошибку при записи объекта, даже если пользователь физически не видит это поле. В таком случае проверку заполнения следует переносить в обработчик ОбработкаПроверкиЗаполненияНаСервере и проверять обязательность полей с учетом значения признака Объект.ЮрЛицо.
← На главную