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