Теория
страницаТеория
Прежде чем приступить к практической части, нужно сказать несколько слов о том, почему стандартно используется именно такой режим работы интерфейса.
Исторически сложилось так, что обычные «десктопные» приложения часто используют в своей работе модальные окна. И «1С:Предприятие» не является исключением. Модальные окна очень удобны в тех ситуациях, когда от пользователя требуется ввод информации, без которой невозможно дальнейшее выполнение алгоритма. При этом полностью блокируется весь остальной интерфейс программы, а исполнение программного кода останавливается до тех пор, пока пользователь не закроет модальное окно.
Однако с тех пор, как «1С:Предприятие» перестало быть «обычным десктопным приложением», с появлением веб-клиента и с переходом «1С:Предприятия» на мобильные платформы использование модальных окон стало вызывать много проблем.
Основные неудобства заключались в том, что для нормальной работы веб-клиента на обычных компьютерах требовалась предварительная настройка браузера. А на мобильных устройствах браузеры вообще не поддерживают работу с модальными окнами.
Поэтому в «1С:Предприятии» был стандартно реализован специальный режим работы интерфейса без использования модальных окон. В чем заключается его основная особенность?
В этом режиме работы интерфейса окно, которое раньше было бы модальным, рисуется в пределах родительского окна и точно так же блокирует весь остальной интерфейс. Таким образом обеспечивается «модальность» для пользователя. Он не сможет выполнить никакие другие действия, пока не закроет такое окно.
Однако для разработчика в момент отображения блокирующего окна исполнение программного кода не останавливается. Программный код продолжает выполняться дальше.
Основу описанной выше асинхронной схемы работы составляет объект встроенного языка Обещание, который возвращается асинхронной функцией в качестве результата своей работы. Обещание является оберткой для результата выполнения асинхронной функции (возможно, пока неизвестного).
Асинхронная функция/процедура должна быть описана с помощью модификатора Асинх.
Для того чтобы получить результат работы асинхронной функции, предназначен оператор Ждать, единственным аргументом которого является Обещание. Этот оператор может использоваться только внутри Асинх-процедур/функций.
С логической точки зрения оператор Ждать ожидает завершения асинхронной функции, стоящей за объектом Обещание. Однако это ожидание вовсе не означает блокировку потока выполнения до момента завершения вернувшей Обещание асинхронной функции.
В операторе Ждать выполнение Асинх-процедуры/функции может приостанавливаться и возобновляться. Приостановка означает выход из процедуры/функции с возможностью последующего продолжения с той же точки, где выполнение было приостановлено. Возобновление происходит в том же операторе Ждать, после того как асинхронная функция завершится (выполнит свое обещание).
Суть этих изменений проще всего увидеть на следующем примере. Этот пример немного надуман и вряд ли представляет большую практическую ценность. Но он нужен, чтобы легче понять второй, уже достаточно практический пример.