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

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

Режим использования модальности в 1С 8.3: что это и как работает

Что такое режим использования модальности в 1С 8.3, какие значения принимает, как включить или отключить модальные окна и как переписать код без модальных вызовов.

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

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

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

Что такое модальное окно и почему от него отказались

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

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

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

Какие значения принимает свойство и чем они отличаются

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

ЗначениеПоведение платформыКогда применяется
ИспользоватьМодальные вызовы разрешены и выполняютсяСтарые конфигурации, работающие только в толстом/тонком клиенте
Использовать с предупреждениямиВызовы выполняются, но выводятся предупреждения о нежелательностиПереходный период при постепенной переработке кода
Не использоватьМодальные вызовы приводят к ошибке выполненияКонфигурации для веб-клиента и новые разработки

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

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

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

Порядок действий
  1. 1
    Откройте конфигуратор и выполните команду «Конфигурация — Открыть конфигурацию»
  2. 2
    В дереве конфигурации выделите корневой узел с именем конфигурации и откройте его свойства (правый клик — «Свойства» или Alt+Enter)
  3. 3
    Найдите свойство «Режим использования модальности» и установите нужное значение
  4. 4
    Сохраните конфигурацию и выполните «Обновление конфигурации базы данных» (F7)
  5. 5
    Запустите базу в режиме предприятия и проверьте типовые сценарии работы пользователей

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

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

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

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

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

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

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

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

1c
// Было (модально):
// Ответ = Вопрос("Продолжить проведение?", РежимДиалогаВопрос.ДаНет);

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

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

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

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

Что выбрать для своей конфигурации

Решение зависит от того, где работают пользователи и насколько глубоко конфигурация доработана. Самописная конфигурация, эксплуатируемая только в тонком клиенте внутри локальной сети, может годами жить в режиме «Использовать». Конфигурация, к которой подключаются через веб-клиент или планируется публикация на веб-сервере, обязана работать без модальности.

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

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

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

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

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

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

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

Нет сообщений о модальных вызовах

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

Список процедур с запрещёнными синхронными методами

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

Документы проводятся, формы закрываются с вопросом о сохранении без ошибок

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

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

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

Все интерактивные сценарии отрабатывают в браузере

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

Диалоги не открываются или сценарий обрывается

Диалоги выбора и сохранения файлов
Норма

Файл выбирается и обрабатывается через обработчик оповещения

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

После выбора файла ничего не происходит или возникает ошибка

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

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

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

Можно ли работать в веб-клиенте с включённым режимом «Использовать»?

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

Изменится ли поведение типовой конфигурации, если я поменяю это свойство?

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

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

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

Нужно ли переписывать все модальные вызовы сразу?

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

Влияет ли режим модальности на внешние обработки и отчёты?

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

Итог

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

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