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

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

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

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

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

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

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

Что означает ошибка и когда она возникает

Модальное окно — это окно, которое блокирует работу с программой до тех пор, пока пользователь не ответит: диалог «Да/Нет», предупреждение, окно ввода строки, форма, открытая с ожиданием результата. В толстом клиенте и старых версиях платформы такие вызовы были нормой, и огромный объём кода типовых и самописных конфигураций написан именно на них.

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

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

Быстрое исправление для пользователя: разрешить модальные окна

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

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

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

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

Правильное исправление: переход на асинхронные вызовы

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

Соответствие методов следующее: Вопрос() заменяется на ПоказатьВопрос(), Предупреждение() — на ПоказатьПредупреждение(), ВвестиЗначение() — на ПоказатьВводЗначения(), ВвестиСтроку() — на ПоказатьВводСтроки(), ОткрытьФормуМодально() — на ОткрытьФорму() с параметром описания оповещения о закрытии.

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

bsl
&НаКлиенте
Процедура УдалитьСтроку(Команда)
	Оповещение = Новый ОписаниеОповещения("УдалитьСтрокуЗавершение", ЭтотОбъект);
	ПоказатьВопрос(Оповещение, "Удалить выбранную строку?", РежимДиалогаВопрос.ДаНет);
КонецПроцедуры

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

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

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

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

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

Особенности для веб-клиента и тонкого клиента

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

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

Сравнение вариантов исправления

Включить модальность в параметрах пользователя

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

Установить режим модальности в свойствах конфигурации

Действует для всех пользователей тонкого клиента. Требует доступа к конфигуратору и может осложнить обновление типовой конфигурации.

Переписать код на асинхронные методы

Единственное решение для веб-клиента и долгосрочно правильный вариант. Требует времени разработчика и тестирования.

Типичные ошибки при исправлении

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

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

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

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

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

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

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

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

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

Повторный запуск проблемной операции
Норма

Окно открывается, ошибки нет, сценарий завершается

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

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

Реакция на ответ пользователя
Норма

Выбор «Да» и «Нет» приводит к правильным ветвям логики

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

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

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

Нет новых ошибок по сеансу пользователя

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

Фиксируются ошибки вызова обработчика оповещения

Часто задаваемые вопросы

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

Да, если вы работаете в тонком клиенте: включите использование модальных окон в параметрах пользователя («Сервис» → «Параметры»). Если этой настройки нет или она не помогает, а также в веб-клиенте — без доработки кода не обойтись, потребуется разработчик.

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

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

Опасно ли включать режим «Использовать» для модальности?

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

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

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

Ошибка возникает во внешней обработке, а конфигурация типовая. Что делать?

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

Работает ли настройка модальности в мобильном клиенте?

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

Итог

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

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