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

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

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

СвойствоЧто задаётНа что обратить внимание
Имя методаЭкспортная процедура неглобального серверного общего модуляМодуль должен компилироваться на сервере
КлючГруппировка заданий с одним методомВ пределах ключа одновременно выполняется не больше одного фонового задания
РасписаниеКогда запускатьЗадаётся в конфигураторе и переопределяется в режиме Предприятия
ИспользованиеВключено ли заданиеДля заданий, зависящих от функциональных опций, по умолчанию выключайте
ПредопределенноеСоздаётся ли задание автоматически в единственном экземпляреСнимайте, если экземпляров должно быть несколько
Количество повторов, интервал повтораПовтор при аварийном завершенииНе ставьте повторы операциям, которые не идемпотентны

Два правила, которые чаще всего нарушают:

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

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

Регламентные задания в БСП

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

1С
// РегламентныеЗаданияПереопределяемый
Процедура ПриОпределенииНастроекРегламентныхЗаданий(Настройки) Экспорт

	Настройка = Настройки.Добавить();
	Настройка.РегламентноеЗадание = Метаданные.РегламентныеЗадания.ЗагрузкаЗаказовСайта;
	Настройка.ФункциональнаяОпция = Метаданные.ФункциональныеОпции.ИспользоватьИнтеграциюССайтом;

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

Состав колонок таблицы настроек (например, признаки работы в модели сервиса) зависит от версии БСП — смотрите описание процедуры в своём модуле.

Метод задания в конфигурации на БСП начинается с вызова ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания. Он проверяет, можно ли сейчас выполнять задание (например, не идёт ли обновление информационной базы), и устанавливает нужные параметры сеанса.

1С
// Обработчик регламентного задания ЗагрузкаЗаказовСайта.
Процедура ЗагрузкаЗаказовСайта() Экспорт

	ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(
		Метаданные.РегламентныеЗадания.ЗагрузкаЗаказовСайта);

	Попытка
		ИнтеграцияССайтомСервер.ЗагрузитьНовыеЗаказы();
	Исключение
		ЗаписьЖурналаРегистрации("ИнтеграцияССайтом.ЗагрузкаЗаказов", УровеньЖурналаРегистрации.Ошибка, , ,
			ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
		ВызватьИсключение;
	КонецПопытки;

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

Повторный ВызватьИсключение после записи в журнал нужен, чтобы задание завершилось с ошибкой и это было видно в списке заданий, а не «успешно» с ошибкой где-то в журнале.

Изменение расписания из кода

Для изменения свойств заданий используйте модуль РегламентныеЗаданияСервер — он учитывает модель сервиса и права. Прямую работу с менеджером РегламентныеЗадания оставьте для конфигураций без БСП:

1С
// Без БСП: включить предопределённое задание и запускать каждые 15 минут.
Задание = РегламентныеЗадания.НайтиПредопределенное(Метаданные.РегламентныеЗадания.ЗагрузкаЗаказовСайта);

Расписание = Новый РасписаниеРегламентногоЗадания;
Расписание.ПериодПовтораДней = 1;
Расписание.ПериодПовтораВТечениеДня = 900;

Задание.Расписание = Расписание;
Задание.Использование = Истина;
Задание.Записать();

Рабочее место «Регламентные и фоновые задания»

В типовых конфигурациях оно открывается из раздела «Администрирование» — «Обслуживание» — «Регламентные операции». Возможности:

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

Для сопровождения это первое место, куда смотреть, когда «обмен не идёт». В рамках сопровождения 1С я начинаю с него и с журнала регистрации.

Фоновые задания для длительных операций

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

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

1С
ПараметрыМетода = Новый Массив;
ПараметрыМетода.Добавить(Период);

ФоновыеЗадания.Выполнить("ВыгрузкаДанныхСервер.ВыгрузитьЗаПериод", ПараметрыМетода,
	"ВыгрузкаЗаПериод", "Выгрузка данных за период");

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

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

1С
&НаСервере
Функция НачатьВыгрузку()

	ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияФункции(УникальныйИдентификатор);
	ПараметрыВыполнения.НаименованиеФоновогоЗадания = "Выгрузка данных за период";

	Возврат ДлительныеОперации.ВыполнитьФункцию(ПараметрыВыполнения,
		"ВыгрузкаДанныхСервер.ВыгрузитьЗаПериод", Период);

КонецФункции

&НаКлиенте
Процедура Выгрузить(Команда)

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

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

&НаКлиенте
Процедура ПослеВыгрузки(Результат, ДополнительныеПараметры) Экспорт

	Если Результат = Неопределено Тогда
		Возврат; // Пользователь отменил операцию
	КонецЕсли;
	Если Результат.Статус = "Ошибка" Тогда
		ПоказатьПредупреждение(, Результат.КраткоеПредставлениеОшибки);
		Возврат;
	КонецЕсли;
	ДанныеВыгрузки = ПолучитьИзВременногоХранилища(Результат.АдресРезультата);

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

Названия функций и полей результата менялись между версиями БСП (в старых редакциях был единый ВыполнитьВФоне) — сверяйтесь с модулем ДлительныеОперации своей конфигурации.

Отладка регламентных заданий

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

Типичные ошибки

  • Задание не стартует. Снято использование, выключена функциональная опция, в консоли кластера у базы стоит «Блокировка регламентных заданий». Последнее часто остаётся включённым после копирования рабочей базы в тестовую — и наоборот, его забывают включить в копии, и тестовая база начинает обмениваться с реальными системами.
  • Файловая база. Регламентные задания в файловом варианте выполняются не сервером, а в рамках клиентских сеансов или веб-публикации с соответствующей настройкой. Нет запущенных сеансов — нет и заданий. Для серьёзных регламентов нужен сервер 1С.
  • Задание висит. Внешний сервис не отвечает, а таймаута нет. Ставьте таймауты на все HTTP- и FTP-соединения.
  • Параллельные запуски. Задание длиннее периода расписания, и следующие запуски накладываются. Ключ ограничивает это, но надёжнее управлять расписанием и длительностью.
  • Права. Задание выполняется от имени пользователя, указанного в его свойствах, или без пользователя. Данные, которые видит администратор, могут быть недоступны заданию.
Регламентное задание — это код, который никто не видит. Пишите в журнал регистрации и завершайте задание с ошибкой, когда что-то пошло не так, иначе о сбое узнают от бухгалтера через неделю.

Если регламенты в базе выполняются медленно или мешают пользователям, это повод для доработки 1С с разнесением нагрузки по времени.

Итог

  • Регламентные задания 1С запускаются сервером по расписанию и выполняются как фоновые задания.
  • Задания, зависящие от функциональных опций, по умолчанию выключайте и связывайте с опциями через ПриОпределенииНастроекРегламентныхЗаданий.
  • Метод задания на БСП начинайте с ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания и логируйте ошибки.
  • Длительные пользовательские операции выносите в фон через ДлительныеОперации.
  • Проверяйте блокировку регламентных заданий в кластере при копировании баз.