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