Как динамически обновить управляемую форму в 1С 8.3 при записи и управлять видимостью реквизитов?

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

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

Начинающие разработчики часто пытаются решить эту задачу «в лоб» неоптимальными методами, например, программно закрывая и заново открывая форму, либо избыточно перечитывая данные из базы с помощью метода Прочитать(). Такие «костыли» приводят к существенному замедлению работы интерфейса, лишним серверным вызовам, сбросу фокуса ввода и раздражению пользователей. В этой статье мы подробно разберем, как правильно организовать обновление управляемой формы и динамическое управление ее элементами.

Почему закрытие формы и метод «Прочитать()» — это плохие решения?

Прежде чем перейти к правильным практикам, давайте разберем, почему популярные среди новичков методы использовать не стоит:

  1. Закрытие и повторное открытие формы. Этот подход заставляет платформу заново инициализировать форму, выполнять тяжелые серверные обработчики ПриСозданииНаСервере, ПриЧтенииНаСервере и клиентский ПриОткрытии. Пользователь при этом видит мерцание экрана, теряет активную вкладку, а фокус курсора сбивается. Это грубое нарушение стандартов разработки 1С.
  2. Использование метода ЭтаФорма.Прочитать(). Данный метод предназначен исключительно для синхронизации данных формы с базой данных (например, если при записи на сервере сработал фоновый процесс или подписка, изменившая реквизиты объекта). Применять его просто ради того, чтобы «перерисовать» форму — крайне неэффективно, так как он совершает полноценный и тяжелый запрос к СУБД.

Рассмотрим правильные, быстрые и современные методы решения этой задачи.

Способ 1. Программное управление интерфейсом через единую процедуру

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

Разберем по шагам, как это реализовать:

Шаг 1. Создаем единую процедуру управления видимостью на клиенте

В модуле формы опишем процедуру, в которой сосредоточим всю логику включения/отключения и скрытия/отображения полей. Например, если у нас есть флаг МЦ_04, при включении которого поля «Склад» и «СкладПолучатель» должны скрываться, а также мы хотим показывать определенную группу только после того, как документ был записан в базу данных:


&НаКлиенте
Процедура УстановитьВидимостьДоступностьЭлементов()

    // Проверяем, записан ли текущий объект в базу данных
    ДокументЗаписан = ЗначениеЗаполнено(Объект.Ссылка);
    
    // Логика на основе реквизита МЦ_04
    Если Объект.МЦ_04 = Истина Тогда
        Элементы.СкладПолучатель.Доступность = Ложь;
        Элементы.СкладПолучатель.Видимость = Ложь;
        Элементы.Склад.Доступность = Ложь;
        Элементы.Склад.Видимость = Ложь;
    Иначе
        Элементы.СкладПолучатель.Доступность = Истина;
        Элементы.СкладПолучатель.Видимость = Истина;
        Элементы.Склад.Доступность = Истина;
        Элементы.Склад.Видимость = Истина;
    КонецЕсли;
    
    // Показываем дополнительную группу реквизитов только для уже записанных документов
    Элементы.ГруппаДополнительно.Видимость = ДокументЗаписан;

КонецПроцедуры

Шаг 2. Подключаем вызов процедуры к событиям жизненного цикла формы

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

  1. ПриОткрытии — для первоначальной настройки интерфейса при открытии формы пользователем.
  2. ПослеЗаписи — для пересчета видимости сразу после того, как документ успешно записан (например, чтобы показать скрытые ранее поля).
  3. ПриИзменении — обработчик события для тех реквизитов формы, изменение которых должно мгновенно влиять на видимость других полей (в нашем примере это поле МЦ_04).

Посмотрим на пример кода интеграции:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    УстановитьВидимостьДоступностьЭлементов();
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
    УстановитьВидимостьДоступностьЭлементов();
КонецПроцедуры

&НаКлиенте
Процедура ОбъектМЦ_04ПриИзменении(Элемент)
    УстановитьВидимостьДоступностьЭлементов();
КонецПроцедуры

Такой подход работает мгновенно на стороне клиента, не нагружает сервер и базу данных, а пользователь получает плавное и отзывчивое изменение интерфейса.

Способ 2. Декларативный метод — Условное оформление формы (без кода)

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

Рассмотрим, как настроить автоматическое управление видимостью через конфигуратор:

  1. Откроем нужную управляемую форму в конфигураторе.
  2. В окне свойств формы (в правом верхнем углу интерфейса редактора формы) перейдем на вкладку «Условное оформление».
  3. Нажмем кнопку «Добавить» для создания нового правила оформления.
  4. В появившемся окне настроим вкладку «Оформление»: найдем свойства Видимость или Доступность, установим флажок и укажем значение Ложь.
  5. Перейдем на вкладку «Условие»: добавим новое условие, выберем поле Объект.МЦ_04, вид сравнения — Равно, значение — Истина.
  6. Перейдем на вкладку «Оформляемые поля»: добавим в список элементы формы СкладПолучатель и Склад.
  7. Нажмем «ОК» для сохранения правила.

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

Способ 3. Использование легкого метода «ОбновитьОтображениеДанных()»

Иногда возникают ситуации, когда видимость элементов или условное оформление зависят от сложных вычислений, и платформа не сразу понимает, что данные изменились и экран нужно перерисовать. В этом случае на помощь приходит встроенный клиентский метод ЭтаФорма.ОбновитьОтображениеДанных().

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

Проанализируем пример использования при изменении реквизита:


&НаКлиенте
Процедура КакойТоРеквизитПриИзменении(Элемент)
    
    // Выполняем легкие клиентские расчеты
    // ...
    
    // Принудительно заставляем платформу перерисовать интерфейс
    ЭтаФорма.ОбновитьОтображениеДанных();
    
КонецПроцедуры

Подведем итоги и выберем лучший подход

Для эффективной работы интерфейса управляемого приложения всегда придерживайтесь следующих правил:

Применяя данные стандарты разработки, вы сделаете свои конфигурации быстрыми, а интерфейсы — удобными и приятными для конечных пользователей.

← На главную