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