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