Эмуляция диалога Вопрос через 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С и рефакторинга.

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

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

См. также

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

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

06.02.2026    3961    Ibrogim    16    

20

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

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

02.02.2026    7019    Ibrogim    41    

42

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

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

31.01.2026    1940    GarriSoft    72    

9

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

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

19.12.2025    1903    GarriSoft    14    

17

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

История о легендарном отчете на 11 000 строк, копеечном расхождении и костыле 2014 года, который пережил все обновления. О том, как Василий спас квартальное закрытие, не тронув ни единой строчки кода монолита

15.12.2025    1459    GarriSoft    21    

20

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

ИИ для код-ревью – не просто модный тренд, а реальный инструмент, который уже помогает разработчикам экономить время и повышать качество кода. В статье разбираемся, как запустить локальную LLM на базе Ollama, подключить ее к Git через Webhook и Python-скрипт, а также какие параметры модели отвечают за точность и галлюцинации. Делимся схемой работы, настройками и результатами тестирования, доказывая, что автоматизированное код-ревью действительно может работать – даже без космического бюджета.

30.10.2025    4717    user2100900    4    

18

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

Ошибки в запросах совершают все – даже самые опытные разработчики. На реальных примерах из код-ревью показываем, какие промахи незаметно закладывают мины замедленного действия в коде и работе базы. Статья поможет взглянуть на привычные запросы под другим углом и составить собственный чек-лист для уверенной и чистой разработки.

28.10.2025    5653    vaillant    35    

16

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

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

24.10.2025    3327    1c-izh    6    

9
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. SerVer1C 1007 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) Вообще я предупреждал: "когда Вы не планируете его использовать где-то на других платформах и Веб-клиентах"
Для отправки сообщения требуется регистрация/авторизация