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