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