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

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

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

Что такое модальное окно в 1С: блокирующие и предупреждающие окна, режимы открытия форм, команды ОткрытьФормуМодально и ПоказатьВопрос, типичные ошибки разработчиков.

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

Такие окна встречаются повсюду: вопрос «Записать и закрыть?» при выходе из документа, предупреждение о незаполненных реквизитах, выбор периода перед построением отчёта. Для пользователя это способ программы «потребовать внимания», для разработчика — инструмент управления сценарием работы, у которого есть важные ограничения.

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

Что такое модальное окно и как оно себя ведёт

Главный признак модального окна — блокировка родительского интерфейса. Пока диалог открыт, пользователь не может переключиться на другую форму, отредактировать документ в фоне или выполнить команду меню. Единственные доступные действия — те, что предлагает само окно: кнопки «Да», «Нет», «ОК», «Отмена» и поля ввода внутри него.

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

Отличить модальное окно от обычной формы можно просто: попробуйте кликнуть мимо него — по основному окну программы. Если фон «не отвечает» или издаёт системный звук, а заголовок главного окна теряет фокус — перед вами модальный диалог. Обычная (немодальная) форма позволяет свободно переключаться между окнами.

Виды модальных окон в 1С

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

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

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

Где модальные окна встречаются в типовых конфигурациях

Пользователь сталкивается с модальными диалогами ежедневно, даже не подозревая об этом. Типичные ситуации: при закрытии незаписанного документа программа спрашивает «Записать?»; при попытке провести документ с пустыми обязательными полями появляется предупреждение; при удалении элемента справочника запрашивается подтверждение.

В старых конфигурациях на обычных формах (8.1, ранние 8.2) модальные окна использовались массово: выбор элемента из списка, установка периода, настройки отчёта могли открываться модально. В современных управляемых формах типовых решений (1С:Бухгалтерия, 1С:ERP, 1С:Зарплата и управление персоналом) классические модальные вызовы заменены на блокирующие формы и асинхронные диалоги, но для пользователя разница почти незаметна.

Как разработчику открыть модальное окно

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

Устаревший синхронный способ

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

bsl
// Устаревший способ — не использовать в новых разработках
Результат = Вопрос("Продолжить операцию?", РежимДиалогаВопрос.ДаНет);
Если Результат = КодВозвратаДиалога.Да Тогда
    ВыполнитьОбработку();
КонецЕсли;

Рекомендуемый асинхронный способ

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

bsl
&НаКлиенте
Процедура КомандаВыполнить(Команда)
    Оповещение = Новый ОписаниеОповещения("ПослеОтветаНаВопрос", ЭтотОбъект);
    ПоказатьВопрос(Оповещение, "Продолжить операцию?", РежимДиалогаВопрос.ДаНет);
КонецПроцедуры

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

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

Как заменить модальный вызов на рекомендуемый
  1. 1
    Найдите в коде вызовы Вопрос(), Предупреждение(), ОткрытьФормуМодально()
  2. 2
    Замените их на ПоказатьВопрос(), ПоказатьПредупреждение(), ОткрытьФорму() с оповещением
  3. 3
    Вынесите логику после ответа пользователя в отдельную экспортную процедуру-обработчик
  4. 4
    Проверьте в свойствах конфигурации режим использования модальности — установите «Не использовать»
  5. 5
    Протестируйте сценарий в тонком клиенте и веб-клиенте

Ограничения и риски модального режима

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

Второй риск — «зависший» интерфейс. Если модальное окно открылось за пределами видимой области экрана (например, после отключения второго монитора), программа выглядит зависшей: окно есть, но его не видно, а остальной интерфейс заблокирован. Помогает комбинация Alt + Tab для поиска скрытого окна или завершение сеанса через диспетчер задач с потерей несохранённых данных.

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

Модальное или немодальное: как выбрать поведение формы

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

Сравнение вариантов открытия

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

Подходит для критичных решений: подтверждения, ввод обязательных данных. Ограничение — пользователь не может работать параллельно.

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

Диалог привязан к конкретной форме, остальные окна доступны. Подходит для выбора значений внутри одного документа.

Независимое окно

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

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

Ошибки встречаются как у пользователей, так и у разработчиков. Пользовательские связаны в основном с «потерянными» окнами и невнимательным чтением вопросов — например, нажатие «Нет» на вопрос «Записать документ?» приводит к потере введённых данных.

Ошибки разработчиков системнее и дороже обходятся, поэтому их стоит перечислить отдельно.

Типичные ошибки разработчиков
01
Использование Вопрос() и ОткрытьФормуМодально() в новом коде — приводит к ошибкам в тонком и веб-клиенте
02
Вызов модальных методов в серверном коде или фоновом задании — гарантированная ошибка выполнения
03
Логика, записанная сразу после асинхронного ПоказатьВопрос() в той же процедуре — выполняется до ответа пользователя и работает неверно
04
Открытие формы модально без обработки результата — выбор пользователя теряется
05
Отсутствие обработки ответа «Отмена» — сценарий продолжается, хотя пользователь отказался

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

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

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

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

Диалог появляется, ответ обрабатывается корректно

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

Ошибка о недопустимости модального вызова

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

Сценарий выполняется полностью, результат учтён

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

Операция молча прерывается или выдаёт ошибку

Код после вызова диалога
Норма

Логика расположена в обработчике оповещения

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

Логика идёт сразу после ПоказатьВопрос() в той же процедуре

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

Почему 1С «зависла», а на самом деле открыто модальное окно?

Модальное окно могло открыться за границами экрана или за главным окном. Нажмите Alt + Tab и найдите диалог в списке окон либо сверните главное окно программы. Если окно не находится, сеанс придётся завершить принудительно — несохранённые данные будут потеряны.

Чем ОткрытьФормуМодально() отличается от ОткрытьФорму()?

Первый метод останавливает выполнение кода до закрытия формы и возвращает результат напрямую, но считается устаревшим и не работает в веб-клиенте. Второй открывает форму и продолжает выполнение; результат закрытия получают через описание оповещения.

Можно ли отключить модальные окна пользователю?

Нет, это поведение определяется кодом конфигурации и настройками платформы, а не пользовательскими параметрами. Пользователь может только корректно отвечать на диалоги. Изменить поведение способен разработчик или администратор, доработав конфигурацию.

Что такое описание оповещения простыми словами?

Это «записка» для платформы: какую процедуру вызвать, когда пользователь закроет диалог или форму. Вместо ожидания ответа на месте код продолжает работать, а результат приходит в указанную процедуру-обработчик позже.

Работают ли модальные окна в мобильном клиенте 1С?

Классические синхронные модальные вызовы не поддерживаются. Используйте асинхронные методы семейства «Показать» — они корректно работают во всех клиентах, включая мобильный.

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

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

Итог

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

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