К статье
Практический материал

Разработка и Конфигурация · 9 мин

Как работает оператор Ждать в 1С: асинхронные вызовы простыми словами

Как работает оператор Ждать в 1С: синтаксис, асинхронные методы, обещания, типичные ошибки и примеры кода для разработчика.

Оператор Ждать появился во встроенном языке 1С вместе с механизмом асинхронного программирования и нужен для того, чтобы приостановить выполнение текущей процедуры до получения результата асинхронного вызова — не блокируя при этом интерфейс пользователя. Он пришёл на смену связке «ОписаниеОповещения + НачатьВызов…», которая делала код громоздким и трудночитаемым.

Главное, что нужно понять сразу: Ждать нельзя использовать в любой процедуре. Он работает только внутри процедур и функций, объявленных с ключевым словом Асинх, и только в клиентском коде (в тонком, толстом и веб-клиенте). На сервере асинхронная модель не поддерживается — там вызовы выполняются синхронно.

Механизм построен на понятии «обещание» (объект типа Обещание). Асинхронный метод платформы возвращает обещание, а оператор Ждать «разворачивает» его: когда обещание выполнено, процедура продолжается со следующей строки, и вы получаете готовый результат — как будто вызов был обычным синхронным.

Зачем в 1С появились Ждать и Асинх

Исторически модальные вызовы (Вопрос, Предупреждение, ВвестиЗначение) блокировали интерфейс, а веб-клиент и браузеры вообще запретили такие блокировки. Платформа перешла на асинхронную модель: вместо модальных методов появились ПоказатьВопрос, НачатьПомещениеФайла и другие методы с префиксами «Начать» и «Показать», которые требовали описания оповещения.

Код с оповещениями дробился на множество мелких процедур-обработчиков, логика «расползалась» по модулю, и отладка превращалась в проблему. Операторы Асинх и Ждать решают это: вся цепочка действий пишется последовательно, сверху вниз, как обычный синхронный код, а платформа сама управляет паузами.

Синтаксис и базовые правила использования

Оператор применяется к выражению, которое возвращает обещание, либо к вызову асинхронного метода платформы. Типичный вид: Результат = Ждать ПоказатьВопросАсинх(...) или Ждать НачатьПомещениеФайлаАсинх(...). Возвращаемое значение — это то, что раньше приходило в параметры обработчика оповещения.

Ключевые правила, которые нужно соблюдать:

  • процедура или функция обязательно объявляется с ключевым словом Асинх;
  • Ждать работает только на клиенте — в серверном контексте будет ошибка компиляции или выполнения;
  • пока выполняется Ждать, интерфейс остаётся отзывчивым: пользователь может работать с другими элементами;
  • асинхронную функцию можно вызывать из обычного кода — она вернёт обещание, которое при желании тоже можно «подождать» в другой Асинх-процедуре.
bsl
&НаКлиенте
Асинх Процедура ЗагрузитьФайл(Команда)
	Результат = Ждать ПоместитьФайлНаСерверАсинх(,,, УникальныйИдентификатор);
	Если Результат <> Неопределено Тогда
		Сообщить("Файл помещён: " + Результат.Адрес);
	КонецЕсли;
КонецПроцедуры

Как Ждать работает «под капотом»

Когда исполнение доходит до оператора Ждать, платформа запоминает текущее состояние процедуры (локальные переменные, точку выполнения) и возвращает управление системе событий. Пользовательский интерфейс продолжает обрабатывать действия — форма не «зависает».

После завершения асинхронной операции платформа восстанавливает сохранённый контекст и продолжает процедуру со строки, следующей за Ждать. Для разработчика это выглядит как обычная пауза, но физически процедура «разрывается» на две части, которые выполняются в разные моменты времени.

Из этого следует важное следствие: между началом и продолжением процедуры состояние формы и данных может измениться. Нельзя безоговорочно полагаться на то, что реквизиты формы, текущая строка таблицы или открытые окна остались теми же — после Ждать такие вещи стоит перепроверять.

Типичные сценарии применения

Диалоги с пользователем

Самый частый случай — вопросы и предупреждения. Вместо ПоказатьВопрос с описанием оповещения пишется линейный код:

&НаКлиенте

Асинх Процедура УдалитьСтроки(Команда)

Ответ = Ждать ВопросАсинх("Удалить выбранные строки?", РежимДиалогаВопрос.ДаНет);

Если Ответ = КодВозвратаДиалога.Да Тогда

УдалитьСтрокиНаСервере();

КонецЕсли;

КонецПроцедуры

Работа с файлами

Помещение и получение файлов, выбор каталога, диалоги открытия — всё это асинхронные операции. С Ждать цепочка «выбрать файл → поместить → обработать на сервере» записывается в одну процедуру без вложенных обработчиков.

Внешние компоненты и расширения работы с файлами

Установка расширения работы с файлами, подключение внешних компонент, вызов их асинхронных методов — все эти операции возвращают обещания и естественно сочетаются с Ждать.

Как перевести код с оповещений на Ждать
  1. 1
    Найдите вызов метода с ОписаниеОповещения (ПоказатьВопрос, НачатьПомещениеФайла и т.п.)
  2. 2
    Добавьте процедуре ключевое слово Асинх
  3. 3
    Замените вызов на асинхронный вариант метода с оператором Ждать, результат присвойте переменной
  4. 4
    Перенесите тело обработчика оповещения в основную процедуру сразу после строки с Ждать
  5. 5
    Удалите ставший ненужным обработчик и проверьте поведение формы в тонком и веб-клиенте

Обработка ошибок и параллельное выполнение

Если асинхронная операция завершилась с ошибкой, исключение возникает в точке Ждать. Поэтому стандартная конструкция Попытка ... Исключение ... КонецПопытки работает привычным образом — оберните ожидание в попытку и обработайте сбой единообразно.

Для параллельного запуска нескольких операций сначала вызываются асинхронные методы без Ждать (каждый возвращает обещание), а затем обещания ожидаются. Метод ЖдатьВсеАсинх позволяет дождаться завершения массива обещаний разом — это быстрее, чем последовательное ожидание каждого по отдельности.

Типичные ошибки
01
Использование Ждать в процедуре без Асинх — синтаксическая ошибка при проверке модуля
02
Попытка применить Ждать в серверном коде — асинхронность поддерживается только на клиенте
03
Обращение к элементам формы после Ждать без проверки, что форма ещё открыта
04
Ожидание, что Ждать блокирует интерфейс как модальное окно — на самом деле пользователь может продолжать работать
05
Смешивание в одной цепочке старых методов с оповещениями и Ждать без необходимости — код становится запутанным

Совместимость и ограничения

Операторы Асинх и Ждать доступны в современных версиях платформы 1С:Предприятие 8.3 (механизм появился начиная с версии 8.3.18 и развивался в последующих релизах). Если конфигурация работает в режиме совместимости со старыми версиями, проверьте, доступен ли асинхронный синтаксис в вашей установке.

Не все методы платформы имеют асинхронные аналоги с суффиксом «Асинх». Часть методов изначально возвращает обещание (например, методы работы с файлами в новых редакциях), часть доступна только через оповещения. Перед рефакторингом сверьтесь с синтакс-помощником по конкретному методу.

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

Контрольные точки

Как проверить результат

Поведение формы во время ожидания
Норма

Интерфейс реагирует на действия пользователя

Тревожный признак

Форма зависает — вероятно, использован синхронный или модальный вызов

Результат после Ждать
Норма

Переменная содержит ожидаемое значение (ответ диалога, описание файла)

Тревожный признак

Неопределено или ошибка — проверьте параметры вызова и обработку исключений

Работа в веб-клиенте
Норма

Код выполняется без ошибок в браузере

Тревожный признак

Ошибки компиляции или выполнения — проверьте директивы компиляции и контекст

Часто задаваемые вопросы

Можно ли использовать Ждать на сервере?

Нет. Асинхронная модель и оператор Ждать поддерживаются только в клиентском коде — тонком, толстом и веб-клиенте. Серверные процедуры выполняются синхронно, и попытка использовать там Ждать приведёт к ошибке.

Чем Ждать отличается от модального вызова Вопрос()?

Модальный вызов блокирует весь интерфейс до ответа пользователя и запрещён во многих режимах, включая веб-клиент. Ждать лишь приостанавливает текущую процедуру: остальной интерфейс остаётся активным, а код при этом выглядит линейным.

Что произойдёт, если пользователь закроет форму во время Ждать?

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

Можно ли вызвать Асинх-процедуру из обычной синхронной процедуры?

Да. Асинхронная функция при вызове из обычного кода вернёт объект Обещание, и выполнение вызвавшего кода продолжится сразу. Чтобы дождаться результата, нужно либо самому находиться в Асинх-контексте и применить Ждать, либо работать с обещанием через обработчики.

Как обработать ошибку внутри Ждать?

Оберните оператор в конструкцию Попытка–Исключение–КонецПопытки. Если асинхронная операция завершится неудачей, исключение возникнет именно в строке с Ждать, и его можно обработать стандартным способом через ИнформацияОбОшибке().

Заменяет ли Ждать полностью описания оповещений?

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

Итог

Что важно запомнить

Ждать приостанавливает Асинх-процедуру до завершения асинхронной операции и возвращает её результат, не блокируя интерфейс. Работает только на клиенте, требует ключевого слова Асинх, ошибки обрабатываются через Попытка–Исключение, а состояние формы после ожидания стоит перепроверять.