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