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