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

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

Что значит «модально» в 1С: модальные окна и методы

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

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

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

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

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

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

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

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

Где встречается модальность: типичные методы и сценарии

В языке 1С модальные методы исторически имели суффикс «Модально» или являлись модальными по умолчанию. К наиболее частым относятся:

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

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

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

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

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

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

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

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

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

ЗначениеПоведениеКогда применять
Не использоватьЛюбой модальный вызов завершается ошибкойНовые конфигурации, работа в веб-клиенте
ИспользоватьМодальные методы работают как раньшеТолько тонкий клиент, переходный период
Использовать с предупреждениямиМетоды работают, но в отладке и журнале фиксируются предупрежденияПостепенная миграция старого кода

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

Как изменить режим модальности
  1. 1
    Сделайте резервную копию информационной базы
  2. 2
    Откройте конфигуратор и корень дерева конфигурации
  3. 3
    В свойствах найдите «Режим использования модальности»
  4. 4
    Установите нужное значение и обновите конфигурацию базы данных
  5. 5
    Проверьте проблемный сценарий в пользовательском режиме

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

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

Модальный методАсинхронная замена
ВопросМодальноПоказатьВопрос
ПредупреждениеМодальноПоказатьПредупреждение
ОткрытьФормуМодальноОткрытьФорму с описанием оповещения о закрытии
ВвестиЗначение / ВвестиСтрокуПоказатьВводЗначения / ПоказатьВводСтроки
ДиалогВыбораФайла.Выбрать()НачатьПомещениеФайла / Показать диалог с оповещением

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

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

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

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

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

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

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

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

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

Запуск обработки в режиме «Не использовать»
Норма

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

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

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

Ответ пользователя в диалоге
Норма

После ответа выполняется нужная логика

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

После закрытия диалога ничего не происходит

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

Окно блокирует только свою форму

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

Интерфейс зависает или диалог не появляется

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

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

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

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

Итог

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

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

Частые вопросы

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

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

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

Модальное окно блокирует всё приложение целиком и останавливает выполнение кода. Блокирующее окно закрывает доступ только к форме-владельцу, а остальными окнами можно пользоваться. Блокирующие окна разрешены и в современном интерфейсе, модальные — нет.

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

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

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

Запустите проверку конфигурации с отмеченным пунктом о модальных вызовах — получите список всех мест в коде. Дополнительно поищите глобальным поиском по модулям строки «Модально» и «БлокироватьВесьИнтерфейс».

Почему после замены ВопросМодально на ПоказатьВопрос код перестал работать?

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

Модальность влияет на обычных пользователей или только на разработчиков?

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