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

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

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

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

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

Модальность — это не свойство конкретной формы, а способ её открытия. Одна и та же форма может быть открыта обычным способом (пользователь свободно переключается между окнами) или модально (окно захватывает весь интерфейс). Разработчик управляет этим через методы открытия формы и параметры режима окна.

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

Что такое модальная форма простыми словами

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

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

Противоположность модального окна — немодальное (обычное). Пользователь может открыть список документов, свернуть его, открыть отчёт, вернуться обратно. Окна существуют параллельно и не блокируют друг друга.

Какие виды модальных окон есть в 1С

В платформе существует несколько способов показать модальное окно. Их условно делят на встроенные диалоги и произвольные формы, открытые в модальном режиме.

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

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

Сравнение вариантов

Блокировать весь интерфейс

Полная модальность: недоступны все окна. Подходит для критических вопросов, но мешает многозадачности и запрещён в асинхронной модели.

Блокировать окно владельца

Недоступна только форма-родитель. Рекомендуемый вариант для подчинённых окон: выбор элемента, настройки, ввод дополнительных данных.

Независимый

Окно ничего не блокирует. Стандартный режим для списков, отчётов и рабочих мест.

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

Разница видна непосредственно в тексте модуля. При модальном вызове результат возвращается из метода, и код продолжается сразу после него:

// Старый модальный способ

Результат = Вопрос("Сохранить изменения?", РежимДиалогаВопрос.ДаНет);

Если Результат = КодВозвратаДиалога.Да Тогда

ЗаписатьДокумент();

КонецЕсли;

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

// Асинхронный способ

Оповещение = Новый ОписаниеОповещения("ПослеВопросаОСохранении", ЭтотОбъект);

ПоказатьВопрос(Оповещение, "Сохранить изменения?", РежимДиалогаВопрос.ДаНет);

&НаКлиенте

Процедура ПослеВопросаОСохранении(Результат, ДопПараметры) Экспорт

Если Результат = КодВозвратаДиалога.Да Тогда

ЗаписатьДокумент();

КонецЕсли;

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

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

Почему платформа отказывается от модальных окон

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

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

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

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

Как открыть форму в модальном режиме правильно

Если переход на асинхронность ещё не завершён или конфигурация работает только в толстом/тонком клиенте, модальное открытие делается методом ОткрытьФормуМодально:

Результат = ОткрытьФормуМодально("Справочник.Номенклатура.Форма.ФормаВыбора");

Если Результат <> Неопределено Тогда

Объект.Товар = Результат;

КонецЕсли;

Современный эквивалент — ОткрытьФорму с описанием оповещения о закрытии и, при необходимости, режимом блокировки окна владельца:

Оповещение = Новый ОписаниеОповещения("ПослеВыбораТовара", ЭтотОбъект);

ОткрытьФорму("Справочник.Номенклатура.Форма.ФормаВыбора", , ЭтотОбъект, , , , Оповещение,

РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

Такой вариант визуально ведёт себя как модальный (родительская форма заблокирована), но код не останавливается — результат обрабатывается в процедуре ПослеВыбораТовара. Это лучший компромисс между привычным поведением и требованиями платформы.

Частый приём при рефакторинге: сначала заменить ОткрытьФормуМодально на ОткрытьФорму с блокировкой окна владельца и оповещением, а уже потом переписывать логику обработчиков. Так изменения вносятся поэтапно и легче тестируются.
ПЗ
Практическое замечание

Типичные ошибки при работе с модальными формами

Самая частая ошибка — ожидание возвращаемого значения от асинхронного метода. Строка вида Результат = ПоказатьВопрос(...) не даст результата выбора: метод ничего не возвращает, а ответ придёт позже в обработчик оповещения. Код после такого вызова выполнится немедленно, до ответа пользователя.

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

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

Типичные ошибки
01
Попытка получить результат из ПоказатьВопрос как возвращаемое значение — код продолжает выполняться сразу, до ответа пользователя.
02
Модальный вызов в серверном или фоновом коде — исключение или зависание задания.
03
Потеря нужных переменных при выносе логики в обработчик оповещения — передавайте их через ДополнительныеПараметры.
04
Открытие модального окна из обработчика ожидания — накапливаются повторные вызовы и окна дублируются.

Как проверить, что форма работает корректно

После замены модальных вызовов проверьте поведение во всех клиентах, в которых работает конфигурация. Минимальный набор проверок: открытие формы, блокировка родительского окна, корректная обработка ответа «Да»/«Нет»/«Отмена», повторное открытие без дублирования окон.

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

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

Поведение родительской формы
Норма

Форма-владелец недоступна, пока открыто дочернее окно

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

Можно переключиться и изменить данные, которые дочерняя форма должна обработать

Обработка ответа
Норма

Логика выполняется один раз после закрытия диалога

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

Код срабатывает до ответа пользователя или несколько раз

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

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

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

Ошибки «Использование модальных окон запрещено» или пустые реакции на кнопки

Отдельно проверьте сценарий отмены: пользователь закрыл окно крестиком, не выбрав значение. Обработчик оповещения получит Неопределено — этот случай должен быть явно обработан, иначе возможны ошибки обращения к пустому результату.

Часто задаваемые вопросы

Чем модальное окно отличается от блокирующего?

В контексте 1С это практически синонимы. Модальное окно всегда блокирует интерфейс (весь или окно владельца). Термин «блокирующее» чаще используют применительно к настройке РежимОткрытияОкна, а «модальное» — к способу вызова, при котором код останавливается до закрытия окна.

Можно ли использовать модальные окна в управляемом приложении?

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

Что использовать вместо ОткрытьФормуМодально?

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

Почему ПоказатьВопрос не возвращает результат?

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

Как передать данные в обработчик оповещения?

Через третий параметр конструктора ОписаниеОповещения — ДополнительныеПараметры. Обычно туда помещают структуру с нужными значениями из исходной процедуры, и эта структура приходит вторым аргументом в процедуру-обработчик.

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

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

Итог

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

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