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