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

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

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

Понимание клиентского управления видимостью

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

Для того чтобы изменить видимость, достаточно обратиться к коллекции Элементы, доступной на клиенте, и установить свойство Видимость в значение Истина или Ложь.

Реализация логики при изменении значения пользователем

Рассмотрим классический пример: на форме есть флажок, при установке которого становится видимым поле ввода. Весь код размещается в обработчике события ПриИзменении для элемента флажка:


&НаКлиенте
Процедура ФлажокПриИзменении(Элемент)
    // Управляем видимостью элемента напрямую
    Элементы.НужноеПоле.Видимость = Объект.Флажок;
КонецПроцедуры

Обратите внимание: мы используем Объект.Флажок, так как данные реквизита уже переданы в контекст формы. Если же вам нужно переключить видимость на противоположную, можно использовать конструкцию:


&НаКлиенте
Процедура СкрытьПоле(Элемент)
    Элементы.Строка.Видимость = Не Элементы.Строка.Видимость;
КонецПроцедуры

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

Частый вопрос разработчиков: «Как обеспечить правильную видимость элементов сразу после открытия формы?». Для этого мы используем событие ПриСозданииНаСервере для установки начальных значений данных и вспомогательную процедуру, которую можно вызвать и на сервере, и на клиенте.

Разберем создание универсальной процедуры для управления видимостью:


&НаКлиентеНаСервереБезКонтекста
Процедура УправлениеВидимостью(Форма)
    // Устанавливаем видимость элемента на основе реквизита
    Форма.Элементы.ПолеДляОтображения.Видимость = Форма.Объект.Флажок;
КонецПроцедуры

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

Использование директивы &НаКлиентеНаСервереБезКонтекста позволяет вызывать одну и ту же процедуру из любого модуля (и серверного, и клиентского), передавая объект ЭтаФорма в качестве параметра. Это «золотой стандарт» чистого кода в 1С.

Важные рекомендации по работе с видимостью

  1. Видимость vs Доступность: Помните, что Видимость = Ложь полностью исключает элемент из визуального пространства формы. Если вам нужно просто запретить ввод данных, но оставить элемент на экране, используйте свойство Доступность.
  2. Работа с группами: Если вы управляете видимостью целой группы элементов, нет необходимости скрывать каждый элемент по отдельности. Достаточно скрыть саму группу (например, Элементы.ГруппаРеквизитов.Видимость = Ложь), и все вложенные элементы автоматически станут невидимыми.
  3. Пользовательская видимость: Прежде чем писать сложный код, проверьте стандартную функциональность 1С — настройку «Пользовательская видимость» в режиме «Еще -> Настройка формы». Это позволяет пользователям самим управлять интерфейсом без изменения конфигурации.
  4. Производительность: Старайтесь не вызывать методы изменения видимости слишком часто в событиях, которые срабатывают постоянно (например, ПриАктивизацииСтроки в табличных частях), так как это приводит к постоянной перерисовке формы и «мерцанию» интерфейса.

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

← На главную