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