- Зачем вообще говорить про немодальные вопросы
- Классический модальный Вопрос: как мы привыкли
- Пример модального диалога вопроса
- Почему модальность стала проблемой в 8.3
- РежимИспользованияМодальности и его последствия
- Что такое немодальный вопрос по‑человечески
- ПоказатьВопрос(): сигнатура без страшилок
- Немодальный пример на ПоказатьВопрос
- Как перестроить голову под асинхронность
- Асинх и Ждать: немодальное внутри, последовательный код снаружи
- Пример такого подхода
- Как ведут себя пользователи при открытии диалога с вопросом в программах
- Сравнение модального и немодального диалога в 1С
- MoscowSoft и миграция со старого кода
- Практический пример: долгий расчёт и подтверждение
- Переход с Вопрос() на ПоказатьВопрос() в реальных проектах
- Второе отступление: немного про стиль кода
- Мини‑чек‑лист для начинающего 1С‑ника
- Как MoscowSoft может помочь лично вам
- Переход на немодальные диалоги
Зачем вообще говорить про немодальные вопросы
Вопрос пользователю — это, казалось бы, мелочь. Окошко «Продолжить?» с парой кнопок. Но в современных конфигурациях 1С от того, как именно вы задаёте этот вопрос — модально или немодально — зависит, упадёт ли веб‑клиент, заблокируете ли вы интерфейс и получите ли знаменитое «Использование модальных окон в данном режиме запрещено!». Для новичка это особенно больно: код вроде простой, а платформа ругается. Поэтому давайте спокойно разберём, как это делалось «по‑старинке» через Вопрос, как это правильно делается сейчас через ПоказатьВопрос и почему немодальный диалог — не модная фишка, а уже рабочий стандарт.
Классический модальный Вопрос: как мы привыкли
Исторически всё было просто: нужно спросить пользователя — вызываем функцию Вопрос. Она открывает модальное окно, останавливает выполнение кода и ждёт, пока человек нажмёт кнопку. Пока окно открыто, интерфейс заблокирован: пользователь ничего другого сделать не может, только ответить. Удобно для мозгов, но не очень для современного UI, особенно веб‑клиента.
Пример модального диалога вопроса
Типичный код, который до сих пор можно встретить в живых конфигурациях:
&НаКлиенте Процедура ЗаполнитьТовары(Команда) Ответ = Вопрос( "Табличная часть будет очищена. Продолжить?", РежимДиалогаВопрос.ДаНет ); Если Ответ = КодВозвратаДиалога.Да Тогда ЗаполнитьТоварыАвтоматически(); КонецЕсли; КонецПроцедуры
Логика понятная: задали вопрос, подождали, посмотрели на ответ, пошли дальше. Всё линейно, всё в одной процедуре. Главная особенность здесь — прямое ожидание: пока пользователь думает, платформа стоит на паузе, и это именно модальное поведение.
Почему модальность стала проблемой в 8.3
Пока мир крутился вокруг толстого клиента и старых интерфейсов, модальные окна никого особо не напрягали. Но с появлением управляемых форм, интерфейса Такси и веб‑клиента модальность превратилась в серьёзное ограничение. В веб‑режиме модальное окно может блокировать не только вкладку 1С, но и весь браузер, а в тонком клиенте — ломать пользовательский сценарий, особенно если окна лезут друг на друга. Поэтому платформа ввела режим, в котором модальные окна просто запрещены, и при попытке вызвать Вопрос вы легко ловите ошибку «Использование модальных окон в данном режиме запрещено» и остановку кода.
РежимИспользованияМодальности и его последствия
В свойствах конфигурации появился знакомый пункт «Режим использования модальности». Если там стоит «Не использовать», платформа запрещает функции Вопрос, Предупреждение, ВвестиЧисло и прочие модальные диалоги. Это не прихоть разработчиков платформы, а попытка заставить нас писать асинхронный, немодальный код, который работает нормально и в тонком, и в веб‑клиенте. Многие начинающие 1С‑ники в этот момент удивляются: «Но раньше же работало?». Да, работало. Теперь нет — и это повод перестроиться.
Что такое немодальный вопрос по‑человечески
Немодальный диалог — это окно, которое не останавливает выполнение кода и не блокирует интерфейс целиком. Вызвали, показали вопрос, а программа пошла работать дальше. Пользователь отвечает, когда дойдёт руки, а мы обрабатываем этот ответ в отдельной процедуре‑обработчике. Для таких сценариев в 1С есть немодальная функция ПоказатьВопрос, которая как раз и предназначена для использования в режиме без модальности. Это уже не просто «спросил — подождал», а асинхронная история.
ПоказатьВопрос(): сигнатура без страшилок
Функция ПоказатьВопрос имеет довольно длинную сигнатуру, но в минимальном виде она выглядит так:
ПоказатьВопрос( ОписаниеОповещенияОЗавершении, ТекстВопроса, Кнопки, Таймаут, КнопкаПоУмолчанию, Заголовок, КнопкаТаймаута );
Главное отличие — первый параметр: ОписаниеОповещения. Это специальный объект, который описывает, какую процедуру вызвать после того, как пользователь закроет окно, и к какому объекту она относится. Именно через него мы получаем ответ, потому что немодальный диалог не возвращает значение сразу. Остальные параметры очень похожи на Вопрос: текст, набор кнопок (РежимДиалогаВопрос.*), заголовок и т.п.
Немодальный пример на ПоказатьВопрос
Перепишем наш пример с заполнением табличной части, но уже по‑современному:
&НаКлиенте Процедура ЗаполнитьТовары(Команда) Оповещение = Новый ОписаниеОповещения( "ПослеОтветаНаВопросЗаполнитьТовары", ЭтотОбъект ); ПоказатьВопрос( Оповещение, "Табличная часть будет очищена. Продолжить?", РежимДиалогаВопрос.ДаНет ); // ВНИМАНИЕ: код ниже выполняется сразу, не дожидаясь ответа! КонецПроцедуры &НаКлиенте Процедура ПослеОтветаНаВопросЗаполнитьТовары(Ответ, ДопПараметры) Экспорт Если Ответ = КодВозвратаДиалога.Да Тогда ЗаполнитьТоварыАвтоматически(); КонецЕсли; КонецПроцедуры
Здесь перелом в мышлении: процедура, которая задаёт вопрос, больше не знает, чем всё кончится. Она просто показывает диалог и заканчивается. Всё, что «после ответа», живёт в отдельной процедуре‑обработчике, и это нормальная асинхронная модель для 1С 8.3.
Как перестроить голову под асинхронность
Самая большая сложность для новичка — принять, что «последовательный» код распадается на фрагменты. Мы больше не можем написать: «спросил, жду, иду дальше». Вместо этого мы разбиваем логику на этапы: до вопроса, после вопроса, возможно, после ещё одного вопроса. Состояние приходится хранить либо в реквизитах формы, либо в параметрах оповещения, либо в каких‑то временных полях. Это сначала раздражает, но потом даёт гибкость: интерфейс не висит, пользователь может переключиться на другую форму, а вы в обработчике аккуратно проверяете, актуален ли ещё этот контекст.
Асинх и Ждать: немодальное внутри, последовательный код снаружи
В новых версиях платформы (начиная с 1С 8.3.18) появились ключевые слова Асинх и Ждать, которые позволяют работать с асинхронностью, в том числе с немодальными диалогами, но писать код почти как раньше — линейно. Идея в том, что ПоказатьВопрос остаётся немодальным методом, но Ждать создаёт вокруг него удобную обёртку, которая возвращает ответ как будто это обычная функция.
Пример такого подхода
&НаКлиенте Асинх Процедура ЗаполнитьТовары(Команда) Ответ = Ждать ПоказатьВопрос( Неопределено, // ОписаниеОповещения платформа создаст сама "Табличная часть будет очищена. Продолжить?", РежимДиалогаВопрос.ДаНет ); Если Ответ = КодВозвратаДиалога.Да Тогда ЗаполнитьТоварыАвтоматически(); КонецЕсли; КонецПроцедуры
Под капотом всё равно работает немодальный механизм с оповещением, но нам уже не нужно руками писать процедуру‑обработчик и разносить код по разным местам. Для начинающего разработчика такой переход куда мягче, чем «чистый» ПоказатьВопрос с ОписаниеОповещения.
Как ведут себя пользователи при открытии диалога с вопросом в программах
Часто на курсах или конференциях меня спрашивают: «А пользователи вообще читают эти вопросы?». И вот тут забавная правда жизни: большинство кликает «Да» не глядя. Поэтому, пока вы играете с модальными и немодальными диалогами, не забывайте о содержании текста и сценариях отмены. Иногда лучше вообще не спрашивать, чем задавать бессмысленный вопрос только ради галочки в ТЗ. Мы же всё‑таки пишем систему для людей, а не для галочек.
Сравнение модального и немодального диалога в 1С
Если коротко свести различия:
- Модальный Вопрос:
- Останавливает выполнение кода до ответа пользователя.
- Блокирует интерфейс, иногда весь клиент или браузер.
- Запрещён, если РежимИспользованияМодальности = НеИспользовать.
- Немодальный ПоказатьВопрос:
- Не останавливает выполнение, ответ приходит позже через оповещение.
- Интерфейс остаётся доступным, пользователь может параллельно работать с другими формами.
- Рекомендуется и фактически обязателен в режимах без модальности.
С точки зрения современной разработки, модальный диалог — это уже «антиквариат», который годится только для старых конфигураций и очень специфических режимов запуска.
MoscowSoft и миграция со старого кода
Здесь логично вспомнить про практику. MoscowSoft постоянно сталкивается с задачами перевода старых конфигураций на немодальную модель: поиск Вопрос/Предупреждение по всей базе, замена на ПоказатьВопрос, ПоказатьПредупреждение и асинхронные обработки. Компания с 2019 года является партнёром фирмы 1С, с 2023 года — аккредитованная ИТ‑компания, а в реестре российского ПО у неё уже больше 60 продуктов, которые про всё это знают не понаслышке. Такой опыт помогает не просто «заглушить ошибку модальности», а аккуратно переработать сценарии так, чтобы и пользователю комфортно, и коду не стыдно.
Практический пример: долгий расчёт и подтверждение
Посмотрим ещё один живой сценарий: перед запуском длительной обработки спрашиваем, готов ли пользователь подождать.
&НаКлиенте Процедура ВыполнитьДолгийРасчет(Команда) Оповещение = Новый ОписаниеОповещения( "ПослеОтветаНаВопросДолгийРасчет", ЭтотОбъект ); ПоказатьВопрос( Оповещение, "Расчет может занять несколько минут. Запустить сейчас?", РежимДиалогаВопрос.ДаНет ); КонецПроцедуры &НаКлиенте Процедура ПослеОтветаНаВопросДолгийРасчет(Ответ, ДопПараметры) Экспорт Если Ответ <> КодВозвратаДиалога.Да Тогда Возврат; КонецЕсли; // Здесь можно открыть форму прогресса, запустить фоновое задание и т.п. ЗапуститьДолгуюОбработку(); КонецПроцедуры
Такой подход отлично ложится на управляемые формы и веб‑клиент: пользователь может закрыть один документ, открыть другой, а когда расчёт завершится — получить уведомление или обновлённые данные. Диалог при этом не парализует интерфейс, а работает как аккуратная точка входа в долгий процесс.
Переход с Вопрос() на ПоказатьВопрос() в реальных проектах
При рефакторинге старого кода обычно используется простой алгоритм:
- Находим все места, где вызывается Вопрос, Предупреждение и другие модальные диалоги.
- Оцениваем, действительно ли там нужен вопрос, или это «рефлекс» разработчика.
- Для нужных вопросов:
- создаём ОписаниеОповещения;
- выносим «код после ответа» в отдельную процедуру;
- заменяем Вопрос на ПоказатьВопрос.
- Для сложных цепочек диалогов смотрим в сторону Асинх/Ждать — это часто упрощает поддержку.
Вот тут как раз и удобно привлекать команду уровня MoscowSoft: когда конфигурация большая, ручная замена превращается в серьёзный мини‑проект с анализом бизнес‑логики, а не только «тупой заменой по тексту».
Второе отступление: немного про стиль кода
Небольшая личная ремарка. На докладах я часто показываю один и тот же пример: два фрагмента кода, делающих одно и то же, но в одном — куча вложенных Если после модального вопроса, а в другом — короткие, ясные немодальные процедуры. И угадайте, какой код разработчики выбирают для сопровождения, если не знать, что там под капотом? Выбор почти всегда за читаемостью. Немодальность сама по себе не панацея, но часто именно она подталкивает к более аккуратной архитектуре и чистому коду.
Мини‑чек‑лист для начинающего 1С‑ника
Чтобы не запутаться, держите короткий перечень:
- Пишете новую конфигурацию под Такси и веб‑клиент — сразу ориентируйтесь на немодальные диалоги.
- Видите в старом коде Вопрос — проверьте, не включён ли режим «Не использовать модальность». Если включён, планируйте замену.
- Для простых сценариев используйте ПоказатьВопрос + ОписаниеОповещения.
- Для более сложных последовательностей (несколько вопросов, ожидание фоновых операций) изучите Асинх/Ждать — это сейчас золотой стандарт платформы.
- Не забывайте о тексте вопроса и последствиях выбора. Плохой вопрос губит даже самый правильный немодальный код.
Как MoscowSoft может помочь лично вам
Если вы начинающий специалист 1С и попали в живой боевой проект, где старые модальные формы внезапно начали падать в веб‑клиенте, вы можете, конечно, героически разбираться в одиночку. А можете опереться на опыт тех, кто это уже делал десятки раз. Команда MoscowSoft давно живёт в мире немодальных диалогов, асинхронности и управляемых форм: и проекты для заказчиков, и собственные решения (более 60 в реестре российского ПО — это не шутка). Партнёрский статус 1С с 2019 года и аккредитация ИТ‑компании с 2023‑го дают не только значок, но и доступ к накопленным практикам. При желании можно даже разобрать ваш код «под микроскопом» и вместе построить удобный для развития шаблон работы с вопросами.
Переход на немодальные диалоги
Модальный Вопрос — это простота, за которую мы платим блокировкой интерфейса и ограничениями платформы. Немодальный ПоказатьВопрос и связка Асинх/Ждать — это чуть более сложное мышление, но уже норма для серьёзных конфигураций на 1С 8.3. Вопрос только в том, останетесь ли вы в зоне «по‑старинке, но мне так привычнее», или начнёте относиться к диалогам как к полноценной части архитектуры. А готовы ли вы переписать хотя бы один свой модальный диалог на немодальный уже сегодня?













































