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