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

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

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

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

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

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

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

Что такое модальное окно и как оно работает

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

Такое поведение удобно для линейных сценариев: провести документ → спросить подтверждение → продолжить. Логика читается сверху вниз, и разработчику не нужно продумывать ветвления. Именно поэтому в старых конфигурациях на платформе 8.2 и ранних версиях 8.3 модальные вызовы встречаются повсеместно.

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

Какие модальные методы существуют во встроенном языке

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

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

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

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

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

КритерийМодальное окноБлокирующее окно
Выполнение кодаОстанавливается до ответаПродолжается асинхронно, результат приходит в обработчик
Тонкий и веб-клиентНе поддерживаетсяПоддерживается
Мобильная платформаНе поддерживаетсяПоддерживается
Структура кодаЛинейная, простаяРазбита на процедуры с оповещениями
Статус в платформеУстаревший подходРекомендуемый подход

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

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

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

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

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

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

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

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

bsl
// Было (модально):
// Ответ = Вопрос("Провести документ?", РежимДиалогаВопрос.ДаНет);

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

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

Где модальные окна ещё встречаются и что с этим делать

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

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

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

Как проверить, что конфигурация работает без модальности

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

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

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

Режим использования модальности в свойствах конфигурации
Норма

Установлено «Не использовать», конфигурация обновляется без ошибок

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

Стоит «Использовать» или «Использовать с предупреждениями»

Проверка конфигурации в конфигураторе
Норма

Нет ошибок о модальных вызовах

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

Ошибки вида «Модальные вызовы запрещены»

Работа ключевых сценариев в тонком и веб-клиенте
Норма

Диалоги открываются, логика продолжается после ответа

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

Ошибки при проведении, закрытии форм, выборе файлов

Глобальный поиск по коду
Норма

Методы Вопрос(, Предупреждение(, ОткрытьФормуМодально( не найдены

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

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

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

Итог

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

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

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

Чем модальное окно отличается от обычного сообщения пользователю?

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

Почему в веб-клиенте появляется ошибка «Модальные окна запрещены»?

Ошибка означает, что код формы вызывает модальный метод — например, Вопрос() или ОткрытьФормуМодально(), а веб-клиент физически не может выполнить синхронный вызов. Решение одно: заменить вызов на асинхронный аналог с описанием оповещения. Никакие настройки браузера или сервера эту ошибку не устранят.

Можно ли оставить модальность, если все работают только в толстом клиенте?

Технически — да, установив режим «Использовать». Но это технический долг: при переходе на тонкий или веб-клиент, обновлении платформы или подключении мобильных пользователей весь модальный код придётся переписывать в сжатые сроки. Разумнее устранять модальность постепенно, при каждой доработке затронутых модулей.

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

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

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

Используйте глобальный поиск по конфигурации (меню «Правка — Глобальный поиск») по строкам «Вопрос(», «Предупреждение(», «ОткрытьФормуМодально(», «ВвестиЗначение(», «ВвестиСтроку(», «ВвестиЧисло(», «ВвестиДату(». Дополнительно запустите проверку конфигурации с режимом модальности «Не использовать» — платформа сама укажет проблемные места.

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

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