Как открыть произвольную форму асинхронно и дождаться результата в веб-клиенте?

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

При разработке под управляемые формы 1С многие разработчики сталкиваются с тем, что привычный метод ОткрытьМодально перестает быть надежным инструментом, особенно при работе в веб-клиенте. В отличие от толстого клиента, браузер не позволяет «заморозить» исполнение кода до момента закрытия окна. Давайте разберемся, почему так происходит и как правильно перестроить архитектуру вашего кода.

Почему нельзя просто «ждать» закрытия формы?

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

Основные подходы к решению задачи

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

1. Использование ОписанияОповещения

Это стандартный путь, рекомендуемый платформой и использующий шаблоны для применения cтандартов разработки. Вместо того чтобы пытаться остановить код, мы описываем логику «после закрытия» внутри отдельной процедуры. Рассмотрим пример:

Сначала мы определяем процедуру, которая будет вызвана после закрытия формы:


Процедура ПослеЗакрытияФормы(РезультатЗакрытия, ДополнительныеПараметры) Экспорт
    Если РезультатЗакрытия = Истина Тогда
        // Продолжаем выполнение логики здесь
    КонецЕсли;
КонецПроцедуры

Теперь при вызове формы мы передаем описание этого оповещения (быстро получить каркас кода поможет Консоль кода + ИИ-помощник):


Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияФормы", ЭтотОбъект);
ОткрытьФорму("ОбщиеФормы.МояФорма", , , , , , Оповещение);

2. Решение для процедуры ПередНачаломРаботыСистемы

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

Разберем, как «отвязать» открытие формы от системного потока:


Процедура ПередНачаломРаботыСистемы(Отказ)
    // Вместо открытия формы вызываем обработчик ожидания
    ПодключитьОбработчикОжидания("ОткрытьМоюФормуПриСтарте", 1, Истина);
КонецПроцедуры

Процедура ОткрытьМоюФормуПриСтарте() Экспорт
    ОткрытьФорму("ОбщиеФормы.МояФорма");
КонецПроцедуры

Параметр Истина в методе ПодключитьОбработчикОжидания указывает, что обработчик должен сработать только один раз.

Когда стоит блокировать интерфейс?

Если ваша задача — предотвратить действия пользователя в других окнах, пока открыта ваша форма, используйте метод ОткрытьФорму с установкой режима открытия:

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

Рекомендации по архитектуре кода

  1. Откажитесь от «ожидания» в коде. Примите событийную модель как данность. Если ваш алгоритм состоит из нескольких шагов, где каждый шаг зависит от результата предыдущей формы, выстраивайте цепочку вызовов ОписаниеОповещения.
  2. Используйте состояния. Если логика очень ветвистая, можно создать переменную состояния модуля (например, ЭтапВыполнения), которая будет меняться при вызове процедур оповещения.
  3. Используйте ВыполнитьОбработкуОповещения. Если в некоторых ветках условий форма не открывается, но логику выполнения кода нужно продолжить (как если бы форма была закрыта), вы можете вызвать обработчик принудительно через ВыполнитьОбработкуОповещения(Оповещение, Результат). Это позволит объединить «путь с формой» и «путь без формы» в одну общую процедуру обработки результата.

Таким образом, хотя прямого аналога ОткрытьМодально в веб-клиенте нет, гибкое использование ОписаниеОповещения и механизмов отложенного вызова позволяет решать даже самые сложные задачи при инициализации системы или при обработке цепочек действий пользователя.

← На главную