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

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

Что такое режим модальности в 1С и как с ним работать

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

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

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

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

Что такое модальное окно и почему оно блокирует работу

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

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

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

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

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

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

Как проверить и изменить режим в конфигураторе

Проверка занимает меньше минуты. Откройте конфигуратор, выделите корень дерева конфигурации и откройте палитру свойств (правый клик → «Свойства»). В списке найдите «Режим использования модальности» и «Режим использования синхронных вызовов расширений платформы и внешних компонент».

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

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

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

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

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

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

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

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

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

Главная сложность — не синтаксис, а изменение структуры кода. Линейная логика «спросил → проверил → выполнил» разбивается на цепочку процедур. Если после ответа нужно задать следующий вопрос, цепочка оповещений удлиняется. Дополнительные данные между вызовами передаются через параметр «ДополнительныеПараметры» описания оповещения.

Типичные ошибки
01
Вызов модального метода внутри обработчика оповещения — в режиме «Не использовать» это та же ошибка, просто глубже в стеке.
02
Попытка вернуть результат из асинхронной процедуры через Возврат — результат приходит только в процедуру оповещения.
03
Потеря контекста: в процедуре-обработчике нет локальных переменных вызвавшего кода, данные нужно передавать через ДополнительныеПараметры.
04
Смена режима без проверки расширений конфигурации — модальные вызовы могут прятаться и в коде расширений.

Модальные формы и блокирование интерфейса

Модальность касается не только диалогов, но и обычных форм. Параметр РежимОткрытияОкна.БлокироватьОкноВладельца или БлокироватьВесьИнтерфейс при открытии формы делает её модальной визуально, но в асинхронной модели код продолжает выполняться — результат закрытия приходит через оповещение.

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

Сравнение вариантов открытия формы

Блокировать весь интерфейс

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

Блокировать окно владельца

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

Независимое открытие

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

Как проверить, что конфигурация работает без модальности

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

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

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

Проверка конфигурации в конфигураторе
Норма

Список ошибок модальных и синхронных вызовов пуст

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

Есть строки с методами Вопрос, Предупреждение, ОткрытьФормуМодально

Запуск в веб-клиенте
Норма

Формы открываются, диалоги показываются, ошибок нет

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

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

Тестирование ключевых сценариев
Норма

Проведение, печать, обмены проходят без прерываний

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

Сценарий обрывается на этапе вопроса или выбора файла

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

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

Частые вопросы о режиме модальности

Почему возникает ошибка «Использование модальных окон в данном режиме запрещено»?

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

Можно ли работать в веб-клиенте с включённой модальностью?

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

Чем ПоказатьВопрос отличается от Вопрос?

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

Нужно ли переписывать типовую конфигурацию при переходе на веб-клиент?

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

Что делать, если модальных вызовов слишком много для разовой доработки?

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

Влияет ли режим модальности на серверный код?

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

Итог

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

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