Эмуляция диалога Вопрос через COM

26.03.25

Разработка - Рефакторинг и качество кода

Диалог "Вопрос" использовался очень интенсивно в старых версиях кода и также его используют в УФ довольно часто. Иногда очень неудобно использовать рефакторинг через асинхронные вызовы ПоказатьВопрос и ВопросАсинх по разным причинам. Есть ещё одно решение, как избежать больших переделок кода, когда Вы не планируете его использовать где-то на других платформах и Веб-клиентах.

Эмуляция диалога Вопрос
 

Эта задача давно назрела, т.к. пока не нашел достойного и работоспособного кода, чтобы обойти ограничение

В старых версиях 1С или в Обычном приложении, почти в каждой процедуре или функции встречается по одному или несколько диалогов Вопрос. Можно, конечно, кардинально изменить код для новой платформы, а можно для версий на стороне Windows Использовать альтернативу: Эмуляция диалога Вопрос через COM объект MSScripting.

Прилагаю пример своего решения, которое отличается только тем, что окно диалога не принадлежит родительскому окну и данный метод не поддерживает Таймер вывода окна.

// Локально выводит диалог "Вопрос", в режиме "Клиент",
//  если включен запрет Модального режима, то тогда используется скрипт MSScriptControl
//
// Параметры:
//  ТекстВопроса  - Строка - текст вопроса
//  Кнопки  - РежимДиалогаВопрос - выбор кнопок вопроса
//  Таймаут  - Число - (необяз.) интервал в секундах
//  КнопкаПоУмолчанию  - КодВозвратаДиалога - (необяз.) значение, которое будет проставлено по умолчанию
//  Заголовок  - Строка - (необяз.) заголовок сообщения
//  КнопкаТаймАута  - КодВозвратаДиалога - (необяз.) значение, которое будет проставлено по истечению времени ожидания
//  ЭтоОшибка  - Булево - (необяз.) для вывода предупреждения об ошибке
//
Функция обПоказатьВопрос(ТекстВопроса, Кнопки, Таймаут=0, КнопкаПоУмолчанию=Неопределено, Заголовок = "", КнопкаТаймАута=Неопределено, ЭтоОшибка=Ложь) Экспорт
Перем ИспользоватьСкрипт,Результат,VBScript,КодВопроса;
	Попытка
		ИспользоватьСкрипт=Метаданные.РежимИспользованияМодальности=Метаданные.СвойстваОбъектов.РежимИспользованияМодальности.НеИспользовать;
	Исключение
		ИспользоватьСкрипт=Ложь; // нет режима модальности
	КонецПопытки;
	Если ИспользоватьСкрипт Тогда
		Попытка
			// Версия начиная с 8.2
			Результат=Неопределено;
			VBScript=Новый COMОбъект("MSScriptControl.ScriptControl.1");
			VBScript.AllowUI=Истина;
			VBScript.Language="VBScript";
			Если Таймаут<>0 Тогда
				VBScript.Timeout=Таймаут*1000;
			Иначе
				VBScript.Timeout=36000000; // 10 часов
			КонецЕсли;
			КодВопроса=0; // vbOKOnly
			Если Кнопки=РежимДиалогаВопрос.ДаНет Тогда
				КодВопроса=4; // vbYesNo
			ИначеЕсли Кнопки=РежимДиалогаВопрос.ДаНетОтмена Тогда
				КодВопроса=3; // vbYesNoCancel
			ИначеЕсли Кнопки=РежимДиалогаВопрос.ОК Тогда
				КодВопроса=0; // vbYesNoCancel
			ИначеЕсли Кнопки=РежимДиалогаВопрос.ОКОтмена Тогда
				КодВопроса=1; // vbOKCancel
			ИначеЕсли Кнопки=РежимДиалогаВопрос.ПовторитьОтмена Тогда
				КодВопроса=5; // vbRetryCancel
			ИначеЕсли Кнопки=РежимДиалогаВопрос.ПрерватьПовторитьПропустить Тогда
				КодВопроса=2; // vbAbortRetryIgnore
			КонецЕсли;
			Если ЭтоОшибка Тогда
				КодВопроса=КодВопроса+16; // vbCritical
			ИначеЕсли КодВопроса<>0 Тогда
				КодВопроса=КодВопроса+32; // vbQuestion
			Иначе
				КодВопроса=КодВопроса+64; // vbInformation
			КонецЕсли;
			Если КнопкаПоУмолчанию=КодВозвратаДиалога.Да
				Или КнопкаПоУмолчанию=КодВозвратаДиалога.ОК
				Или КнопкаПоУмолчанию=КодВозвратаДиалога.Прервать
				Или КнопкаПоУмолчанию=КодВозвратаДиалога.Повторить И Кнопки=РежимДиалогаВопрос.ПовторитьОтмена
				Тогда
				КодВопроса=КодВопроса+0; // vbDefaultButton1
			ИначеЕсли КнопкаПоУмолчанию=КодВозвратаДиалога.Нет
				Или КнопкаПоУмолчанию=КодВозвратаДиалога.Отмена И Кнопки=РежимДиалогаВопрос.ОКОтмена
				Или КнопкаПоУмолчанию=КодВозвратаДиалога.Повторить И Кнопки=РежимДиалогаВопрос.ПрерватьПовторитьПропустить
				Тогда
				КодВопроса=КодВопроса+256; // vbDefaultButton2
			ИначеЕсли КнопкаПоУмолчанию=КодВозвратаДиалога.Пропустить
				Или КнопкаПоУмолчанию=КодВозвратаДиалога.Отмена И Кнопки=РежимДиалогаВопрос.ДаНетОтмена
				Тогда
				КодВопроса=КодВопроса+512; // vbDefaultButton3
			ИначеЕсли КнопкаПоУмолчанию=КодВозвратаДиалога.Таймаут
				Тогда
				КодВопроса=КодВопроса+768; // vbDefaultButton4
			КонецЕсли;
			Попытка
				Результат=VBScript.Eval("MsgBox ("""+СтрЗаменить(ТекстВопроса,Символы.ПС,Символы.Таб)+""","+Формат(КодВопроса,"ЧДЦ=0; ЧН=0; ЧГ=")+","""+Заголовок+""")");
			Исключение
				Ошибка=ОписаниеОшибки();
				Результат=Неопределено;
			КонецПопытки;
			Если Результат=Неопределено Тогда
				Результат=?(КнопкаПоУмолчанию=Неопределено,КодВозвратаДиалога.Таймаут,КнопкаПоУмолчанию);
			ИначеЕсли Результат=1 Тогда // vbOK
				Результат=КодВозвратаДиалога.ОК;
			ИначеЕсли Результат=2 Тогда // vbCancel
				Результат=КодВозвратаДиалога.Отмена;
			ИначеЕсли Результат=3 Тогда // vbAbort
				Результат=КодВозвратаДиалога.Прервать;
			ИначеЕсли Результат=4 Тогда // vbRetry
				Результат=КодВозвратаДиалога.Повторить;
			ИначеЕсли Результат=5 Тогда // vbIgnore
				Результат=КодВозвратаДиалога.Пропустить;
			ИначеЕсли Результат=6 Тогда // vbYes
				Результат=КодВозвратаДиалога.Да;
			ИначеЕсли Результат=7 Тогда // vbNo
				Результат=КодВозвратаДиалога.Нет;
			КонецЕсли;
		Исключение
			Ошибка=ОписаниеОшибки();
		КонецПопытки;
	КонецЕсли;
	Если Результат=Неопределено Тогда
		// Совместимость со старой версией 1С
		Результат=Вычислить("Вопрос(ТекстВопроса,Кнопки,"+?(Таймаут=0,"","Таймаут")+",КнопкаПоУмолчанию,Заголовок"+?(КнопкаТаймАута<>Неопределено,",КнопкаТаймАута","")+")");
	КонецЕсли;
	Возврат Результат;
КонецФункции // обПоказатьВопрос()


Уверен, немало кому пригодится.

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

Вступайте в нашу телеграмм-группу Инфостарт

ПоказатьВопрос ВопросАсинх

См. также

Инструментарий разработчика Рефакторинг и качество кода Программист 1С:Предприятие 8 Бесплатно (free)

Инструмент для тех, кто устал читать модули по 50 тысяч строк и искать ошибки глазами. MetaVision загружает выгруженные файлы конфигурации и за секунды строит графы функций, находит уязвимости и подсвечивает проблемы производительности. Ключевые возможности: Визуализация логики функций (графы условий, циклов, транзакций и вызовов). Статический аудит безопасности (RCE, SSRF, COM-инъекции, пароли в коде). Поиск проблем производительности (запросы в циклах, вложенные блокировки). Полнотекстовый поиск по всем модулям конфигурации. Статистика по объектам и функциям. Безопасность: Программа работает строго локально. Код вашей конфигурации не отправляется в интернет и не анализируется на сторонних серверах. Попробуйте MetaVision сегодня — узнайте, что скрывает ваш код.

вчера в 17:00    828    40    KHoroshulinAV    14    

29

Рефакторинг и качество кода Программист 1С 8.3 Россия Бесплатно (free)

Как быстро разобраться в чужом коде? Как не забыть через полгода алгоритм работы своего собственного кода? Как наглядно проектировать? Ответам на эти вопросы посвящена данная публикация.

17.04.2026    343    chuprina_as    3    

4

Нейросети Рефакторинг и качество кода Программист Бесплатно (free)

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

20.03.2026    1029    ksnik    4    

5

Нейросети Рефакторинг и качество кода Программист Бесплатно (free)

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

17.03.2026    1680    IgorVasilyev    51    

26

Рефакторинг и качество кода Программист 1С:Предприятие 8 1С:Комплексная автоматизация 2.х 1C:ERP Бесплатно (free)

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

09.02.2026    1784    Eugen-S    10    

4

Нейросети Рефакторинг и качество кода Программист Бесплатно (free)

В статье рассказываю, как писать код 1С в VS Code с помощью бесплатных AI-моделей 🤖 Используем GLM-4.7 через Roocode + Cerebras (до 1 миллион токенов в день). Подключаем бесплатные MCP. Генерируем новый код и смотрим, как AI справляется с задачами.

06.02.2026    15019    Ibrogim    83    

50

Нейросети Рефакторинг и качество кода Программист Бесплатно (free)

Некоторые задачи можно и нужно делегировать ИИ, а простые задачи можно отдавать бесплатным моделям. В статье коротко рассказываю про расширение roocode для vscode, инструмент openrouter и реальную задачу по рефакторингу кода.

02.02.2026    13223    Ibrogim    54    

49

Рефакторинг и качество кода Программист Бесплатно (free)

Открываешь код и глаз начинает дёргается? Я собрал личный список ТОП-10 самых раздражающих и опасных ошибок в 1С, с примерами, юмором и практическими рекомендациями, как писать так, чтобы потом не было мучительно больно.

31.01.2026    3783    GarriSoft    89    

6
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. SerVer1C 1084 26.03.25 18:54 Сейчас в теме
Не делайте так
5. ksuman 24 01.04.25 16:14 Сейчас в теме
(1) Уже сделал, нет вариантов, если я хочу сохранить код совместимым с предыдущими версиями
2. demon_infernal 41 27.03.25 06:09 Сейчас в теме
Уверен, никому не пригодится.
Это как жонглировать раскаленными прутьями. Плюс за умение, минус за распространение.
Вы понимаете, для чего придумали отказ от модального Вопрос и переход на ВопросАсинх или ПоказатьВопрос? Чем не устраивал обычный Вопрос?
4. ksuman 24 01.04.25 16:13 Сейчас в теме
(2) Если конфигурация закрыта от изменения (нельзя включить модальный режим), а в Расширении требуется выполнять сложный код со многими интерактивными вставками, чтобы не усложнять намного процедуры разбивками по кучке малых блоков, мне понадобился такой код.
7. webester 26 07.05.25 07:23 Сейчас в теме
Иногда очень неудобно использовать рефакторинг через асинхронные вызовы ПоказатьВопрос и ВопросАсинх по разным причинам

Можете озвучить хоть какие-то из "разных причин" мешающих использовать асинхронные методы диалогов? Прям не приходит в голову ни одна ситуация в которой есть смысл городить ком объект и не использовать при этом асинхронные вызовы.

И да в большом количестве случаев если у вас кейс в котором вы все время о чем-то спрашиваете пользователя, возможно у вас ошибка в проектировании решения. Может быть есть возможность собрать настройки в одном месте и больше не дергать пользователя вопросами где он может по ошибке выбрать не то, что хотел. Исключения бывают разумеется. Но вопрос "не сделал ля я хню в очередной раз" себе надо задавать.
3. BigB 193 30.03.25 00:04 Сейчас в теме
Особенно пригодится тем, кто сидит на линуксе и маке.
Если что, то это сарказм.
6. ksuman 24 01.04.25 16:17 Сейчас в теме
(3) Вообще я предупреждал: "когда Вы не планируете его использовать где-то на других платформах и Веб-клиентах"
Для отправки сообщения требуется регистрация/авторизация