bdd2

Как построить цепочку асинхронных диалогов

Опубликовал Пишу код как картины (yurii_host) в раздел Программирование - Практика программирования

Опишу способ организации последовательных асинхронных методов, которому я недавно научился.

Постановка задачи

Требуется выполнить несколько проверок одну за другой. Если некоторые из проверок не проходят, то необходимо вывести пользователю диалог, для принятия решения.
В зависимости от выбранного пользователем варианта, выполняются некоторые действия, а также может выполняться следующая проверка, либо сценарий может прерваться.
Использование модальности в конфигурации отключено.

Вложенная схема выполнения асинхронных вызовов (Классический способ)

Стандартный подход к решению данной задачи можно прочитать тут и тут
Схематично его можно изобразить так

Данный подход очень неудобен. 
Во-первых, непонятно количество проверок. Чтобы его узнать, необходимо в коде переходить из одной процедуры в другую.
Во-вторых, приходится создавать по две процедуры на каждую проверку.
В-третьих, Проверка2 не имеет отношения к Проверка1 с точки зрения логики. Однако в Проверка1Завершение явно прописан ее вызов. Это нехорошо.

Линейная схема выполнения синхронных вызовов

Если бы по условию задачи можно было бы использовать модальные вызовы, то схема выглядела бы так.


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

Линейная схема выполнения асинхронных методов

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

Сценарий
&НаКлиенте
Процедура ВыполнитьСценарийСДиалогами(Результат = Неопределено, ПараметрыСценария = Неопределено) Экспорт
	
	НачатьОтсчетШагов(ПараметрыСценария);
	
	Оповещение = Новый ОписаниеОповещения("ВыполнитьСценарийСДиалогами", ЭтаФорма, ПараметрыСценария);
	
	// проверка 1
	Если ЭтотШагЕщеНеВыполнялся(ПараметрыСценария) Тогда
		ТекстВопроса = "Это вопрос 1. Продолжить?";
		ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
		Возврат;
	ИначеЕсли ЭтоРезультатВыполненногоШага(ПараметрыСценария) И Результат <> КодВозвратаДиалога.Да Тогда
		// сюда попадаем если пользователь не ответил Да на первый вопрос
		// выход из процедуры без открытия асинхронного метода - прервет выполнение сценария
		Возврат; 
	КонецЕсли;
	
	// проверка 2
	Если ЭтотШагЕщеНеВыполнялся(ПараметрыСценария) Тогда
		Если ЧастьТоваровОтсутствуетНаСкладе() Тогда
			ТекстВопроса = "Это вопрос 2. Хотите заменить отсутствующие товары?";
			ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНетОтмена);
			Возврат;
		КонецЕсли;
	ИначеЕсли ЭтоРезультатВыполненногоШага(ПараметрыСценария) Тогда
		Если Результат = КодВозвратаДиалога.Отмена Тогда
			Возврат; 
		ИначеЕсли Результат = КодВозвратаДиалога.Нет Тогда
			// переходим к следующему шагу сценария
		ИначеЕсли Результат = КодВозвратаДиалога.Да Тогда
			ОткрытьФормуПодбораАналогов = Истина;
		КонецЕсли;
	КонецЕсли;
	
	// продолжение проверки 2. Открываем форму подбора аналогов асинхронно и обрабатываем результат
	Если ЭтотШагЕщеНеВыполнялся(ПараметрыСценария) Тогда
		Если  ОткрытьФормуПодбораАналогов = Истина Тогда
			ОткрытьФорму("Обработка.ПодборАналоговНоменклатуры.Форма", 
							ПараметрыСценария.ДополнительныеПараметры, 
							ЭтаФорма, , , , 
							Оповещение, 
							РежимОткрытияОкнаФормы.БлокироватьОкноВладельца;) 
			);
		КонецЕсли;
	ИначеЕсли ЭтоРезультатВыполненногоШага(ПараметрыСценария) Тогда
		ВыполнитьДействияСАналогами(Результат);
	КонецЕсли;
	
	// проверка 3. вопрос в цикле
	Если ЭтотШагЕщеНеВыполнялся(ПараметрыСценария) 
		ИЛИ (ЭтоРезультатВыполненногоШага(ПараметрыСценария) 
				И Результат = КодВозвратаДиалога.Да) // повторяем вопрос, пока пользователь отвечает Да
		Тогда
		ТекстВопроса = "Это вопрос 3. Задать его еще раз?";
		ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
		Возврат;
	КонецЕсли;
	
	
	// действия после проверок
	ВыполнитьОсновныеДействия();
	
КонецПроцедуры
Служебные методы
&НаКлиенте
Процедура НачатьОтсчетШагов(ПараметрыСценария)
	
	Если ПараметрыСценария = Неопределено Тогда
		ПараметрыСценария = Новый Структура;
	КонецЕсли;
	
	Если НЕ ПараметрыСценария.Свойство("ПредыдущийШаг") Тогда
		// при первом запуске основной процедуры это свойство отстуствует
		ПараметрыСценария.Вставить("ПредыдущийШаг", 0);
	КонецЕсли;
	
	ПараметрыСценария.Вставить("ТекущийШаг", 0);
	
КонецПроцедуры

&НаКлиенте
Функция ЭтотШагЕщеНеВыполнялся(ПараметрыСценария)
	
	ПараметрыСценария.ТекущийШаг = ПараметрыСценария.ТекущийШаг + 1;

	Если ПараметрыСценария.ПредыдущийШаг >= ПараметрыСценария.ТекущийШаг Тогда
		Возврат Ложь;
	КонецЕсли;
	
	ПараметрыСценария.ПредыдущийШаг = ПараметрыСценария.ТекущийШаг;
	
	Возврат Истина;
	
КонецФункции

&НаКлиенте
Функция ЭтоРезультатВыполненногоШага(ПараметрыСценария)

	Возврат ПараметрыСценария.ПредыдущийШаг = ПараметрыСценария.ТекущийШаг;
	
КонецФункции


Данный подход очень похож на синхронную цепочку и лишен описанных выше недостатков классического способа.

Файлы

Для иллюстрации прикладываю микроконфигурацию с единственным документом, который выполняет действие Провести и закрыть с несколькими проверками. Это переделанная конфигурация из этой статьи.
Также в качестве примера прикладываю обработку, которая задает два вопроса и одно предупреждение по описанной методике, для тех кому лень разворачивать конфигурацию. Она открывается в управляемом режиме в любой конфигурации на платформе 8.3

Послесловие

Данная схема была разработана при решении производственной задачи. Источником идеи послужило вот это видео

Скачать файлы

Наименование Файл Версия Размер
Цепочка вопросов
.epf 6,76Kb
11.01.17
0
.epf 6,76Kb Скачать
Цепочка вопросов при записи формы линейным способом (8.3 режим совместимости 8.2.13)
.cf 10,89Kb
11.01.17
2
.cf 10,89Kb 2 Скачать

См. также

Добавить вознаграждение
Комментарии
1. Виталий Петров (vipetrov2) 11.01.17 07:36 Сейчас в теме
Можно было бы и по проще сделать. Все вопросы записать в список значений или написать функцию для конвертации номера вопроса в текст вопроса.
	Если ПараметрыСценария = Неопределено Тогда
		// первый вход в процедуру выполняется без параметров
		ПараметрыСценария = Новый Структура;
		ПараметрыСценария.Вставить("ТекущийШаг", 0);
	Иначе
		Если Результат <> КодВозвратаДиалога.Да Тогда
			Возврат;
		КонецЕсли;
		ПараметрыСценария.ТекущийШаг = ПараметрыСценария.ТекущийШаг + 1;
	КонецЕсли;
	
	Если СписокЗначений.Количество() = ПараметрыСценария.ТекущийШаг Тогда
		ВыполнитьОсновныеДействия();
		Возврат;
	КонецЕсли;
	ТекстВопроса = СписокЗначений[ПараметрыСценария.ТекущийШаг];
	//ТекстВопроса = ПолучитьТекстВопроса(ПараметрыСценария.ТекущийШаг);
	//Если ТекстВопроса = Неопределено Тогда
	//	ВыполнитьОсновныеДействия();
	//	Возврат;
	//КонецЕсли;
        Оповещение = Новый ОписаниеОповещения("ВыполнитьСценарийСДиалогами", ЭтаФорма, ПараметрыСценария);
	ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
...Показать Скрыть
2. Пишу код как картины (yurii_host) 918 11.01.17 09:21 Сейчас в теме
(1) Попробуйте представить, как вы будете реализовывать предлагаемый вами вариант в реальной жизни. Например, вопросы могут иметь различные коды возврата, а не только Да/Нет, перед вопросом возможно нужно будет делать проверку, и задавать вопрос, только если она не прошла. После ответа на вопрос пользователя иногда потребуется выполнить какое-нибудь действие, а не просто перейти к следующему шагу. Не всегда нужно прерывать сценарий после ответа Нет. Перечисленными мною примерами реальная жизнь не ограничивается. Предлагаемая в публикации схема мне кажется более гибкой и наглядной. Пример в ней упрощен, для облегчения понимания описываемого приема. Кстати, в приложенных к публикации файлах, примеры чуть поинтереснее, чем в публикации
По поводу того, что вариант со списком проще - не готов согласиться, но тут каждый может реализовать так, как считает правильным.
molodoi1sneg; sergey512; igel9780; MrRune; +4 Ответить 1
3. Александр Анисков (vandalsvq) 676 11.01.17 10:12 Сейчас в теме
(0) а промисы все равно удобнее ))))))
pumbaE; orefkov; yurii_host; +3 Ответить 1
4. Пишу код как картины (yurii_host) 918 11.01.17 10:27 Сейчас в теме
5. Роман Уничкин (unichkin) 288 11.01.17 10:54 Сейчас в теме
6. sergey makarov (s22) 17 11.01.17 12:57 Сейчас в теме
7. Сергей Лесовой (Synoecium) 90 11.01.17 14:05 Сейчас в теме
Интересный подход, сам задумывался над такими неудобствами управляемых форм. Возникло такое предположение, что есть смысл пробрасывать через ПараметрыСценария данные, которые используются в нескольких проверках. Т.е. проверяем наличие в структуре некоторых "кэшированных" переменных и если они не заполнены тогда заполняем их. Тогда не надо будет их получать в каждой проверке/итерации.
8. Sergey Andreev (starik-2005) 806 11.01.17 14:21 Сейчас в теме
Можно деревом описать сценарий. В корне - вопрос, в подчиненных ветках - ответы, в подчиненных ответам ветках - следующие вопросы. Ну и так далее. Также можно в дереве добавить ключ перехода на любой из уровней, и если он заполнен - получить новые вопросы/ответы из соответствующего узла, а если не заполнен - из подчиненного.

Типа так:
Вопрос
1 - Ответ 1
2 -- Вопрос 2
3 --- Ответ Х
4 --- Ответ У
5 - Ответ 2
6 -- Вопрос 3
7 --- Ответ Z
8 ---- --- ИД = 2 (переход к ветке вопросов с ИД 2)

Чем не метод?
9. bulpi bulpi (bulpi) 100 11.01.17 18:08 Сейчас в теме
Гланды через ж :)
Evil Beaver; YPermitin; +2 6 Ответить 1
10. Пишу код как картины (yurii_host) 918 11.01.17 21:55 Сейчас в теме
(9) посмотрел в карточку автора этого комментария. Все комментарии в таком стиле. Никакого конструктива. Везде подобные бессмысленные фразы. Даже спрашивать не буду, что его не устроило.
11. Sergey Andreev (starik-2005) 806 11.01.17 21:58 Сейчас в теме
(10) решил тоже посмотреть. Как оказалось, у нас в Вами разные взгляды на адекватность )))
12. Пишу код как картины (yurii_host) 918 11.01.17 22:27 Сейчас в теме
(11) Я не упоминал адекватность. Я лишь высказал свое наблюдение, что такого рода комментарии неконструктивны и бессмысленны.
Меня всегда удивляли подобные комментаторы, которые бросают вот такие фразы. Ведь толку от них ноль.
Ну не нравится тебе статья, пройди дальше, не читай. Ведь никто же не заставляет. Возможно другим она будет полезна.
Бывает, что не согласен с точкой зрения автора - значит аргументируй. Может действительно у человека есть здравая мысль. Пусть не скрывает ее.
А какой смысл от пустых обвинений?
dj_serega; igel9780; jONES1979; o.nikolaev; +4 Ответить
13. Антонио (Fragster) 627 12.01.17 12:07 Сейчас в теме
(6) 1с вообще могла это прозрачно для прикладного программиста сделать. Но, поскольку "азаза! в хруме не работает!!!" залепили костыль за неделю, а переделывать не стали, чтобы не ломать обратную совместимость. Наоборот, только усугубляют все, добавляя всякие "начать..." (см. двоичные данные), не понимая, что это влечет разный код на клиенте и на сервере, которого становится всё больше и больше. Ну и вермишель с этими оповещениями.
Остается надежда на 8.4/9.0...

Следующий такой ошибкой стала "защита от опасных действий", но она не столь сильно влияет (просто "защита" не защищает, а немного усложняет жизнь программистам).
zqzq; kraynev-navi; +2 Ответить
14. Андрей Овсянкин (Evil Beaver) 3720 13.01.17 10:32 Сейчас в теме
Вы, возможно, удивитесь, но я хочу сказать, что цепочки асинхронных диалогов это вселенское зло. Если ваш UI/UX такое использует, то он плохо спроектирован. И исключительно из-за неудачного дизайна UI возникла потребность изобретения несомненно интересного решения, приведенного в статье. Беда только в том, что его можно было не изобретать, пересмотрев подход к взаимодействию с пользователем.

Модальность не нужна. Попытки ее вернуть, применяя указанные обходные решения, ни к чему хорошему не приведут. Много вы видите в интернетах "цепочек модальных диалогов" на сайтах? А пользоваться удобно, как ни странно.
15. Антонио (Fragster) 627 13.01.17 10:45 Сейчас в теме
(14) вот пример от учебного центра 1с: абстрактный блокнот, если текст модифицирован, то вопрос, "сохранить?", если новый, то показать диалог выбора имени, если файл существует, то показать вопрос о замене. Это стандартное поведение большинства программ. Отказываться от модальности не следует. другое дело, что 1с смешала модальность (т.е. недоступность частей интерфейса кроме "модальных") и асинхронность.
Текущие диалоги, вызываемые через ПокахатьXyz() - модальные. И ничего не мешало сделать эту модальность "асинхронной", т.е. не блокирующей основной поток на клиенте и с использованием старого синтаксиса.

Описание "правильного" костыля http://www.1c-uc3.ru/video.html в видеоуроках (буэээ..).
16. Андрей Овсянкин (Evil Beaver) 3720 13.01.17 11:26 Сейчас в теме
Ну приведенные примеры они не требуют "цепочки". По сути, нужно выбрать какой диалог показать, и показать его немодально. И вообще, сей пример синтетический (т.е. надуманный). Было бы интересно обсудить что-то из жизни. Я такой пример придумать не смог....

И да, под "модальностью" в предыдущем сообщении я понимал именно блокирующую текущий поток модальность, а не сам концепт "модального окна".
17. Антонио (Fragster) 627 13.01.17 11:34 Сейчас в теме
(16) вопрос даже не в цепочках. вопрос в том, что, например, диалог перед записью формы уже становится невозможным без своей кнопки "записать и закрыть". ну и различие клиентского и серверного кода (подключить внешнюю компоненту/начать подключение, двоичные данные, и прочее), катастрофическое увеличение сложности и количества обслуживающего кода - всё это накапливается как снежный ком, хотя может быть скрыто от программиста 1с.
18. Антонио (Fragster) 627 13.01.17 11:35 Сейчас в теме
(16)
По сути, нужно выбрать какой диалог показать

а если не надо сохранять? а если надо перевыбрать файл/изменить имя вместо перезаписи? То, что в данном случае этот модальный диалог в цикле - системный, глобально ничего не меняет.
19. Виталий Петров (vipetrov2) 13.01.17 11:43 Сейчас в теме
(2) Если фантазию включить, то можно вместо Списка Значений, сделать Таблицу Значений с 2-мя столбиками: текст вопроса и правильный ответ. Почему мой вариант не проще? Надо адаптировать под конкретный случай только 1 процедуру, т.е. заполнить таблицу вопросов и ответов. И мой вариант гораздо производительнее потому что на 10 вопросе у тебя будет 10 раз проверяться тот или не тот шаг, а у меня с сразу вопрос задается.

А вообще буквально недавно надо было на стороне клиента сделать НачатьПроверкуСуществования(..) и потом если нет каталога, создать его НачатьСозданиеКаталога().
Но бывает еще сложнее задача когда надо через цикл сделать несколько вызовов НачатьХХХ, потом после оповещения еще вызвать НачатьХХХ и при этом у процедур оповещений разное количество параметров. Например у НачатьУдалениеФайлов процедура оповещения имеет только 1 параметр.
21. Пишу код как картины (yurii_host) 918 13.01.17 12:34 Сейчас в теме
(16)
Вот примеры из жизни (было несколько месяцев назад при доработке ерпи)

Требуется добавить проверки в заказ поставщику перед действием Провести и закрыть
1. Проверить, что сумма заказа соответствует бюджету. Вывести вопрос
2. Проверить, что остаток после заказа плюс остаток на складе - не превысит норму. Если превысит - вывести вопрос.
3. Проверить ограничения, накладываемые поставщиком (что количество товара больше или равно минимальной партии). Вывести вопрос

При проведении поступления
1. Проверить соответствие цен в поступлении ценам в заказе. Если различаются - вывести сумму отклонения и вопрос.
2. Проверить соответствие количества в поступлении количеству в заказе. Если некоторый товар не пришел, то предложить: ничего не делать, перенести в новый заказ (открыть мастер создания заказа поставщику), удалить из текущего, вернуться к редактированию.

Эти проверки были добавлены поверх существующих типовых. Нетрудно догадаться, что это все будет развиваться и усложняться со временем. Через некоторое время у заказчика появятся новые хотелки.
22. Николай Больсунов (boln) 885 13.01.17 13:25 Сейчас в теме
Респект за еще один подход к разруливанию "асинхронных пробок".

Сам почти 2 года назад озаботился этим. Применил сущность типа "стек" для организации очередности возврата глубоких асинхронных вызовов. Сделал даже видеокурс для УЦ-3:
http://www.1c-uc3.ru/video.html
23. Андрей Овсянкин (Evil Beaver) 3720 13.01.17 13:58 Сейчас в теме
(21)
1. Проверить, что сумма заказа соответствует бюджету. Вывести вопрос
2. Проверить, что остаток после заказа плюс остаток на складе - не превысит норму. Если превысит - вывести вопрос.
3. Проверить ограничения, накладываемые поставщиком (что количество товара больше или равно минимальной партии). Вывести вопрос


Зачем три вопроса вместо одного окна с перечнем проблем? Вы, пожалуй, невнимательно прочитали мое первое сообщение. Потребность в цепочках вопросов возникает при некачественно спроектированном взаимодействии с пользователем. Три вопроса вместо одного - это некачественное взаимодействие. Вырождающееся впоследствии в необходимость разработки "цепочек вопросов в асинхронном режиме".
24. Антонио (Fragster) 627 13.01.17 14:24 Сейчас в теме
(23) выше бы приведен пример с работой с файлами. Например пакетная выгрузка чего-либо в папку: проверить существование (асинх), при наличии - задать вопрос про очистку (асинх), очистить(асинх), скопировать файлы (асинх), отрапортовать пользователю.
вторая ветка - при отстутсвии - создать (асинх), скопировать файлы (асинх), отрапортовать пользователю.
yurii_host; +1 Ответить
25. Пишу код как картины (yurii_host) 918 13.01.17 14:35 Сейчас в теме
(23)
Согласен, что некачественное и что лучше сделать одну форму.
Но тут возникают противоречия.
Во-первых, если уже есть решение, которое построено через вопросы. Что делать? Часть вопросов будет в одной форме, а часть в отдельных окнах. Переделывать?
Во-вторых, бюджет на то, чтобы нарисовать интерфейс - больше, чем на более простое решение.
В-третьих, что делать, если нужно в одной из проверок открыть другую уже существующую форму (например, мастер создания Заказа поставщику)?
В-четвертых, был еще такой случай, что сначала нужна была одна проверка. Сделали через вопрос. Потом понадобилась еще одна. И никто уже написанное другим разработчиком не переделывает и в бюджет не закладывает.

Но мне подход без цепочки тоже нравится больше, в том случае есть возможность его использовать
26. Николай Больсунов (boln) 885 13.01.17 16:08 Сейчас в теме
(23)
Потребность в цепочках вопросов возникает при некачественно спроектированном взаимодействии с пользователем. Три вопроса вместо одного - это некачественное взаимодействие. Вырождающееся впоследствии в необходимость разработки "цепочек вопросов в асинхронном режиме".
А вот это не факт. Выше уже говорилось про "абстрактный блокнот", но эта последовательность задания вопросов характерна и для прикладной обработки, например "Консоль запросов" и "Консоль СКД".

Сможете предложить решение без цепочки вопросов?
yurii_host; +1 Ответить
27. Сан Саныч (herfis) 52 13.01.17 16:15 Сейчас в теме
28. Пишу код как картины (yurii_host) 918 13.01.17 23:26 Сейчас в теме
(7) исправил пример в публикации по вашей рекомендации. Основная процедура вроде как упростилась.
Также немного усложнил пример, чтобы продемонстрировать гибкость данного способа
29. Пишу код как картины (yurii_host) 918 14.01.17 00:15 Сейчас в теме
(19)
Вы скорее всего имели не таблицу значений, а массив структур, т.к. действия выполняются на клиенте
Но даже если мы будем использовать такую коллекцию, то нам придется выбирать между двумя невыгодными вариантами:
1. Либо писать процедуру обхода такой коллекции для каждого сценария. Тогда каждый такой обход будет содержать специфические для данного сценария действия. В чем же тогда простота?
2. Либо нужно написать очень универсальный метод, в котором каждый элемент коллекции шагов должен содержать множество ключей, типа "СоответствиеДействийИОтветов", "ОтветДляПрерыванияСценария" и т.п. в таком духе. Похожий подход с массивом структур уже реализован в БСП, правда он используется для другого. Если интересно, можете посмотреть в демо БСП (2.3.2) внешнюю обработку ЗагрузкаНоменклатурыИзПрайсЛистаСоСценарием.epf, а в ней функцию СформироватьСценарий(). Я предполагаю, что если попытаться написать универсально, то получится что-то подобное. Там довольно большой объем служебного кода, трудно быстро понять, какие параметры за что отвечают. Хотя этот механизм и рабочий, но порог вхождения в работу с ним - довольно высокий.

В моем примере (я его чуть усложнил) всего три универсальные обслуживающие процедуры и одна основная. При этом читаемость (описания шагов) не страдает, по сравнению с описанием сценария, а универсальность намного выше
30. Александр Анисков (vandalsvq) 676 16.01.17 12:34 Сейчас в теме
(23) на самом деле лапша с асинхронными вызовами бывает весьма забавной. И даже если там нет вопросов. Например: пользователь выбрал файл, файл либо xml, либо zip-архив.

И так поток действий...
1. Проверка наличия файла
2. Проверка свойств файла (для получения расширения)
3. Если архив распаковка
4. Если архив проверка существования файла в распакованном каталоге
5. Загрузка данных файла
Большинство этих действий асинхронны, получится целый набор описаний оповещений которые должны сработать последовательно (ну или в обход). Вот в таких случаях конечно удобно, если бы был менеджер асинхронных действий.

Хотя в тех же js promise у меня был бы очень простой код:
getFile() // обещаем что сообщим когда получим файл
.then(getFileAttr) // обещаем что сообщим когда получим свойства файла
.then(unzipFile) // обещаем что сообщим когда распакуем, а если не архив то вернем resolve
.then(loadFileData) // загружаем данные
.catch(errorHandler) // перехватим ошибку
...Показать Скрыть


Я не люблю несколько вопросов, предупреждений и прочих всплывающих окон подряд. Тут я согласен, что надо пересматривать алгоритмы, выводить одно сообщение с набором нестыковок. Но вот что касается не диалоговых асинхронных вызовов, тут пока не очень удобно работать.
31. Николай Больсунов (boln) 885 16.01.17 14:04 Сейчас в теме
(30)
Большинство этих действий асинхронны, получится целый набор описаний оповещений которые должны сработать последовательно (ну или в обход). Вот в таких случаях конечно удобно, если бы был менеджер асинхронных действий.
Угу, проходили все это на практике. Отсюда и появился "стек оповещений" :)

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