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