Обращение в службу поддержки 1С — Здравствуйте, а не подскажите где поставить флажок в 1С чтобы не переписывать функцию Вопрос на Ждать ВопросАсинх и убрать непонятную приставку Асинх из функций?
Ответ от телеграмм канала 1С: «А что непонятного то? Уж куда проще, чем ОписаниеОповещения»…
И всем доброго времени суток!
Так почему же простая функция Вопрос в 1С вдруг стала Ждать ВопросАсинх, а до этого вообще непонятная реализация через ОписаниеОповещения(callback)?
1. С самого начала
Давайте с самого начала сотворения мира с основы интерфейса оконных систем в компьютере. В классических много оконных системах (Windows как пример) всегда любая программа основное свое время находится в не рабочем состоянии, ожидая действий пользователя. А для обработки событий от пользователя нужна функция обработки их.
Старая добрая Windows функция обработчик (Пример кода)
|
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) |
А как дело здесь обстоит с обработкой событий в модальных диалоговых окнах (чувствуете связь с терминологией 1С). Ключевым фактором здесь будет то, что при открытии окна диалога у нас возникает своя отдельная функция обработка события. И мы полностью переключаемся с одной функции обработки событий на другую. Когда выбор в диалоге сделан, обработчик событий переключается назад на основную функцию обработчика. Зачем нам все это знать? Посмотрим пример кода: (Пример кода)
|
int msgboxID = MessageBox( NULL, L"temp.txt already exists.\nDo you want to replace it?", L"Confirm Save As", MB_ICONEXCLAMATION | MB_YESNO ); if (msgboxID == IDYES) { // TODO: add code } |
Как все аналогично как с 1С программированием? Модальный вызов функции MessageBox в терминах 1С? Практически один в один код для 1С
|
Ответ = Вопрос("Выполнить полную синхронизацию?", РежимДиалогаВопрос.ДаНет); Если Ответ = КодВозвратаДиалога.Да Тогда // TODO: добавить код здесь КонецЕсли; |
Именно поэтому в терминологии 1С возникают такие понятия как модальные окна, которые скорее переходят в модальные вызовы и далее в не рекомендованные модальные вызовы. Это путь которым шла 1С.
2. Современный браузер
Если мы посмотрим на современный браузер, то там модальных диалоговых окон (модальных вызовов) просто нет. Запрет на использование дополнительных окон. Тенденция изолирования вкладок. Это обосновано с точки зрения безопасности. Но реализовать визуально «модальный» диалог мы можем через функцию обработчик событий. Делаем затемненным затемненным всю остальную часть и специально выводим область для окна диалога в центр (Нажми — реализация диалога через callback)
Для каждой кнопки как и всегда описываем свой обработчик событий. Можно сделать общий обработчик для всех кнопок диалога. Вот 1С и предложила нам такой же подход когда ввела специальный объект ОписанияОповещения. Отдельно описываем функцию куда вернется результат выбора (Документаия от 1С). По сути создаем callback и делаем его обработчиком. Как же это совместимо с предыдущим подходом? Никак. Куча возмущений от 1С-ников и инфоповод разобраться.
Количество таких ОписанияОповещения (callback) обработчиков возрастает в приложении неимоверно, что ужасно влияет на читаемость и отладку кода. Это навызается callbackhell или АдОписалокОповещений.
3. Найти решение
Так как же нам просто сделать единый код без создания обработчиков событий для «модальных диалоговых окон»?
И тут явно 1С решило использовать новую конструкцию в браузерах :
|
async function Questions() { let result = await fun_async(); //И "Получаем ответ в: "+ result1; } |
И мы видим аналогичный код в 1С.
|
&НаКлиенте Асинх Процедура ВыполнитьАлгоритм(Команда) Результат = Ждать ВопросАсинх("Выполнить быстро или не медленно?", РежимДиалогаВопрос.ДаНет); Если Результат = КодВозвратаДиалога.Да Тогда // Первый вариант алгоритма Иначе // Второй вариант алгоритма КонецЕсли; КонецПроцедуры |
То есть 1С не изобрела ничего нового, но решила использоваться новыми стандартными языка javascript — promise. Шаг в правильную сторону, но в плане реализации задания интерактивного взаимодействия с пользователем по сути является некоторой надстройкой на надстройкой. Желание некоторых переписать весь код под новую конструкцию с полной точки зрения не является удовлетворительным.
Р.S. Для особо любознательных: Пример реализации для браузера
И для тех кто любит много слов — https://курсы-по-1с.рф/news/async-metods-article/
Ну пример в bootstrap как это сделать изменением стилей (где здесь асинхронность?): Пример диалоговых окон от bootstrap 5