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

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

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

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

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

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

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

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

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

Аналогия из жизни: модальное окно — это как сотрудник, который встал в дверях кабинета и ждёт ответа на вопрос. Пока вы ему не ответите, ни вы не продолжите работу, ни он не уйдёт. Обычное (немодальное) окно — это записка на столе: её можно прочитать сейчас, позже или вообще проигнорировать, работа не останавливается.

Где модальные окна встречаются в типовых 1С

Рядовой пользователь сталкивается с модальными окнами постоянно, даже не зная термина. Типичные примеры в конфигурациях «1С:Бухгалтерия», «Управление торговлей», «Зарплата и управление персоналом»:

  • вопрос «Провести документ?» или «Записать изменения перед закрытием?»;
  • предупреждение «Объект стал недоступным для изменения» при нарушении даты запрета;
  • окно ввода пароля при подключении к информационной базе или обмене данными;
  • диалог выбора файла при загрузке выписок банка или выгрузке отчётности;
  • окно «О программе» и некоторые сервисные сообщения.

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

Виды окон в 1С: модальные, блокирующие и обычные

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

РежимЧто блокируетОстанавливает ли кодГде применяется
Модальное окноВесь интерфейс приложенияДа, до закрытияВопросы, ввод значения, выбор файла
Блокирующее окно владельцаТолько форму-владельцаНет (работает через оповещения)Формы выбора, подчинённые диалоги
Обычное (независимое) окноНичегоНетСписки, отчёты, рабочие столы

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

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

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

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

Асинхронный вопрос через ПоказатьВопрос

Подходит для подтверждений: код продолжит выполнение в обработчике оповещения после ответа.

Предупреждение с таймаутом

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

Почему в 1С 8.3 модальный режим запрещён по умолчанию

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

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

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

В старом (синхронном) стиле вопрос пользователю выглядел так: вызов Вопрос("Удалить документ?", РежимДиалогаВопрос.ДаНет) возвращал ответ сразу, и код продолжался ниже. Такой подход до сих пор работает, если режим модальности разрешён, но считается устаревшим.

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

&НаКлиенте

Процедура УдалитьДокумент(Команда)

Оповещение = Новый ОписаниеОповещения("ПослеОтветаНаВопрос", ЭтотОбъект);

ПоказатьВопрос(Оповещение, "Удалить документ?", РежимДиалогаВопрос.ДаНет);

КонецПроцедуры

&НаКлиенте

Процедура ПослеОтветаНаВопрос(Результат, ДополнительныеПараметры) Экспорт

Если Результат = КодВозвратаДиалога.Да Тогда

// действия по удалению

КонецЕсли;

КонецПроцедуры

Для открытия форм вместо устаревшего ОткрытьФормуМодально() используется метод ОткрытьФорму() с параметрами: в структуре параметров передаётся описание оповещения о закрытии, а режим открытия задаётся через свойство РежимОткрытияОкна — например, «Блокировать окно владельца». Результат, который форма вернёт при закрытии, придёт в процедуру обработки оповещения.

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

Как проверить, что всё работает правильно

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

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

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

Открытие диалога вопроса
Норма

Окно появляется, после ответа код продолжает работу в обработчике оповещения

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

Ошибка «Использование модальных окон запрещено» или молчаливое прерывание

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

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

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

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

Форма выбора
Норма

Форма блокирует только окно-владелец, выбранное значение возвращается через оповещение

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

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

Закрытие формы с изменениями
Норма

Задаётся вопрос о сохранении, отмена закрытия работает

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

Форма закрывается без вопроса, данные теряются

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

Типичные ошибки и ограничения

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

Вторая группа ошибок связана с ожиданиями пользователей: если модальное окно не появляется (например, режим модальности отключён, а код старый), операция просто прерывается с ошибкой, и пользователь не понимает причину. Администратору в такой ситуации нужно смотреть журнал регистрации и текст ошибки, а не перезапускать программу.

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

Как поступить в вашей ситуации

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

Частые вопросы о модальных окнах в 1С

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

Программа не зависает — модальное окно намеренно блокирует остальной интерфейс, пока вы не ответите. Нажмите одну из кнопок диалога или закройте окно, и работа продолжится. Если окно скрылось за другими окнами, найдите его в панели задач или через Alt+Tab.

Что означает ошибка «Использование модальных окон в данном режиме запрещено»?

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

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

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

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

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

Модальное окно появляется за главным окном, и программа кажется зависшей. Что делать?

Так бывает при работе с несколькими мониторами или после переключения между окнами. Нажмите Alt+Tab и найдите диалог, либо проверьте панель задач. Если окно найти не удаётся, иногда помогает нажатие Esc или Enter — стандартные кнопки диалога сработают по умолчанию.

Итог

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

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