Разработка и Конфигурация · 9 мин
Как работает оператор Ждать в 1С: асинхронные вызовы простыми словами
Как работает оператор Ждать в 1С: синтаксис, асинхронные методы, обещания, типичные ошибки и примеры кода для разработчика.
Оператор Ждать появился во встроенном языке 1С вместе с механизмом асинхронного программирования и нужен для того, чтобы приостановить выполнение текущей процедуры до получения результата асинхронного вызова — не блокируя при этом интерфейс пользователя. Он пришёл на смену связке «ОписаниеОповещения + НачатьВызов…», которая делала код громоздким и трудночитаемым.
Главное, что нужно понять сразу: Ждать нельзя использовать в любой процедуре. Он работает только внутри процедур и функций, объявленных с ключевым словом Асинх, и только в клиентском коде (в тонком, толстом и веб-клиенте). На сервере асинхронная модель не поддерживается — там вызовы выполняются синхронно.
Механизм построен на понятии «обещание» (объект типа Обещание). Асинхронный метод платформы возвращает обещание, а оператор Ждать «разворачивает» его: когда обещание выполнено, процедура продолжается со следующей строки, и вы получаете готовый результат — как будто вызов был обычным синхронным.
Зачем в 1С появились Ждать и Асинх
Исторически модальные вызовы (Вопрос, Предупреждение, ВвестиЗначение) блокировали интерфейс, а веб-клиент и браузеры вообще запретили такие блокировки. Платформа перешла на асинхронную модель: вместо модальных методов появились ПоказатьВопрос, НачатьПомещениеФайла и другие методы с префиксами «Начать» и «Показать», которые требовали описания оповещения.
Код с оповещениями дробился на множество мелких процедур-обработчиков, логика «расползалась» по модулю, и отладка превращалась в проблему. Операторы Асинх и Ждать решают это: вся цепочка действий пишется последовательно, сверху вниз, как обычный синхронный код, а платформа сама управляет паузами.
Синтаксис и базовые правила использования
Оператор применяется к выражению, которое возвращает обещание, либо к вызову асинхронного метода платформы. Типичный вид: Результат = Ждать ПоказатьВопросАсинх(...) или Ждать НачатьПомещениеФайлаАсинх(...). Возвращаемое значение — это то, что раньше приходило в параметры обработчика оповещения.
Ключевые правила, которые нужно соблюдать:
- процедура или функция обязательно объявляется с ключевым словом
Асинх; Ждатьработает только на клиенте — в серверном контексте будет ошибка компиляции или выполнения;- пока выполняется
Ждать, интерфейс остаётся отзывчивым: пользователь может работать с другими элементами; - асинхронную функцию можно вызывать из обычного кода — она вернёт обещание, которое при желании тоже можно «подождать» в другой Асинх-процедуре.
&НаКлиенте
Асинх Процедура ЗагрузитьФайл(Команда)
Результат = Ждать ПоместитьФайлНаСерверАсинх(,,, УникальныйИдентификатор);
Если Результат <> Неопределено Тогда
Сообщить("Файл помещён: " + Результат.Адрес);
КонецЕсли;
КонецПроцедурыКак Ждать работает «под капотом»
Когда исполнение доходит до оператора Ждать, платформа запоминает текущее состояние процедуры (локальные переменные, точку выполнения) и возвращает управление системе событий. Пользовательский интерфейс продолжает обрабатывать действия — форма не «зависает».
После завершения асинхронной операции платформа восстанавливает сохранённый контекст и продолжает процедуру со строки, следующей за Ждать. Для разработчика это выглядит как обычная пауза, но физически процедура «разрывается» на две части, которые выполняются в разные моменты времени.
Из этого следует важное следствие: между началом и продолжением процедуры состояние формы и данных может измениться. Нельзя безоговорочно полагаться на то, что реквизиты формы, текущая строка таблицы или открытые окна остались теми же — после Ждать такие вещи стоит перепроверять.
Типичные сценарии применения
Диалоги с пользователем
Самый частый случай — вопросы и предупреждения. Вместо ПоказатьВопрос с описанием оповещения пишется линейный код:
&НаКлиенте
Асинх Процедура УдалитьСтроки(Команда)
Ответ = Ждать ВопросАсинх("Удалить выбранные строки?", РежимДиалогаВопрос.ДаНет);
Если Ответ = КодВозвратаДиалога.Да Тогда
УдалитьСтрокиНаСервере();
КонецЕсли;
КонецПроцедуры
Работа с файлами
Помещение и получение файлов, выбор каталога, диалоги открытия — всё это асинхронные операции. С Ждать цепочка «выбрать файл → поместить → обработать на сервере» записывается в одну процедуру без вложенных обработчиков.
Внешние компоненты и расширения работы с файлами
Установка расширения работы с файлами, подключение внешних компонент, вызов их асинхронных методов — все эти операции возвращают обещания и естественно сочетаются с Ждать.
- 1Найдите вызов метода с ОписаниеОповещения (ПоказатьВопрос, НачатьПомещениеФайла и т.п.)
- 2Добавьте процедуре ключевое слово Асинх
- 3Замените вызов на асинхронный вариант метода с оператором Ждать, результат присвойте переменной
- 4Перенесите тело обработчика оповещения в основную процедуру сразу после строки с Ждать
- 5Удалите ставший ненужным обработчик и проверьте поведение формы в тонком и веб-клиенте
Обработка ошибок и параллельное выполнение
Если асинхронная операция завершилась с ошибкой, исключение возникает в точке Ждать. Поэтому стандартная конструкция Попытка ... Исключение ... КонецПопытки работает привычным образом — оберните ожидание в попытку и обработайте сбой единообразно.
Для параллельного запуска нескольких операций сначала вызываются асинхронные методы без Ждать (каждый возвращает обещание), а затем обещания ожидаются. Метод ЖдатьВсеАсинх позволяет дождаться завершения массива обещаний разом — это быстрее, чем последовательное ожидание каждого по отдельности.
Совместимость и ограничения
Операторы Асинх и Ждать доступны в современных версиях платформы 1С:Предприятие 8.3 (механизм появился начиная с версии 8.3.18 и развивался в последующих релизах). Если конфигурация работает в режиме совместимости со старыми версиями, проверьте, доступен ли асинхронный синтаксис в вашей установке.
Не все методы платформы имеют асинхронные аналоги с суффиксом «Асинх». Часть методов изначально возвращает обещание (например, методы работы с файлами в новых редакциях), часть доступна только через оповещения. Перед рефакторингом сверьтесь с синтакс-помощником по конкретному методу.
Также учитывайте, что отладка асинхронного кода отличается: точка останова после Ждать сработает в момент продолжения процедуры, а стек вызовов будет выглядеть иначе, чем у синхронного кода.
Как проверить результат
Интерфейс реагирует на действия пользователя
Форма зависает — вероятно, использован синхронный или модальный вызов
Переменная содержит ожидаемое значение (ответ диалога, описание файла)
Неопределено или ошибка — проверьте параметры вызова и обработку исключений
Код выполняется без ошибок в браузере
Ошибки компиляции или выполнения — проверьте директивы компиляции и контекст
Часто задаваемые вопросы
Можно ли использовать Ждать на сервере?
Нет. Асинхронная модель и оператор Ждать поддерживаются только в клиентском коде — тонком, толстом и веб-клиенте. Серверные процедуры выполняются синхронно, и попытка использовать там Ждать приведёт к ошибке.
Чем Ждать отличается от модального вызова Вопрос()?
Модальный вызов блокирует весь интерфейс до ответа пользователя и запрещён во многих режимах, включая веб-клиент. Ждать лишь приостанавливает текущую процедуру: остальной интерфейс остаётся активным, а код при этом выглядит линейным.
Что произойдёт, если пользователь закроет форму во время Ждать?
Форма и её контекст будут уничтожены. Когда процедура продолжится, обращение к реквизитам и элементам формы может вызвать ошибку. В сценариях с длительными ожиданиями предусматривайте эту ситуацию или блокируйте закрытие формы.
Можно ли вызвать Асинх-процедуру из обычной синхронной процедуры?
Да. Асинхронная функция при вызове из обычного кода вернёт объект Обещание, и выполнение вызвавшего кода продолжится сразу. Чтобы дождаться результата, нужно либо самому находиться в Асинх-контексте и применить Ждать, либо работать с обещанием через обработчики.
Как обработать ошибку внутри Ждать?
Оберните оператор в конструкцию Попытка–Исключение–КонецПопытки. Если асинхронная операция завершится неудачей, исключение возникнет именно в строке с Ждать, и его можно обработать стандартным способом через ИнформацияОбОшибке().
Заменяет ли Ждать полностью описания оповещений?
В большинстве клиентских сценариев — да, и код становится заметно чище. Но описания оповещений остаются актуальными для обработчиков событий форм, подключаемых обработчиков ожидания и в случаях, когда результат асинхронной операции нужен не немедленно, а «когда-нибудь потом».
Что важно запомнить
Ждать приостанавливает Асинх-процедуру до завершения асинхронной операции и возвращает её результат, не блокируя интерфейс. Работает только на клиенте, требует ключевого слова Асинх, ошибки обрабатываются через Попытка–Исключение, а состояние формы после ожидания стоит перепроверять.