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

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

Асинхронная функция в 1С: что это и как её использовать

Что такое асинхронная функция в 1С, чем отличается от фоновых заданий, как использовать Ждать, Асинх и НачатьВыполнениеОбработкиОповещения. Примеры кода и типичные ошибки.

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

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

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

Что такое асинхронность в контексте платформы 1С

В классическом синхронном коде каждая строка выполняется после завершения предыдущей. Если строка — это обращение к внешнему сервису на 10 секунд, весь сеанс ждёт эти 10 секунд. Асинхронная модель меняет порядок: вызов запускается, управление возвращается коду, а результат обрабатывается позже — когда операция завершится.

В 1С асинхронность исторически развивалась в три этапа. Сначала использовались модальные методы (Вопрос, Предупреждение), которые блокировали интерфейс. Затем появились описания оповещений — механизм «вызови метод и укажи, какую процедуру выполнить по завершении». В современных версиях платформы добавлены ключевые слова Асинх и Ждать, которые делают код линейным и читаемым, сохраняя неблокирующее поведение.

Ключевые слова Асинх и Ждать: как это работает

Ключевое слово Асинх ставится перед объявлением функции или процедуры в клиентском модуле. Такая функция может содержать оператор Ждать, который приостанавливает выполнение именно этой функции до получения результата асинхронного метода, не блокируя при этом интерфейс и остальной код. Вызов выглядит так: Результат = Ждать АсинхронныйМетод();.

Методы платформы, поддерживающие асинхронный вызов, имеют пары: например, НачатьПомещениеФайла, НачатьВопрос, НачатьКопированиеФайла. С Ждать используются их варианты, возвращающие обещание: ПоместитьФайлАсинх, ЗадатьВопросАсинх и другие — точный список зависит от версии платформы и указывается в синтакс-помощнике.

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

1c
&НаКлиенте
Асинх Процедура ЗагрузитьФайл(Команда)
	Результат = Ждать ПоместитьФайлАсинх(,,, Истина, УникальныйИдентификатор);
	Если Результат <> Неопределено Тогда
		Сообщить("Файл помещён во временное хранилище");
	КонецЕсли;
КонецПроцедуры

Фоновые задания: асинхронность на сервере

Фоновое задание — это отдельный сеанс на сервере, который выполняет указанную процедуру независимо от сеанса пользователя. Запускается вызовом ФоновыеЗадания.Выполнить("ИмяМодуля.ИмяПроцедуры", Параметры, Ключ, Наименование). Пользователь сразу получает управление, а серверная процедура работает параллельно.

Ключевые ограничения: процедура фонового задания должна находиться в общем серверном модуле, не может обращаться к данным формы напрямую и не возвращает значение вызвавшему коду — результат передаётся через временное хранилище, регистры сведений или другие механизмы обмена. Для отслеживания завершения в форме используют ДлительныеОперации из БСП (если конфигурация на библиотеке стандартных подсистем) или периодический опрос состояния задания.

Параметр Ключ у фонового задания предотвращает запуск дубликатов: два задания с одинаковым ключом и методом не выполняются одновременно. Это удобно для защиты от повторного нажатия кнопки «Сформировать отчёт».

Сравнение механизмов

Асинх/Ждать

Клиентский код: диалоги, файлы, внешние компоненты. Не работает на сервере.

Описание оповещения

Совместимость со старым кодом и веб-клиентом. Более громоздкий синтаксис.

Фоновые задания

Тяжёлые серверные вычисления, обмены, отчёты. Не имеют доступа к форме.

Описания оповещений: когда встречаются в старом коде

До появления Асинх/Ждать асинхронность оформлялась через объект ОписаниеОповещения: вы создавали описание с именем процедуры-обработчика и передавали его в метод вида ПоказатьВопрос или НачатьПомещениеФайла. По завершении операции платформа вызывала указанную процедуру с результатом.

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

Как выбрать подходящий механизм

Ориентируйтесь на место выполнения и характер операции. Если нужно спросить пользователя, выбрать файл или дождаться внешней компоненты в форме — используйте Асинх/Ждать в клиентской процедуре. Если нужно выполнить тяжёлый расчёт, провести пакет документов или сформировать большой отчёт — запускайте фоновое задание на сервере, а в форме покажите индикатор и обработайте завершение.

Частая архитектурная ошибка — пытаться выполнить серверный расчёт через клиентский Ждать. Это не снимает нагрузку: серверный вызов всё равно выполняется в рамках сеанса, а сеанс занят. Реальную разгрузку даёт только фоновое задание с отдельным сеансом.

Маршрут решения

Как выбрать действие

Нужен диалог с пользователем или работа с файлами на клиентеИспользуйте Асинх/Ждать в клиентской процедуре формы
Тяжёлый расчёт или обработка данных на сервере дольше пары секундЗапустите фоновое задание и покажите индикатор в форме
Код пишется под старую версию платформы без поддержки АсинхИспользуйте ОписаниеОповещения и методы Начать*/Показать*
Нужно запретить повторный запуск операцииЗадайте уникальный Ключ фонового задания

Типичные ошибки и ограничения

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

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

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

Как проверить, что асинхронный код работает правильно

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

Для фоновых заданий контролируйте состояние через консоль заданий или метод ФоновыеЗадания.ПолучитьФоновыеЗадания с отбором по ключу: задание должно завершаться состоянием «Завершено», а не «Ошибка». Текст ошибки задания доступен через свойство ИнформацияОбОшибке объекта задания.

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

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

Отзывчивость формы во время операции
Норма

Форма реагирует на действия, виден индикатор

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

Окно не отвечает до конца операции — вызов синхронный

Состояние фонового задания
Норма

Статус Завершено, результат в хранилище

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

Статус Ошибка или задание зависло в Активно

Отмена операции пользователем
Норма

Код корректно обрабатывает Неопределено

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

Ошибка при отмене или пустой результат записывается в базу

Ответы на частые вопросы

Чем Асинх/Ждать отличаются от фоновых заданий?

Асинх/Ждать работают только на клиенте и не создают новый сеанс — они лишь не блокируют интерфейс во время ожидания. Фоновое задание — это отдельный серверный сеанс, который реально выполняется параллельно и разгружает основной сеанс пользователя.

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

Нет. Ключевые слова Асинх и Ждать поддерживаются только в клиентских модулях. Для серверной асинхронности применяются фоновые задания или регламентные задания.

Как получить результат из фонового задания в форму?

Передайте в задание адрес временного хранилища, поместите туда результат в конце серверной процедуры, а в форме по событию завершения (или через ДлительныеОперации БСП) прочитайте данные по этому адресу методом ПолучитьИзВременногоХранилища.

Почему в веб-клиенте не работают модальные методы?

Браузерное окружение не поддерживает блокирующие модальные окна, поэтому платформа требует асинхронных аналогов: ПоказатьВопрос вместо Вопрос, ПоказатьПредупреждение вместо Предупреждение. В новых разработках используйте Асинх-варианты этих методов.

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

Ожидание прервётся вместе с контекстом формы, и код после Ждать не выполнится. Если операция должна завершиться гарантированно, выносите её в фоновое задание на сервере — оно не зависит от жизни формы.

Нужно ли переписывать старый код с ОписаниеОповещения на Асинх?

Обязательной необходимости нет: механизм оповещений поддерживается платформой. Переписывать стоит при доработке конкретного фрагмента — линейный код с Ждать проще сопровождать и отлаживать.

Итог

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

Асинхронная функция в 1С не блокирует интерфейс во время длительной операции. На клиенте используйте Асинх/Ждать, на сервере — фоновые задания. Результат фонового задания передавайте через временное хранилище, защищайтесь от повторных запусков ключом задания и всегда обрабатывайте отмену операции пользователем.