К статье
Практический материал

Разработка и Конфигурация · 10 мин

Модальная форма в 1С: что это и как с ней работать

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

Модальная форма в 1С — это форма, которая блокирует работу с остальными окнами приложения до тех пор, пока пользователь её не закроет. Пока модальное окно открыто, нельзя переключиться на другой документ, справочник или отчёт: платформа ждёт завершения диалога. Такой механизм нужен там, где продолжение работы невозможно без ответа пользователя — например, при подтверждении удаления объекта или вводе обязательных параметров.

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

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

Что такое модальность и как она устроена

Модальность — это свойство окна, при котором оно захватывает управление и не отдаёт его обратно, пока пользователь не завершит диалог. В тонком клиенте модальное окно визуально открывается поверх основного окна, а родительская форма становится неактивной: клики по ней игнорируются, меню и панели не реагируют.

С точки зрения кода ключевая особенность классической модальности — синхронность. Вызов ОткрытьФормуМодально приостанавливает выполнение модуля: следующая строка кода выполнится только после закрытия формы, и метод вернёт значение, переданное через Закрыть(Результат). Это удобно для линейной логики «спросил — получил ответ — продолжил».

Помимо явного открытия форм, к модальным относятся и встроенные блокирующие диалоги: Вопрос, Предупреждение, ВвестиЗначение, ВвестиСтроку, ВвестиДату. Все они останавливают выполнение кода до реакции пользователя.

Способы открыть форму модально

Основной метод — ОткрытьФормуМодально. Он вызывается у объекта формы или глобально с указанием имени формы и параметров. Результат возвращается через параметр процедуры Закрыть() в открываемой форме.

bsl
Результат = ОткрытьФормуМодально("Справочник.Номенклатура.Форма.ФормаВыбора");
Если Результат <> Неопределено Тогда
    Объект.Товар = Результат;
КонецЕсли;

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

Третий способ — блокирующие диалоги платформы. Например, ВвестиЗначение(Значение, "Укажите склад") открывает системное модальное окно ввода без создания отдельной формы.

Чем модальная форма отличается от немодальной

ПараметрМодальная формаНемодальная форма
Выполнение кодаОстанавливается до закрытия формыПродолжается сразу после открытия
Возврат результатаЧерез возвращаемое значение методаЧерез ОписаниеОповещения или Оповестить
Доступ к другим окнамЗаблокированСвободен
Работа в веб-клиентеНе поддерживаетсяПоддерживается
Требования к режиму конфигурацииНужен режим «Использовать»Работает в любом режиме

Главное практическое различие — переносимость. Код с модальными вызовами не запустится в веб-клиенте и выдаст ошибку, если в свойствах конфигурации установлен режим использования модальности «Не использовать». Немодальный вариант с оповещениями работает везде, но требует перестройки логики: продолжение алгоритма переносится в отдельную процедуру-обработчик.

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

В корне конфигурации есть свойство «Режим использования модальности» с тремя значениями: «Использовать», «Не использовать» и «Использовать с предупреждениями». Оно определяет, допустимы ли синхронные модальные вызовы в коде.

При значении «Не использовать» любой вызов ОткрытьФормуМодально, Вопрос или ВвестиЗначение завершится ошибкой времени выполнения. При значении «Использовать с предупреждениями» код работает, но платформа фиксирует устаревшие вызовы — это удобный промежуточный режим при постепенной миграции.

Как заменить модальный вызов на асинхронный

Асинхронная замена строится на трёх элементах: методе с постфиксом «Асинх» или «Показать», объекте ОписаниеОповещения и процедуре-обработчике, которая получит результат после закрытия диалога.

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

&НаКлиенте
Процедура ПослеВыбораТовара(Результат, ДопПараметры) Экспорт
    Если Результат <> Неопределено Тогда
        Объект.Товар = Результат;
    КонецЕсли;
КонецПроцедуры

Соответствия для типовых замен: Вопрос → ПоказатьВопрос, Предупреждение → ПоказатьПредупреждение, ВвестиЗначение → ПоказатьВводЗначения, ВвестиСтроку → ПоказатьВводСтроки, ОткрытьФормуМодально → ОткрытьФорму с описанием оповещения.

Порядок перевода кода на асинхронный вызов
  1. 1
    Найдите модальный вызов и определите, какой результат он возвращает
  2. 2
    Создайте экспортную клиентскую процедуру-обработчик с параметрами Результат и ДополнительныеПараметры
  3. 3
    Перенесите в неё весь код, который выполнялся после модального вызова
  4. 4
    Создайте ОписаниеОповещения с именем этой процедуры
  5. 5
    Замените вызов на асинхронный аналог, передав оповещение
  6. 6
    Протестируйте сценарий в тонком и веб-клиенте

Где модальные формы уместны, а где нет

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

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

Маршрут решения

Как выбрать подход

Нужен короткий ответ пользователя и конфигурация работает только в тонком клиенте со старым режимомДопустим ОткрытьФормуМодально или блокирующий диалог
Конфигурация работает в веб-клиенте или режим модальности — «Не использовать»Только ОткрытьФорму с ОписаниеОповещения
Пользователь должен видеть несколько окон одновременноНемодальная форма без блокировки интерфейса
Нужно визуально заблокировать родительское окно, но код должен остаться асинхроннымОткрытьФорму с РежимОткрытияОкна = БлокироватьОкноВладельца и оповещением

Типичные ошибки и ограничения

Типичные ошибки
01
Использование ОткрытьФормуМодально в конфигурации с режимом «Не использовать» — ошибка времени выполнения у пользователя
02
Ожидание результата сразу после ОткрытьФорму — код продолжает выполняться, результат всегда пустой
03
Забытый Экспорт у процедуры-обработчика оповещения — платформа не сможет её вызвать
04
Модальное окно внутри длительной операции — интерфейс зависает без индикации прогресса
05
Проверка только в тонком клиенте — в веб-клиенте модальный вызов падает, и это обнаруживается у пользователя

Отдельная ловушка — смешение подходов: часть логики остаётся после асинхронного вызова «как раньше», а часть перенесена в обработчик. В результате код выполняется в непредсказуемом порядке. Правило простое: всё, что зависит от результата диалога, должно находиться внутри обработчика оповещения.

Контрольные точки

Как проверить результат

Поведение формы при открытии
Норма

Родительское окно заблокировано, результат возвращается в обработчик

Тревожный признак

Код после вызова выполняется с пустым результатом

Работа в веб-клиенте
Норма

Диалог открывается и возвращает значение

Тревожный признак

Ошибка «Модальные вызовы не поддерживаются»

Проверка конфигуратором
Норма

Нет сообщений о запрещённых модальных вызовах

Тревожный признак

Ошибки на строки с Вопрос, ОткрытьФормуМодально

FAQ

Чем ОткрытьФормуМодально отличается от ПолучитьФорму с последующим ОткрытьМодально?

Обе конструкции дают модальное окно, но первая создаёт форму по имени и сразу открывает её, а вторая позволяет получить объект формы, настроить её программно и только потом открыть. Обе устарели и не работают при режиме модальности «Не использовать».

Почему в веб-клиенте нельзя открыть форму модально?

Браузерная модель не позволяет остановить выполнение JavaScript-кода до действия пользователя без блокировки всей страницы. Поэтому платформа в веб-клиенте поддерживает только асинхронную модель с оповещениями, а синхронные модальные вызовы завершаются ошибкой.

Как вернуть несколько значений из формы, открытой через ОткрытьФорму?

Передайте из формы структуру: в обработчике закрытия или через Закрыть(Структура) сформируйте структуру с нужными ключами. В процедуре-обработчике оповещения параметр Результат будет содержать эту структуру, и все значения доступны по именам ключей.

Что делает РежимОткрытияОкна «БлокироватьВесьИнтерфейс»?

Форма открывается обычным асинхронным способом, но визуально блокирует все окна приложения, как модальная. Код при этом продолжает выполняться, а результат приходит через описание оповещения — это совместимый с веб-клиентом способ получить модальное поведение интерфейса.

Как найти все модальные вызовы в конфигурации?

Выполните полнотекстовый поиск по модулям конфигурации по строкам «ОткрытьФормуМодально», «Вопрос(», «ВвестиЗначение», «ВвестиСтроку», «Предупреждение(». Дополнительно установите режим «Использовать с предупреждениями» и проверьте конфигурацию — платформа укажет устаревшие вызовы.

Нужно ли переделывать модальные вызовы, если конфигурация работает только в тонком клиенте?

Если режим модальности «Использовать» и переход на веб-клиент не планируется, код будет работать. Однако любая будущая миграция на свежую типовую платформу или веб-клиент потребует переделки, поэтому новый код разумно писать сразу асинхронным.

Итог

Что важно запомнить

Модальная форма блокирует интерфейс и останавливает код до закрытия. Классические вызовы вроде ОткрытьФормуМодально и Вопрос не работают в веб-клиенте и запрещены при режиме «Не использовать». Современная замена — ОткрытьФорму и Показать-методы с ОписаниеОповещения, а вся логика после диалога переносится в процедуру-обработчик.