В процессе разработки на платформе 1С:Предприятие 8.3 многие разработчики сталкиваются с необходимостью замены привычных синхронных методов, таких как Вопрос(), на их асинхронные аналоги, например, ПоказатьВопрос(). Давайте разберем, почему это происходит, является ли это «маркетинговым ходом» или реальной необходимостью, и что на самом деле меняется в архитектуре вашего приложения.
Чтобы осознать суть изменений, рассмотрим, как ведут себя эти два метода в контексте исполнения программного кода:
Вопрос): Когда исполнение программы достигает этой строки, весь поток выполнения полностью блокируется. Приложение «замирает», интерфейс перестает реагировать на действия пользователя до тех пор, пока не будет получен ответ в диалоговом окне. Весь код, который идет после этой строки, ожидает завершения диалога.ПоказатьВопрос): При вызове этого метода выполнение кода не останавливается. Платформа отправляет команду на отрисовку окна и мгновенно переходит к следующей строке кода. Вся логика, которая должна сработать после получения ответа от пользователя, переносится в отдельную функцию-обработчик (callback).Посмотрим на классический пример использования синхронного метода, который привычен многим разработчикам:
// Пример старого кода
Ответ = Вопрос("Вы уверены?", РежимДиалогаВопрос.ДаНет);
Если Ответ = КодВозвратаДиалога.Да Тогда
ВыполнитьДействие();
КонецЕсли;
В этом случае код выглядит последовательным и простым для чтения. Однако, при работе в веб-клиенте или тонком клиенте, такой подход блокирует поток, что недопустимо для современных браузерных интерфейсов. Теперь разберем асинхронный вариант:
// Пример нового кода
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВопроса", ЭтотОбъект);
ПоказатьВопрос(ОписаниеОповещения, "Вы уверены?", РежимДиалогаВопрос.ДаНет);
&НаКлиенте
Процедура ПослеВопроса(Результат, ДополнительныеПараметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
ВыполнитьДействие();
КонецЕсли;
КонецПроцедуры
Здесь мы видим использование объекта ОписаниеОповещения. Основная процедура завершает свою работу, не дожидаясь ответа пользователя, а управление передается в указанную процедуру ПослеВопроса только после того, как пользователь нажмет кнопку в окне.
Часто возникает вопрос: является ли это полноценным асинхронным программированием? С точки зрения архитектуры платформы — безусловно, да. 1С адаптирует свой код под событийную модель (event-driven), которая принята в веб-разработке.
Рассмотрим ключевые аргументы:
ОписаниеОповещения и, в последних версиях (начиная с 8.3.18), использует «Обещания» (Promise). Это позволяет избежать бесконечной «лесенки» из вложенных процедур, делая код более управляемым.НачатьПомещениеФайла или запросам к API, работа с пользователем в веб-среде требует возврата управления платформе, чтобы она могла обрабатывать другие события интерфейса.Если вы решили перевести свой проект на работу с асинхронными методами, придерживайтесь следующих правил:
ДополнительныеПараметры, чтобы процедура-обработчик имела доступ к нужным переменным.Обещание. Это позволит писать код в стиле, максимально приближенном к последовательному, используя конструкции, которые выглядят как синхронные, но при этом остаются асинхронными внутри.В заключение проанализируем ситуацию: переход к ПоказатьВопрос — это не просто смена названия функции, это адаптация под реалии современных вычислений, где время ожидания ответа пользователя или сервера не должно останавливать работу всей информационной системы.