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

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

Модальность в 1С: что это и как с ней работать

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

Модальность в 1С — это способ отображения окон, при котором открытое окно блокирует работу со всем остальным интерфейсом программы, пока пользователь не закроет его. Пока модальное окно открыто, выполнение кода приостанавливается и ждёт ответа пользователя: нажатия кнопки, выбора файла, подтверждения действия. Классический пример — диалог «Сохранить изменения?» с кнопками «Да», «Нет», «Отмена».

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

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

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

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

Механика проста: код дошёл до строки Ответ = Вопрос("Продолжить?", РежимДиалогаВопрос.ДаНет) — выполнение остановилось, пользователь ответил, метод вернул значение, код пошёл дальше. Такая линейная логика удобна для разработчика: результат доступен сразу в следующей строке, не нужны обработчики ожидания.

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

Режим использования модальности: доступные значения

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

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

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

Как проверить текущий режим и найти модальные вызовы

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

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

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

Порядок действий
  1. 1
    Откройте конфигуратор и палитру свойств корневого узла конфигурации
  2. 2
    Проверьте значение «Режим использования модальности» и смежную настройку синхронных вызовов
  3. 3
    Запустите проверку конфигурации с флагом поиска модальных вызовов
  4. 4
    Составьте список модулей, требующих доработки
  5. 5
    Дорабатывайте и тестируйте код по одному сценарию, начиная с самых массовых операций

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

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

Сравните два подхода на примере вопроса пользователю:

// Старый модальный вариант

Ответ = Вопрос("Провести документ?", РежимДиалогаВопрос.ДаНет);

Если Ответ = КодВозвратаДиалога.Да Тогда

ЗаписатьДокумент();

КонецЕсли;

// Асинхронный вариант

Оповещение = Новый ОписаниеОповещения("ПослеВопросаОПроведении", ЭтотОбъект);

ПоказатьВопрос(Оповещение, "Провести документ?", РежимДиалогаВопрос.ДаНет);

&НаКлиенте

Процедура ПослеВопросаОПроведении(Результат, ДопПараметры) Экспорт

Если Результат = КодВозвратаДиалога.Да Тогда

ЗаписатьДокумент();

КонецЕсли;

КонецПроцедуры

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

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

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

Синхронные вызовы расширений и внешних компонентов

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

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

Типичные сценарии и частые ошибки

Обновление старой конфигурации до управляемых форм

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

Диалоги в серверных процедурах

В управляемом приложении код на сервере не может показывать пользователю вопросы и предупреждения — на сервере нет интерфейса. Если при переносе логики на сервер туда попал вызов Вопрос() или Сообщить() с модальным поведением, сценарий упадёт. Решение: вся интерактивная логика остаётся на клиенте, сервер только получает готовые решения пользователя в виде параметров.

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

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

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

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

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

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

Проверка конфигурации на модальные вызовы
Норма

Отчёт не содержит замечаний по модальности

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

В отчёте остаются строки с модальными методами

Запуск сценария в режиме «Не использовать»
Норма

Диалоги показываются, операции завершаются корректно

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

Ошибка выполнения при вызове диалога

Работа в веб-клиенте
Норма

Файлы загружаются, печать и обмены работают

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

Требования установить расширение или ошибки при операциях с файлами

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

Чем модальное окно отличается от блокирующего окна формы?

В контексте 1С эти понятия близки: модальное окно блокирует интерфейс и останавливает код. Блокирующая форма может только перекрывать окно-владелец визуально, не останавливая выполнение кода — например, форма, открытая асинхронно с оповещением о закрытии. Именно остановка кода является проблемой для веб-клиента.

Можно ли оставить режим «Использовать», если веб-клиент не нужен?

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

Почему после обновления платформы появились предупреждения о модальности?

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

Что делать с модальным вопросом внутри цикла обработки строк?

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

Влияет ли режим модальности на обмены и фоновые задания?

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

Нужно ли дорабатывать внешние обработки и отчёты?

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

Итог

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

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