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