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

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

1С: использование модальных окон в данном режиме запрещено — как убрать ошибку

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

Ошибка «Использование модальных окон в данном режиме запрещено» появляется в 1С, когда программный код пытается открыть модальное окно (вопрос, предупреждение, ввод значения), а текущий режим работы платформы этого не допускает. Чаще всего проблема возникает в веб-клиенте, в тонком клиенте с выключенной модальностью и в фоновых или серверных вызовах, где интерактивный диалог с пользователем невозможен в принципе.

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

Убрать ошибку можно двумя путями: изменить настройки режима работы (быстрое решение для пользователя) или переписать проблемный участок кода на немодальные вызовы (правильное решение для разработчика). Ниже разобраны оба подхода, условия их применения и способы проверить результат.

Почему 1С запрещает модальные окна

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

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

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

Ошибка только в браузереВеб-клиент

Модальность в веб-клиенте всегда ограничена, нужен немодальный код

Ошибка у всех при одном действииКод конфигурации

Найти вызов Вопрос/Предупреждение в обработчике операции

Ошибка без пользователей, по расписаниюРегламентное задание

Серверный контекст: диалоги невозможны, нужно убрать интерактив

Ошибка после обновленияСмена режима совместимости

Обновление могло сменить настройку использования модальности

Как быстро убрать ошибку через настройки режима модальности

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ПослеОтветаНаВопрос(Результат, ДопПараметры) Экспорт
    Если Результат = КодВозвратаДиалога.Нет Тогда
        Возврат;
    КонецЕсли;
    ПровестиДокумент();
КонецПроцедуры

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

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

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

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

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

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

Если конфигурация большая или доработанная, искать запрещённые вызовы вручную долго. Используйте глобальный поиск по конфигурации (Ctrl+Shift+F в конфигураторе) по ключевым словам: Вопрос(, Предупреждение(, ВвестиЗначение, ВвестиСтроку, ВвестиЧисло, ВвестиДату, ОткрытьФормуМодально, ВыбратьФайл в синхронном варианте.

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

Выбор стратегии: настройка или доработка кода

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

Сравнение вариантов решения

Включить режим модальности

Быстро, без программирования. Подходит для тонкого/толстого клиента. Не работает в веб-клиенте и на сервере, считается устаревшим подходом

Переписать на ПоказатьВопрос и оповещения

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

Вынести интерактив на клиента

Для общих модулей со смешанным контекстом: вопрос задаётся на клиенте, результат передаётся на сервер параметром

Убрать диалог из регламентного задания

Единственный вариант для фоновых задач: автоматическое решение по правилам плюс запись в журнал

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

Маршрут решения

Как выбрать действие

Все пользователи в тонком клиенте, ошибку нужно убрать сегодняВключите режим использования модальности в свойствах конфигурации и обновите базу
Часть пользователей работает через браузерДорабатывайте код: заменяйте Вопрос/Предупреждение на ПоказатьВопрос/ПоказатьПредупреждение
Ошибка возникает в регламентном заданииУберите диалог из кода задания, замените на автоматическое решение и запись в журнал
Конфигурация типовая, ошибка после обновленияПроверьте, не сбросился ли режим модальности, и сверьте поведение с документацией поставщика релиза

Проверка результата после исправления

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

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

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

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

Повтор операции
Норма

Операция завершается, диалог отображается корректно

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

Ошибка повторяется или появляется в другом месте

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

Все диалоги открываются асинхронно, сбоев нет

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

Текст про запрет модальных окон в браузере

Журнал регистрации
Норма

Нет новых ошибок по проблемному модулю

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

Ошибки с тем же текстом после исправления

Регламентные задания
Норма

Задание завершается с состоянием «Выполнено»

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

Задание падает с ошибкой интерактивного вызова

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

Можно ли убрать ошибку без доступа к конфигуратору?

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

Почему ошибка появилась после обновления конфигурации?

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

Поможет ли включение модальности для веб-клиента?

Нет. В браузере модальные окна технически невозможны из-за асинхронной природы веб-приложений. Для веб-клиента единственное решение — переписать вызовы на ПоказатьВопрос, ПоказатьПредупреждение и ОткрытьФорму с описанием оповещения.

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

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

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

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

Как найти все места с запрещёнными вызовами?

Запустите проверку конфигурации с контролем модальности (Конфигурация — Проверка конфигурации) и дополнительно глобальный поиск по словам Вопрос(, Предупреждение(, ВвестиЗначение, ОткрытьФормуМодально. Проверка конфигурации даст точный список модулей и строк.

Итог

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

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