Регламентное задание 1С: создание и запуск программно

Дата: 19.09.2026 09:47:59
Регламентные задания
Фоновые задания
Расписание
БСП
Администрирование
Серверный код
Комментарий:
0
Платформа:
8.3
Конфигурация:
Любая
Формы:
Любые

Регламентное задание 1С — процедура общего модуля, которую платформа сама вызывает по расписанию: ночью пересчитать себестоимость, каждые 15 минут выгрузить остатки на сайт, утром загрузить курсы валют. Ниже — чем предопределённое задание отличается от обычного, как создать регламентное задание программно с параметрами и ключом, собрать расписание, запустить задание вручную и сделать то же через БСП. Платформа 8.3, весь код серверный.

Где встречается задача

  • Одно действие на всю базу: очистка логов, загрузка курсов, закрытие просроченных резервов. Хватает предопределённого задания, код только включает его и меняет расписание.
  • Одно действие с разными параметрами: выгрузка остатков по каждому складу, отдельная синхронизация с сайтом для каждой витрины, рассылка отчёта разным получателям. Нужны непредопределённые задания, которые код создаёт, меняет и удаляет.
  • Кнопка «Запустить сейчас» и статус последнего запуска в форме настроек, чтобы не искать ошибки по журналу регистрации.

Если менять конфигурацию нельзя, обработку ставят на расписание через дополнительные обработки БСП или запускают снаружи с ключом /Execute из планировщика Windows — см. обработка 1С по расписанию.

Предопределённое и непредопределённое задание: в чём разница

Объект метаданных создаётся в конфигураторе в ветке Общие → Регламентные задания. Главные свойства: Имя метода (какую процедуру вызывать), Предопределенное, Использование, Расписание, Ключ, количество и интервал повторов при аварийном завершении. Флажок «Предопределенное» меняет модель работы:

ПризнакПредопределённоеНепредопределённое
Сколько экземпляровОдин на объект метаданных, запись в базе создаёт платформаСколько угодно, создаёт код
Как получить в кодеРегламентныеЗадания.НайтиПредопределенное()ПолучитьРегламентныеЗадания(Отбор), НайтиПоУникальномуИдентификатору()
Параметры процедурыНет: процедура без параметров, массив Параметры не заполняетсяСвой массив Параметры у каждого экземпляра
УдалениеНельзя, только снять ИспользованиеМетод Удалить()
Начальное расписаниеЗадаётся в конфигуратореИз кода или обработки администрирования

Экземпляр один на всю базу — предопределённое. Количество заданий зависит от данных (складов, организаций, узлов обмена) — непредопределённое, экземпляры различаем по ключу.

Шаг 1. Метод задания в общем модуле

Процедура задания должна быть экспортной и лежать в общем модуле с флажком «Сервер». Клиентские флажки не нужны: задание работает в фоновом сеансе на сервере. Массив Параметры, который передадим при создании экземпляра, должен покрыть все обязательные параметры процедуры и быть не длиннее их списка; необязательные (со значением по умолчанию) можно не передавать.

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

// Общий модуль ВыгрузкаОстатковЗадания. Флажок «Сервер»,
// «Клиент», «Глобальный» и «Вызов сервера» не нужны.

// Обработчик регламентного задания ВыгрузкаОстатковПоСкладу.
// Склад приходит из массива Параметры конкретного экземпляра задания.
Процедура ВыгрузитьОстаткиПоСкладу(Склад) Экспорт

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

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

	// Регистр условный: подставьте свой регистр остатков и его ресурс.
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	Остатки.Номенклатура КАК Номенклатура,
	|	Остатки.КоличествоОстаток КАК Количество
	|ИЗ
	|	РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &Склад) КАК Остатки";
	Запрос.УстановитьПараметр("Склад", Склад);
	Выборка = Запрос.Выполнить().Выбрать();

	Пока Выборка.Следующий() Цикл
		// Отправка остатка на сайт или маркетплейс.
	КонецЦикла;

	ЗаписьЖурналаРегистрации("ВыгрузкаОстатков.Выполнено", УровеньЖурналаРегистрации.Информация,
		Метаданные.РегламентныеЗадания.ВыгрузкаОстатковПоСкладу, Склад,
		"Выгружено позиций: " + Формат(Выборка.Количество(), "ЧН=0; ЧГ=0"));

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

Показать что-либо пользователю задание не может: Предупреждение() и Вопрос() в серверном модуле не скомпилируются, а текст из Сообщить() никто не увидит. Итоги и ошибки пишите в журнал регистрации — администратор найдёт их по имени события. Если процедура записывает несколько связанных объектов, оберните запись в транзакцию, чтобы после сбоя не осталось половины изменений.

Шаг 2. Создать регламентное задание 1С программно

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

// Ключ экземпляра задания: по нему отличаем задания разных складов.
Функция КлючЗадания(Склад)

	Возврат Строка(Склад.УникальныйИдентификатор());

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

// Возвращает регламентное задание склада или Неопределено.
Функция НайтиЗаданиеСклада(Склад) Экспорт

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

	УстановитьПривилегированныйРежим(Истина);
	Найденные = РегламентныеЗадания.ПолучитьРегламентныеЗадания(Отбор);

	Если Найденные.Количество() = 0 Тогда
		Возврат Неопределено;
	КонецЕсли;

	Возврат Найденные[0];

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

// Каждый день с 8:00 до 22:00 с интервалом в минутах.
Функция РасписаниеСИнтервалом(ИнтервалМинут) Экспорт

	Расписание = Новый РасписаниеРегламентногоЗадания;
	Расписание.ПериодПовтораДней = 1;
	Расписание.ПериодПовтораВТечениеДня = ИнтервалМинут * 60; // секунды
	Расписание.ВремяНачала = '00010101080000';
	Расписание.ВремяКонца = '00010101220000';

	Возврат Расписание;

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

// Создаёт задание для склада или обновляет существующее.
// Возвращает уникальный идентификатор задания.
Функция НастроитьЗаданиеСклада(Склад, ИнтервалМинут, Включить = Истина) Экспорт

	УстановитьПривилегированныйРежим(Истина);

	Задание = НайтиЗаданиеСклада(Склад);
	Если Задание = Неопределено Тогда
		Задание = РегламентныеЗадания.СоздатьРегламентноеЗадание(
			Метаданные.РегламентныеЗадания.ВыгрузкаОстатковПоСкладу);
		Задание.Ключ = КлючЗадания(Склад);
	КонецЕсли;

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

	Задание.Параметры = ПараметрыМетода;
	Задание.Наименование = "Выгрузка остатков: " + Строка(Склад);
	Задание.Расписание = РасписаниеСИнтервалом(ИнтервалМинут);
	Задание.Использование = Включить;
	Задание.КоличествоПовторовПриАварийномЗавершении = 3;
	Задание.ИнтервалПовтораПриАварийномЗавершении = 120; // секунды
	Задание.Записать();

	Возврат Задание.УникальныйИдентификатор;

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

// Удаляет задание склада, если оно есть.
Процедура УдалитьЗаданиеСклада(Склад) Экспорт

	УстановитьПривилегированныйРежим(Истина);

	Задание = НайтиЗаданиеСклада(Склад);
	Если Задание <> Неопределено Тогда
		Задание.Удалить();
	КонецЕсли;

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

Разбор ключевых строк

  • УстановитьПривилегированныйРежим(Истина) — менеджер РегламентныеЗадания требует права «Администрирование», а настройку может сохранять и кладовщик. Саму форму настроек закрывайте ролью.
  • СоздатьРегламентноеЗадание() создаёт объект только в памяти, в базе он появится после Записать().
  • Ключ — строка, по которой различаем экземпляры одного объекта метаданных. Уникальность ключа платформа не проверяет, поэтому сначала ищем задание и только потом создаём. Берём уникальный идентификатор ссылки склада — он не меняется при переименовании.
  • Параметры — массив, элементы передаются в процедуру по порядку. Массив хранится в базе вместе с заданием: кладите туда простые значения и ссылки, а не объекты и таблицы.
  • ПериодПовтораДней = 1 — без этой строки расписание не будет повторяться каждый день. ПериодПовтораВТечениеДня задаётся в секундах, ВремяНачала и ВремяКонца — датой, у которой значимо только время.
  • КоличествоПовторовПриАварийномЗавершении и ИнтервалПовтораПриАварийномЗавершении — если процедура упала с исключением, платформа повторит запуск через заданное число секунд, не дожидаясь следующего окна расписания.

Что ещё умеет расписание

Свойство РасписаниеРегламентногоЗаданияЧто задаёт
ПериодПовтораДнейКаждые N дней; 1 — ежедневно
ПериодПовтораВТечениеДняПовтор внутри дня, в секундах
ПаузаПовтораПауза в секундах от завершения запуска до следующего старта
ВремяНачала, ВремяКонцаОкно внутри суток
ДниНеделиМассив номеров дней: 1 — понедельник, 7 — воскресенье
Месяцы, ДеньВМесяцеЗапуск в определённые месяцы и числа
ДетальныеРасписанияДняНесколько окон в сутки, каждое со своими настройками

Чтобы выгрузка шла только по будням, заполните ДниНедели числами от 1 до 5. Текстовое описание расписания для формы даёт Строка(Задание.Расписание).

Предопределённое задание: включить и сменить расписание

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

// Включает или выключает предопределённое задание ОчисткаЖурналаОбмена
// и ставит ежедневный запуск на 3:00.
Процедура НастроитьОчисткуЖурнала(Включить) Экспорт

	УстановитьПривилегированныйРежим(Истина);

	Задание = РегламентныеЗадания.НайтиПредопределенное(
		Метаданные.РегламентныеЗадания.ОчисткаЖурналаОбмена);
	Если Задание = Неопределено Тогда
		Возврат;
	КонецЕсли;

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

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

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

Если одному действию понадобились разные входные данные, делайте задание непредопределённым.

Запуск вручную и статус последнего запуска

Метода «выполнить сейчас» у регламентного задания нет. Каждый запуск по расписанию — это фоновое задание, поэтому для ручного запуска берём имя метода и параметры экземпляра и запускаем его сами:

// Запускает задание вне расписания отдельным фоновым заданием.
Функция ЗапуститьСейчас(ИдентификаторЗадания) Экспорт

	УстановитьПривилегированныйРежим(Истина);

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

	// Запуск по расписанию ещё идёт: второй экземпляр не стартуем.
	Последнее = Задание.ПоследнееЗадание;
	Если Последнее <> Неопределено
		И Последнее.Состояние = СостояниеФоновогоЗадания.Активно Тогда
		ВызватьИсключение "Задание уже выполняется по расписанию, старт в "
			+ Формат(Последнее.Начало, "ДФ=HH:mm");
	КонецЕсли;

	// Ключ заполнен всегда, даже у предопределённого задания с пустым свойством Ключ.
	КлючФоновогоЗадания = Строка(Задание.УникальныйИдентификатор);

	Фоновое = ФоновыеЗадания.Выполнить(Задание.Метаданные.ИмяМетода, Задание.Параметры,
		КлючФоновогоЗадания, Задание.Наименование + " (вручную)");

	Возврат Фоновое.УникальныйИдентификатор;

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

// Строка о последнем запуске по расписанию — для формы настроек.
Функция ОписаниеПоследнегоЗапуска(ИдентификаторЗадания) Экспорт

	УстановитьПривилегированныйРежим(Истина);

	Задание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания);
	Если Задание = Неопределено Тогда
		Возврат "Задание не найдено";
	КонецЕсли;

	Последнее = Задание.ПоследнееЗадание;
	Если Последнее = Неопределено Тогда
		Возврат "Сведений о запусках нет";
	КонецЕсли;

	Текст = Формат(Последнее.Начало, "ДФ='dd.MM.yyyy HH:mm'") + " — " + Строка(Последнее.Состояние);
	Если Последнее.ИнформацияОбОшибке <> Неопределено Тогда
		Текст = Текст + Символы.ПС + КраткоеПредставлениеОшибки(Последнее.ИнформацияОбОшибке);
	КонецЕсли;

	Возврат Текст;

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

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

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

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

То же через БСП: РегламентныеЗаданияСервер

В типовых конфигурациях на БСП (УТ 11, БП 3.0, КА 2, ERP, УНФ) менеджер РегламентныеЗадания напрямую лучше не трогать. Подсистема «Регламентные задания» даёт программный интерфейс в общем модуле РегламентныеЗаданияСервер: НайтиЗадания, Задание, ДобавитьЗадание, ИзменитьЗадание, УдалитьЗадание, УстановитьИспользованиеРегламентногоЗадания. Те же вызовы работают и в модели сервиса, где вместо регламентных заданий платформы — очередь заданий. Пример для БСП 3.x и локальной базы:

// Только для конфигураций на БСП 3.x, локальная (не облачная) база.
// КлючЗадания и РасписаниеСИнтервалом — из того же общего модуля.
Процедура НастроитьЗаданиеСкладаБСП(Склад, ИнтервалМинут, Включить = Истина) Экспорт

	МетаданныеЗадания = Метаданные.РегламентныеЗадания.ВыгрузкаОстатковПоСкладу;

	// Если настройку меняет пользователь без административных прав.
	УстановитьПривилегированныйРежим(Истина);

	Отбор = Новый Структура;
	Отбор.Вставить("Метаданные", МетаданныеЗадания);
	Отбор.Вставить("Ключ", КлючЗадания(Склад));
	Найденные = РегламентныеЗаданияСервер.НайтиЗадания(Отбор);

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

	Настройки = Новый Структура;
	Настройки.Вставить("Использование", Включить);
	Настройки.Вставить("Расписание", РасписаниеСИнтервалом(ИнтервалМинут));
	Настройки.Вставить("Параметры", ПараметрыМетода);

	Если Найденные.Количество() = 0 Тогда
		Настройки.Вставить("Метаданные", МетаданныеЗадания);
		Настройки.Вставить("Ключ", КлючЗадания(Склад));
		Настройки.Вставить("Наименование", "Выгрузка остатков: " + Строка(Склад));
		РегламентныеЗаданияСервер.ДобавитьЗадание(Настройки);
	Иначе
		РегламентныеЗаданияСервер.ИзменитьЗадание(Найденные[0].УникальныйИдентификатор, Настройки);
	КонецЕсли;

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

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

Где и от чьего имени выполняется задание

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

Файловая база. Отдельного планировщика нет: задания выполняет одно из запущенных приложений (автоматически — начиная с версии 8.3.3), очередь проверяется раз в минуту. Никто не открыл базу — задания не выполняются. Управляет этим параметр запуска /AllowExecuteScheduledJobs с ключом -Off (не выполнять) или -Force (выполнять обязательно).

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

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

  • Задание создано, но не запускается. Проверьте по порядку: Использование = Истина; расписание не пустое и заполнен ПериодПовтораДней; в консоли кластера не включена блокировка регламентных заданий; в файловой базе кто-то работает. В БСП-конфигурациях после копирования базы задания, работающие с внешними ресурсами, могут быть заблокированы до решения администратора.
  • «Слишком много фактических параметров» или «Недостаточно фактических параметров». В массиве Параметры больше элементов, чем параметров у процедуры, или не хватает значений для обязательных. Типичный случай: в процедуру добавили обязательный параметр, а старые экземпляры остались с прежним массивом. Ошибка видна в журнале регистрации и в ПоследнееЗадание.ИнформацияОбОшибке. Новые параметры делайте необязательными, со значением по умолчанию.
  • «Переменная не определена (РегламентныеЗадания)». Менеджер вызван в клиентской процедуре формы, а он есть только на сервере. Перенесите вызов в &НаСервере или серверный общий модуль.
  • «Нарушение прав доступа!» при записи задания пользователем без права «Администрирование». Решается привилегированным режимом в серверной функции, как в примере.
  • Десятки одинаковых заданий. Код создаёт задание при каждом сохранении настроек, не поискав его по Метаданные + Ключ. Добавьте поиск, лишние экземпляры удалите.
  • Задание работает без перерыва. Выгрузка идёт 20 минут при интервале 5 минут: новый запуск ждёт окончания предыдущего, и задание крутится без остановки. Увеличьте интервал, ускорьте обработку или задайте Расписание.ПаузаПовтора, например 300 секунд, чтобы между запусками был перерыв.

Частые вопросы

Как отладить регламентное задание?

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

Как дать пользователю настроить расписание в форме?

На клиенте есть стандартный диалог ДиалогРасписанияРегламентногоЗадания. Откройте его методом Показать() с описанием оповещения, а полученное расписание запишите в задание серверной процедурой, как в примерах выше.

Можно ли запускать задание каждые 10 секунд?

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

Где посмотреть, почему задание завершилось с ошибкой?

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

Когда проще заказать

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

По теме

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.


1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.