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