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