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

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

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

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Рефакторинг и качество кода Тестирование QA Разработчик Бесплатно (free)

Штатная страховка внутри цепочки обработки умеет прятать дефекты того шага, который стоит перед ней. У нас так и вышло: валидатор чинил результат постфактум, на выходе всё выглядело корректно, и никто не видел, что предыдущий шаг молча теряет данные. Вылезло это только на независимой проверке чужими глазами. Разбираю, чем инвариант отличается от сценарного теста и почему обычное умножение вытащило дефект из красивой метрики 0,997. Отдельно про 13 дублей, которые приехали из источника ещё до всякой обработки, и про две находки, которые оказались вообще не моими: они жили в эталонной реализации, откуда я списывал логику. Вторая часть про лимит выхода модели: почему обрезка ответа по длине это тихий ноль в мониторинге и как смена формата на дельты уронила выход до 4 951 токена. Есть отклонённые гипотезы и честный список того, чего мы так и не померили.

21.09.2026    253    nedomolkov.ivan    1    

1

WEB-интеграция Рефакторинг и качество кода Системный администратор Разработчик 1С 8.3 Бесплатно (free)

Я сел проверять внутренний поисковый сервис по коду: можно ли доверять ему в автоматическом режиме. Сверка с обычным текстовым поиском по файлам дала 261 из 261, 264 из 264 и 182 из 182 совпадений, разбор структуры файла - 318 функций из 318. Стопроцентная точность. Этот же замер и вскрыл, что опираться на сервис нельзя: искал он безупречно, только совсем не в том месте, которое я ему называл. Внутри разбор трёх дефектов, сложившихся в один тихий отказ: аргумент, проглоченный без ошибки; умолчание, выставленное когда-то наугад; снимок данных, у которого в ответе не указан возраст. Плюс регулярное задание, которое вся команда считала работающим и которого не существовало никогда. Перенос на 1С прилагается: готовый цикл проверки, после которого HTTP-сервис перестаёт молча принимать мусор.

21.09.2026    259    nedomolkov.ivan    0    

0

Логистика, склад и ТМЦ Рефакторинг и качество кода Разработчик Аналитик Руководитель проекта 1С 8.3 Бесплатно (free)

Кладовщик получает задачу: на складе проверки лежат две штуки. Идёт в зону, а там всё на месте и никакой задачи в складской системе нет. Так работала автоматическая сверка остатков между учётной и складской системами: разницу она переносила документом, а комментарий к этому документу восемь месяцев отправлял людей искать несуществующий ноль. Робота разобрали до кода. Обе сравниваемые величины оказались синтетическими: слева физический срез с вычетами по активности и окнами в 60 минут и 12 часов, справа учётный остаток на конец дня минус трёхчасовой хвост непроведённых ордеров. Порог срабатывания стоял в нуле, поэтому робот исправно оформлял собственный шум измерения: за 60 дней он сам создал 62,7% оборота технического склада, а 2 081 артикул из 2 102 приезжал туда и уезжал обратно. Внутри обе формулы, замер лага отгрузки, снятая гипотеза и честная граница данных.

21.09.2026    229    nedomolkov.ivan    0    

0

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

Как за вечер проверить, годится ли локальная модель для поиска ошибок в вашем коде 1С, и не обмануть себя по дороге. Разбираю замер Qwen2.5-Coder 1.5B, 3B и 7B на коде с заранее известными дефектами: почему полноту и шум надо считать раздельно, как 3B набирает высокий балл, вообще не читая код, сколько минут уходит на боевую процедуру на процессоре и на GTX 1650, и чем кончилась попытка подложить модели справку по методам платформы.

16.09.2026    1220    nedomolkov.ivan    4    

1

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

Железо перестало быть проблемой, и качество ответов немедленно встало в потолок. Дальше пошли три улучшения, каждое из которых выглядело очевидно правильным: свой справочник стандартов, код процедур в поисковом индексе и переписывание вопроса отдельной моделью. Первое работало, но стоило пятнадцать тысяч токенов в каждом запросе. Второе уронило находимость на двадцать процентов. Третье уронило качество с 0,864 до 0,782 и растянуло прогон с 88 секунд до 302. Рассказываю, чем я это померил, почему на глаз ни одно ухудшение не видно и почему добавление правдивой информации регулярно делает поиск хуже.

14.09.2026    697    solbol    0    

3

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

Продолжение статьи «BSL Language Server внутри 1С:EDT: коннектор, которого не хватало». Там мы научили EDT видеть расширенную диагностику BSLLS, а здесь замкнем контур: научим ИИ-агентов автоматически исправлять эти ошибки строго по официальным стандартам разработки 1С.

02.09.2026    1858    malikov_pro    2    

6

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

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

01.09.2026    2057    nedomolkov.ivan    6    

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