1с создание фонового задания

Обновлено: 07.07.2024

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

Недавно я разместил статью: Чтение данных с сайта в формате XML и загрузка в 1С пришло время это автоматизировать:

Регламентные и фоновые задания

Механизм заданий предназначен для выполнения какой-либо прикладной или функциональности по расписанию или асинхронно.

Механизм заданий решает следующие задачи:

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

Механизм заданий состоит из следующих компонентов:

  • Метаданных регламентных заданий;
  • Регламентных заданий;
  • Фоновых заданий;
  • Планировщика заданий.

Фоновые задания & предназначены для выполнения прикладных задач асинхронно. Фоновые задания реализуются средствами встроенного языка.

Регламентные задания & предназначены для выполнения прикладных задач по расписанию. Регламентные задания хранятся в информационной базе и создаются на основе метаданных, определяемых в конфигурации. Метаданные регламентного задания содержат такую информацию как наименование, метод, использование и т.д.

Регламентное задание имеет расписание, которое определяет, в какие моменты времени нужно выполнять связанный с регламентным заданием метод. Расписание, как правило, задается в информационной базе, но может быть задано и на этапе конфигурирования (например, для предопределенных регламентных заданий).

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

С описанием, думаю, хватит - приступим к реализации:

Создание регламентного задания


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

Использование – признак использования регламентного задания.

Предопределенное – указывает, является ли регламентное задание предопределенным.

Если хотите что бы регламентное задание заработало сразу после помещения в БД, укажите признак Предопределенное. В противном случае вам необходимо будет использовать обработку “Консоль заданий” или вызывать запуск задания программно.

Количество повторов при аварийном завершении задания – сколько раз выполнен перезапуск фонового задания, если оно было выполнено с ошибкой.

Интервал повтора при аварийном завершении задания – с какой периодичностью будет выполнен перезапуск фонового задания, если оно было выполнено с ошибкой.

Настройка расписания

Расписание выполнения задания:


Особенности выполнения фоновых заданий файловом и клиент-серверном вариантах

Механизмы выполнения фоновых заданий в файловом и клиент-серверном вариантах различаются.

В файловом варианте необходимо создать выделенный клиентский процесс, который будет заниматься выполнением фоновых заданий. Для этого в клиентском процессе должна периодически вызываться функция глобального контекста ВыполнитьОбработкуЗаданий. Только один клиентский процесс на информационную базу должен выполнять обработку фоновых заданий (и, соответственно, вызывать данную функцию). Если клиентского процесса для обработки фоновых заданий не создано, то при программном доступе к механизму заданий будет выдана ошибка «Менеджер заданий не активен». Не рекомендуется клиентский процесс, выполняющий обработку фоновых заданий, использовать для других функций.

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

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

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

  • На информационную базу установлена явная блокировка регламентных заданий. Блокировка может быть установлена через консоль кластера;
  • На информационную базу установлена блокировка соединения. Блокировка может быть установлена через консоль кластера;
  • Из встроенного языка вызван метод УстановитьМонопольныйРежим() с параметром Истина;
  • В некоторых других случаях (например, при обновлении конфигурации базы данных).

Обработки запуска и просмотра регламентных заданий вы можете скачать здесь:

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

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

Некоторые методы, вероятность исключений которых сведена к минимуму, не нуждаются в асинхронном подходе, но другие - требуют его в самом начале разработки.


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


При синхронном выполнении у приложения есть только один поток. С помощью асинхронной модели программирования вы можете запускать множество параллельных потоков и во время их выполнения реагировать на новые действия пользователя. После того как n-поток выполнен, вы отображаете результат на экран.

Фоновые задания в «1С:Предприятие 8»

В «1С:Предприятие 8» фоновые задания предназначены для выполнения прикладных задач асинхронно. Они могут порождать дочерние фоновые задания, например, для распараллеливания сложных вычислений по различным рабочим серверам кластера в клиент-серверном варианте работы.

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

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

В клиент-серверном варианте планированием выполнения заданий занимается планировщик заданий, который физически располагается в менеджере кластера.

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

Начиная с версии 8.3.3.641 платформы, разработчики значительно упростили работу с фоновыми заданиями в файловом варианте.

Раньше для автоматического выполнения заданий требовалось запускать отдельный, дополнительный сеанс «1С:Предприятия», используемый в качестве планировщика заданий. И в этом сеансе нужно было периодически выполнять метод встроенного языка ВыполнитьОбработкуЗаданий(). Такой подход был довольно громоздким, неудобным и сильно ограничивал использование фоновых и регламентных заданий в файловом варианте работы.

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

Каждое из перечисленных приложений выполняет собственные фоновые задания. Если приложение инициировало несколько фоновых заданий, то выполняются они последовательно, в порядке поступления.

Необходимо отметить, что фоновые задания - это объекты исключительно программные и их нельзя сохранить в базе данных. То есть мы можем только создать экземпляр класса, инициализировать его свойства и запустить его на выполнение.

Пример асинхронного выполнения кода в «1С:Предприятие 8»

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

Продемонстрируем всю простоту и изящество асинхронного выполнения кода в «1С:Предприятие 8»!

Шаг 1. Создадим новую ИБ для разработки конфигурации

Шаг 2. В конфигурации добавим общий модуль «АсинхронныеОбработчики»

Почему мы добавили общий модуль? Тут все просто: для выполнения асинхронных операций в «1С:Предприяте 8» применяются фоновые задания, у которых имеется свой менеджер - «МенеджерФоновыхЗадания». У этого объекта есть метод «Выполнить», с помощью которого как раз и запускается фоновое задание.

Обратимся к синтакс-помощнику.


Таким образом, нам понадобится общий модуль.


Шаг 3. В общем модуле «АиснхронныеОбработчики» добавим экспортную процедуру НашаДлительнаяОперация()

Шаг 4. Добавляем в конфигурацию обработку «АсинхроннаяКонцепцияПрограммирования» (можно создать внешнюю обработку)


На форму добавляем один реквизит:

Шаг 5. Согласно синтакс-помощнику заполняем модуль формы

Шаг 6. Запускаем и проверяем!

- если мы нажимаем на кнопку «Выполнить длительную операцию», то пользовательский интерфейс на «Длительность» секунд блокируется;

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

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


Отладить программный код, который выполняется в «фоне» мы можем, если в параметрах отладки установим соответствующее свойство.


Пример асинхронного выполнения кода в «1С:Предприятие 8» с использование БСП

Пример реализации асинхронной концепции программирования в «1С:Предприятие 8» в БСП рассмотрим на примере обработки «Текущие дела».


Логика следующая: во время запуска программы инициализируется рабочая область начальной страницы, куда можно вывести форму обработки «Текущие дела». Эта форма заполняется текущими делами пользователя, а чтобы ее заполнить необходимо время. Если бы у разработчиков не было возможности асинхронно выполнять код, то на все время заполнения формы обработки пользовательский интерфейс был бы заблокирован!


Проанализируем программный код формы.

Событие формы «ПриСозданииНаСервере» вызывает процедуру «ЗапуститьФоновоеЗадание» - это то, что нам и нужно.


Не отвлекаясь на нюансы, анализируем данную процедуру


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

И Что же дальше? А дальше нам необходимо отловить момент выполнения задания.

Для этого разработчики применяют метод ПодключитьОбработчикОжидания(<ИмяПроцедуры>, <Интервал>, <Однократно>).



В подключаемой процедуре Подключаемый_ПроверитьВыполнениеЗадания() разработчики вызывают функцию ЗаданиеВыполнено(ИдентификаторЗадания)


Данная функция по идентификатору проверяет выполнения фонового задания.

Необходимо отметить, что в БСП разработаны общие модули поддержки работы длительных серверных операций.



Таким образом, асинхронная концепция программирования в «1С:Предприятие 8» незначительно увеличивает трудоемкость решения задач для разработчика, но заметно улучшает функциональность программы с точки зрения пользователя.


Регламентные задания позволяют выполнять определенные действия по расписанию. Для выполнения используются фоновые задания.

Регламентные задания хранятся в базе данных. В конфигурации есть объект метаданных Регламентные задания, где можно создать новое задание, указать метод для выполнения, расписание и т.п. Если установить в свойствах флаг Предопределенное, то при сохранении конфигурации базы данных регламентное задание будет записано в базу данных. Если флаг не установлен, то записать задание в базу нужно вручную.

Для примера создадим простое регламентное задание и установим у него флаг Предопределенное, а также Использование. Использование означает, что регламентное задание будет выполняться согласно его расписанию.

Регламентные задания

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

В свойстве Имя метода нужно выбрать не глобальный серверный общий модуль, в котором будет создана процедура для выполнения. Можно выбрать уже существующую процедуру или функцию из общего модуля. Если выбрана функция, то результат выполнения будет проигнорирован.

Если сейчас сохранить конфигурацию базы данных, то регламентное задание не будет выполняться, потому что для него не настроено Расписание.

Расписание регламентных заданий

Для настройки расписания нужно нажать на гиперссылку Открыть рядом со свойством Расписание. Будет открыто окно настройки расписания:

Расписание регламентных заданий

Для примера настроим чтобы регламентное задание выполнялось каждые 5 минут. Для этого на закладке Общее укажем, что нужно повторять задание каждый день:

Расписание регламентных заданий

Расписание регламентных заданий

Нажмем ОК, сохраним конфигурацию базы данных. Теперь каждые 5 минут будет запускаться фоновое задание и выполнять код из процедуры, которая указана в свойстве Имя метода.

Расписание тоже сохраняется в таблице регламентных заданий. Если сейчас изменить расписание в конфигураторе и сохранить конфигурацию базы данных, то все равно будет использоваться старое расписание. Чтобы применилось новое расписание, его нужно установить в пользовательском режиме. Или снять флаг Предопределенное и сохранить конфигурацию базы данных. В этот момент запись об этом регламентном задании будет удалена из таблицы. А потом настроить в конфигураторе новое расписание и снова поставить флаг Предопределенное. Регламентное задание будет записано в таблицу с новым расписанием.

Для программного открытия окна настройки расписания регламентного задания в пользовательском режиме можно воспользоваться следующим кодом:

ДиалогРасп = Новый ДиалогРасписанияРегламентногоЗадания ( Расп ) ; ОбратныйВызов = Новый ОписаниеОповещения ( "ЗаписатьРасписание" , ЭтотОбъект ) ; РеглЗад = РегламентныеЗадания . НайтиПредопределенное ( "РегламентноеЗадание1" ) ; Процедура ЗаписатьРасписание ( Расп , ДопПараметры ) Экспорт РеглЗад = РегламентныеЗадания . НайтиПредопределенное ( "РегламентноеЗадание1" ) ;

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

Расписание регламентных заданий

Расписание можно создать программно:

РеглЗад = РегламентныеЗадания . НайтиПредопределенное ( "РегламентноеЗадание1" ) ;

Теперь регламентное задание будет выполняться каждую минуту.

Рассмотрим некоторые настройки расписания:

Те же самые примеры, но программно:

НовоеРасп . ВремяНачала = Новый Дата ( 1 , 1 , 1 , 1 , 0 , 0 ) ; НовоеРасп . ВремяНачала = Новый Дата ( 1 , 1 , 1 , 1 , 0 , 0 ) ; НовоеРасп . ВремяНачала = Новый Дата ( 1 , 1 , 1 , 1 , 0 , 0 ) ; Расп 1 . ВремяНачала = Новый Дата ( 1 , 1 , 1 , 13 , 0 , 0 ) ; Расп 2 . ВремяНачала = Новый Дата ( 1 , 1 , 1 , 18 , 0 , 0 ) ; //каждый день, в 13:00 и в 18:00, но только с 1 по 10 мая 2021 года Расп 1 . ВремяНачала = Новый Дата ( 1 , 1 , 1 , 13 , 0 , 0 ) ; Расп 2 . ВремяНачала = Новый Дата ( 1 , 1 , 1 , 18 , 0 , 0 ) ;

Планировщик регламентных заданий

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

В файловом варианте регламентные задания выполняются на клиентском приложении. Причем только на одном. Это будет самое первое запущенное клиентское приложение. Если его закрыть, то регламентные задания начнут выполняться на другом клиентском приложении. Если больше нет запущенных клиентских приложений, то регламентные задания не будут выполняться. Если расписание регламентного задания было настроено на час ночи, а в этом время не был запущен ни один сеанс, то такое задание не будет выполнено. Обработка регламентных заданий выполняется один раз в 60 секунд. Если при запуске регламентного задания на этом клиентском сеансе уже выполняются какие-нибудь фоновые задания, то регламентное задание будет выполнено только после завершения всех текущих фоновых заданий.

До версии платформы 8.3.3.641 в файловом варианте не было автоматического выполнения регламентных заданий. Нужно было программно вызывать метод ВыполнитьОбработкуЗаданий. Обычно для этого запускался отдельный сеанс и в нем через обработчик ожидания вызывался данный метод.

Программная работа с регламентными заданиями

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

Механизм заданий

Механизм фоновых заданий реализуется средствами встроенного языка. Фоновые задания предназначены для для выполнения прикладных задач асинхронно. Они могут порождать дочерние фоновые задания, например для распараллеливания сложных вычислений по различным рабочим серверам кластера в клиент-серверном варианте работы.

Существует возможность ограничить выполнение фоновых заданий, имеющих одинаковые методы, по определенному прикладному признаку. Программное создание и управление фоновыми заданиями возможно из любого соединения пользователя с информационной базой системы 1С:Предприятие 8. Фоновое задание выполняется от имени пользователя, который его создал.

Регламентные задания

Регламентные задания представляют собой неотъемлемую часть конкретного прикладного решения и описываются на этапе конфигурирования.


Для каждого регламентного задания может быть задано расписание, в соответствии с которым регламентое задание будет автоматически запущено на исполнение. В системе 1С:Предприятие 8 поддерживаются однократные и периодические расписания. Можно задать дату начала и окончания выполнения, дневное, недельное и месячные расписания. Расписание можно задать как на этапе конфигурирования, так и на этапе выполнения (в режиме 1С:Предприятие).


В процессе запуска регламентное задание порождает фоновое задание, которое и выполняет реальную обработку. Регламентное задание может выполняться от имени заданного пользователя и имеет возможность перезапуска (например, в случае непредвиденного завершения работы).

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

Особенности выполнения регламентных заданий

В клиент-серверном варианте работы запуск регламентных заданий по расписанию осуществляет менеджер кластера. Таким образом, даже если с информационной базой не установлено ни одного клиентского соединения, регламентные задания будут выполняться (при условии, что они не запрещены для конкретной информационной базы):


В файловом варианте работы для автоматического запуска регламентных заданий необходимо наличие выделенного клиентского соединения, используемого в качестве планировщика заданий. В этом соединении должна быть запущена обработка ожидания, с некоторой периодичностью выполняющая вызов метода встроенного языка ВыполнитьОбработкуЗаданий():

Читайте также: