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