Разработка и Конфигурация · 10 мин
Модальная форма в 1С: что это и как с ней работать
Модальная форма в 1С — что это такое, чем отличается блокирующий режим от немодального, как открыть форму модально и почему платформа переходит на асинхронные вызовы.
Модальная форма в 1С — это форма, которая блокирует работу с остальными окнами приложения до тех пор, пока пользователь её не закроет. Пока модальное окно открыто, нельзя переключиться на другой документ, справочник или отчёт: платформа ждёт завершения диалога. Такой механизм нужен там, где продолжение работы невозможно без ответа пользователя — например, при подтверждении удаления объекта или вводе обязательных параметров.
В современных версиях платформы 1С:Предприятие 8.3 понятие модальности тесно связано с режимом использования модальности, который задаётся в свойствах конфигурации. Платформа постепенно уходит от синхронных блокирующих вызовов к асинхронным механизмам с обработчиками оповещений, поэтому разработчику важно понимать оба подхода: старый код с модальными вызовами встречается в типовых и самописных конфигурациях повсеместно.
Материал разбирает, что такое модальная форма на практике, чем отличаются методы ОткрытьФормуМодально и ОткрытьФорму, как работает блокирующий режим, почему веб-клиент не поддерживает классическую модальность и как перевести код на асинхронные вызовы без потери логики.
Что такое модальность и как она устроена
Модальность — это свойство окна, при котором оно захватывает управление и не отдаёт его обратно, пока пользователь не завершит диалог. В тонком клиенте модальное окно визуально открывается поверх основного окна, а родительская форма становится неактивной: клики по ней игнорируются, меню и панели не реагируют.
С точки зрения кода ключевая особенность классической модальности — синхронность. Вызов ОткрытьФормуМодально приостанавливает выполнение модуля: следующая строка кода выполнится только после закрытия формы, и метод вернёт значение, переданное через Закрыть(Результат). Это удобно для линейной логики «спросил — получил ответ — продолжил».
Помимо явного открытия форм, к модальным относятся и встроенные блокирующие диалоги: Вопрос, Предупреждение, ВвестиЗначение, ВвестиСтроку, ВвестиДату. Все они останавливают выполнение кода до реакции пользователя.
Способы открыть форму модально
Основной метод — ОткрытьФормуМодально. Он вызывается у объекта формы или глобально с указанием имени формы и параметров. Результат возвращается через параметр процедуры Закрыть() в открываемой форме.
Результат = ОткрытьФормуМодально("Справочник.Номенклатура.Форма.ФормаВыбора");
Если Результат <> Неопределено Тогда
Объект.Товар = Результат;
КонецЕсли;Второй вариант — установить у формы свойство РежимОткрытияОкна в значение БлокироватьВесьИнтерфейс или БлокироватьОкноВладельца и открыть её обычным ОткрытьФорму. Визуально такая форма ведёт себя как модальная, но код продолжает выполняться сразу — результат придёт через оповещение.
Третий способ — блокирующие диалоги платформы. Например, ВвестиЗначение(Значение, "Укажите склад") открывает системное модальное окно ввода без создания отдельной формы.
Чем модальная форма отличается от немодальной
| Параметр | Модальная форма | Немодальная форма |
|---|---|---|
| Выполнение кода | Останавливается до закрытия формы | Продолжается сразу после открытия |
| Возврат результата | Через возвращаемое значение метода | Через ОписаниеОповещения или Оповестить |
| Доступ к другим окнам | Заблокирован | Свободен |
| Работа в веб-клиенте | Не поддерживается | Поддерживается |
| Требования к режиму конфигурации | Нужен режим «Использовать» | Работает в любом режиме |
Главное практическое различие — переносимость. Код с модальными вызовами не запустится в веб-клиенте и выдаст ошибку, если в свойствах конфигурации установлен режим использования модальности «Не использовать». Немодальный вариант с оповещениями работает везде, но требует перестройки логики: продолжение алгоритма переносится в отдельную процедуру-обработчик.
Режим использования модальности в свойствах конфигурации
В корне конфигурации есть свойство «Режим использования модальности» с тремя значениями: «Использовать», «Не использовать» и «Использовать с предупреждениями». Оно определяет, допустимы ли синхронные модальные вызовы в коде.
При значении «Не использовать» любой вызов ОткрытьФормуМодально, Вопрос или ВвестиЗначение завершится ошибкой времени выполнения. При значении «Использовать с предупреждениями» код работает, но платформа фиксирует устаревшие вызовы — это удобный промежуточный режим при постепенной миграции.
Как заменить модальный вызов на асинхронный
Асинхронная замена строится на трёх элементах: методе с постфиксом «Асинх» или «Показать», объекте ОписаниеОповещения и процедуре-обработчике, которая получит результат после закрытия диалога.
Оповещение = Новый ОписаниеОповещения("ПослеВыбораТовара", ЭтотОбъект);
ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаВыбора", , ЭтотОбъект, , , , Оповещение);
&НаКлиенте
Процедура ПослеВыбораТовара(Результат, ДопПараметры) Экспорт
Если Результат <> Неопределено Тогда
Объект.Товар = Результат;
КонецЕсли;
КонецПроцедурыСоответствия для типовых замен: Вопрос → ПоказатьВопрос, Предупреждение → ПоказатьПредупреждение, ВвестиЗначение → ПоказатьВводЗначения, ВвестиСтроку → ПоказатьВводСтроки, ОткрытьФормуМодально → ОткрытьФорму с описанием оповещения.
- 1Найдите модальный вызов и определите, какой результат он возвращает
- 2Создайте экспортную клиентскую процедуру-обработчик с параметрами Результат и ДополнительныеПараметры
- 3Перенесите в неё весь код, который выполнялся после модального вызова
- 4Создайте ОписаниеОповещения с именем этой процедуры
- 5Замените вызов на асинхронный аналог, передав оповещение
- 6Протестируйте сценарий в тонком и веб-клиенте
Где модальные формы уместны, а где нет
Модальность оправдана в коротких обязательных диалогах: подтверждение удаления, выбор одного значения перед продолжением операции, ввод пароля или кода подтверждения. Здесь блокировка интерфейса — не недостаток, а защита от непоследовательных действий пользователя.
Модальность вредна, когда форма нужна для длительной работы: редактирование документа, подбор товаров с переключением между окнами, просмотр отчёта рядом с исходными данными. Блокировка интерфейса в таких сценариях раздражает пользователей и ломает привычные рабочие процессы.
Как выбрать подход
Типичные ошибки и ограничения
Отдельная ловушка — смешение подходов: часть логики остаётся после асинхронного вызова «как раньше», а часть перенесена в обработчик. В результате код выполняется в непредсказуемом порядке. Правило простое: всё, что зависит от результата диалога, должно находиться внутри обработчика оповещения.
Как проверить результат
Родительское окно заблокировано, результат возвращается в обработчик
Код после вызова выполняется с пустым результатом
Диалог открывается и возвращает значение
Ошибка «Модальные вызовы не поддерживаются»
Нет сообщений о запрещённых модальных вызовах
Ошибки на строки с Вопрос, ОткрытьФормуМодально
FAQ
Чем ОткрытьФормуМодально отличается от ПолучитьФорму с последующим ОткрытьМодально?
Обе конструкции дают модальное окно, но первая создаёт форму по имени и сразу открывает её, а вторая позволяет получить объект формы, настроить её программно и только потом открыть. Обе устарели и не работают при режиме модальности «Не использовать».
Почему в веб-клиенте нельзя открыть форму модально?
Браузерная модель не позволяет остановить выполнение JavaScript-кода до действия пользователя без блокировки всей страницы. Поэтому платформа в веб-клиенте поддерживает только асинхронную модель с оповещениями, а синхронные модальные вызовы завершаются ошибкой.
Как вернуть несколько значений из формы, открытой через ОткрытьФорму?
Передайте из формы структуру: в обработчике закрытия или через Закрыть(Структура) сформируйте структуру с нужными ключами. В процедуре-обработчике оповещения параметр Результат будет содержать эту структуру, и все значения доступны по именам ключей.
Что делает РежимОткрытияОкна «БлокироватьВесьИнтерфейс»?
Форма открывается обычным асинхронным способом, но визуально блокирует все окна приложения, как модальная. Код при этом продолжает выполняться, а результат приходит через описание оповещения — это совместимый с веб-клиентом способ получить модальное поведение интерфейса.
Как найти все модальные вызовы в конфигурации?
Выполните полнотекстовый поиск по модулям конфигурации по строкам «ОткрытьФормуМодально», «Вопрос(», «ВвестиЗначение», «ВвестиСтроку», «Предупреждение(». Дополнительно установите режим «Использовать с предупреждениями» и проверьте конфигурацию — платформа укажет устаревшие вызовы.
Нужно ли переделывать модальные вызовы, если конфигурация работает только в тонком клиенте?
Если режим модальности «Использовать» и переход на веб-клиент не планируется, код будет работать. Однако любая будущая миграция на свежую типовую платформу или веб-клиент потребует переделки, поэтому новый код разумно писать сразу асинхронным.
Что важно запомнить
Модальная форма блокирует интерфейс и останавливает код до закрытия. Классические вызовы вроде ОткрытьФормуМодально и Вопрос не работают в веб-клиенте и запрещены при режиме «Не использовать». Современная замена — ОткрытьФорму и Показать-методы с ОписаниеОповещения, а вся логика после диалога переносится в процедуру-обработчик.