Своё фоновое расписание без правки типовой: регламентное задание в расширении конфигурации

· 10 мин

Содержание

Чтобы настроить регламентное задание в расширении 1С, откройте расширение в Конфигураторе, добавьте в ветку Общие → Регламентные задания новый объект, а в свойстве «Имя метода» укажите экспортную процедуру из серверного общего модуля этого же расширения. Затем задайте расписание, включите флажок «Использование» и обновите конфигурацию базы данных. Типовую конфигурацию при этом не снимают с поддержки.

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

Как устроено регламентное задание и зачем выносить его в расширение

Регламентное задание — это объект метаданных, который говорит платформе: «вызывай вот эту процедуру по вот такому расписанию». Сам объект кода не содержит. У него нет модуля объекта, как у справочника или документа. Вся логика живёт в процедуре общего модуля, а объект только хранит ссылку на неё и настройки запуска.

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

Почему расширение, а не правка типовой:

  • 🧩 конфигурация остаётся на поддержке, обновления ставятся без сравнения-объединения;
  • 🔁 доработку можно отключить одним флажком, не трогая основную конфигурацию;
  • 📦 одно и то же расширение переносится между базами файлом .cfe;
  • 🛠 через расширение можно не только добавить своё задание, но и изменить поведение типового — перехватить его процедуру.

Свои регламентные задания в расширениях поддерживаются в актуальных версиях платформы 8.3. Если в вашей сборке ветки Регламентные задания в дереве расширения нет, обновите платформу — сами расширения появились в 8.3.6, а набор объектов, которые можно добавлять, с тех пор заметно вырос.

Шаг 1. Создаём регламентное задание в дереве расширения

Подготовка расширения

  1. Откройте базу в Конфигураторе.
  2. Меню Конфигурация → Расширения конфигурации.
  3. Если расширения ещё нет — кнопка «Добавить». Задайте имя (например, МоиРегламенты) и префикс имён, допустим мр_.
  4. Двойным щелчком откройте дерево расширения.

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

Добавление объекта

  1. В дереве расширения раскройте Общие → Регламентные задания.
  2. Нажмите «Добавить» (или Ins).
  3. Имя: мр_ВыгрузкаОстатков, синоним — «Выгрузка остатков на сайт».

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

Свойства объекта

СвойствоЧто задаётРекомендация
Имя методаПроцедура, которую вызовет платформаВыбирается из серверных общих модулей
КлючСтрока для различения экземпляровОбычно пусто
ИспользованиеВключено ли заданиеВключите после отладки
ПредопределенноеСоздаётся ли экземпляр автоматическиДа, если нужен ровно один запуск по расписанию
Количество повторов при аварийном завершенииСколько раз перезапустить после ошибки1–3 для обменов, 0 для тяжёлых расчётов
Интервал повтора при аварийном завершенииПауза перед повтором, в секундах60–300
РасписаниеКогда запускатьСм. шаг 3

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

Шаг 2. Где писать код задания: общий модуль расширения

Здесь чаще всего путаются те, кто ищет у задания «модуль объекта». Его нет. Код пишут в общем модуле.

Создание общего модуля

  1. В дереве расширения: Общие → Общие модули → Добавить.
  2. Имя: мр_РегламентныеЗадания.
  3. Флажки: «Сервер» — включён; «Клиент (управляемое приложение)», «Внешнее соединение», «Вызов сервера», «Глобальный» — выключены.

Флажок «Вызов сервера» здесь не нужен: задание и так стартует на сервере, а лишняя доступность с клиента — это лишняя поверхность для ошибок.

Процедура-обработчик

Процедура должна быть экспортной и без параметров (если параметры не передаются через свойство «Параметры» экземпляра):

Процедура ВыгрузкаОстатков() Экспорт

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

	ИмяСобытия = "МоиРегламенты.ВыгрузкаОстатков";
	ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Информация, , ,
		"Старт выгрузки");

	Попытка
		Запрос = Новый Запрос;
		Запрос.Текст =
		"ВЫБРАТЬ
		|	КОЛИЧЕСТВО(*) КАК Количество
		|ИЗ
		|	Справочник.Номенклатура КАК Номенклатура
		|ГДЕ
		|	НЕ Номенклатура.ПометкаУдаления";
		Выборка = Запрос.Выполнить().Выбрать();
		Выборка.Следующий();

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

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

Что важно в этом шаблоне:

  • 📌 вызов ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания нужен в типовых конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11). Он проверяет, можно ли сейчас выполнять задание, — например, не идёт ли обновление базы. В самописной конфигурации без БСП строку уберите;
  • 📌 своё имя события в журнале регистрации позволит потом отфильтровать записи за секунды;
  • 📌 ВызватьИсключение в блоке Исключение возвращает ошибку платформе. Без него задание будет числиться успешным, и механизм повторов не сработает.

Указываем метод в свойствах

Вернитесь в свойства регламентного задания и нажмите кнопку выбора у поля «Имя метода». В списке появятся только экспортные процедуры серверных общих модулей. Выберите мр_РегламентныеЗадания.ВыгрузкаОстатков.

Если нужной процедуры в списке нет — значит, у модуля не стоит флажок «Сервер» или процедура не помечена Экспорт.

Шаг 3. Расписание и параметры запуска регламентного задания

Расписание в Конфигураторе

В свойствах задания откройте «Расписание». Форма разбита на вкладки: общие настройки, дневное, недельное, месячное расписание. Типичные варианты:

ЗадачаКак настроить
Раз в сутки ночьюПовторять каждые 1 день, время начала 02:00
Каждые 10 минут в рабочее времяПовторять каждые 1 день, в течение дня каждые 600 секунд, с 08:00 до 20:00
По буднямНедельное расписание: отметить пн–пт
Первого числа месяцаМесячное расписание: день месяца 1

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

Расписание в пользовательском режиме

В Бухгалтерии 3.0, ЗУП 3.1 и УТ 11 список заданий открывается так: Администрирование → Обслуживание → Регламентные операции → Регламентные и фоновые задания. Там же есть кнопка «Выполнить сейчас», журнал запусков и редактор расписания. Задание из расширения появится в этом списке под синонимом, который вы задали.

Расписание кодом

Для непредопределённого задания экземпляр создают программно. Например, при первом запуске расширения или из служебной обработки:

Процедура СоздатьЗаданиеВыгрузки() Экспорт

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

	Расписание = Новый РасписаниеРегламентногоЗадания;
	Расписание.ПериодПовтораДней = 1;
	Расписание.ПериодПовтораВТечениеДня = 600;
	Расписание.ВремяНачала = Дата(1, 1, 1, 8, 0, 0);
	Расписание.ВремяКонца = Дата(1, 1, 1, 20, 0, 0);

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

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

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

Шаг 4. Подключение расширения: без этого задание не стартует

После правок сохраните расширение и выполните Конфигурация → Обновить конфигурацию базы данных (F7) в окне расширения. Дальше три вещи, которые проверяют реже всего.

1. Безопасный режим. По умолчанию расширение подключается в безопасном режиме. В нём код не может работать с файлами, COM-объектами, внешними компонентами и рядом сетевых возможностей. Если задание пишет файл или ходит во внешний сервис, его ждёт ошибка. Снять флажок можно в Конфигураторе в списке расширений (свойство «Безопасный режим») или в пользовательском режиме: Администрирование → Печатные формы, отчеты и обработки → Расширения.

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

2. Активность и область действия. Расширение должно быть активным. Задание работает в фоновом сеансе без пользователя, поэтому расширение должно применяться ко всей информационной базе, а не только к отдельному сеансу.

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

Перед первым запуском
Выполнено: 0 / 6

Шаг 5. Отладка и контроль выполнения

Запуск вручную без ожидания расписания

Ждать десять минут ради каждой проверки неудобно. Варианты:

  • ▶️ кнопка «Выполнить сейчас» в форме «Регламентные и фоновые задания» (конфигурации на БСП);
  • ▶️ фоновое задание из внешней обработки, серверная процедура:
ФоновыеЗадания.Выполнить("мр_РегламентныеЗадания.ВыгрузкаОстатков", , ,
	"Ручной запуск выгрузки");
  • ▶️ прямой вызов процедуры из той же обработки. Так код выполнится в сеансе пользователя, с его правами, — удобно для поиска логических ошибок, но не покажет проблем с правами и безопасным режимом.

Отладчик в фоновом задании

Точки останова в процедуре задания по умолчанию не срабатывают: фоновый сеанс к отладчику сам не подключается. В Конфигураторе откройте Отладка → Подключение, далее «Автоматическое подключение», и отметьте фоновые задания. После этого запускайте отладку, а задание — вручную.

Для клиент-серверной базы сервер 1С должен быть запущен с разрешённой отладкой (ключ -debug в параметрах службы агента). Если ключа нет, его добавляют в параметры службы и перезапускают её.

Перезапуск службы агента сервера 1С обрывает все сеансы пользователей. Делайте это в нерабочее время или на тестовом сервере.

Журнал регистрации

Администрирование → Обслуживание → Журнал регистрации (или Администрирование → Журнал регистрации в Конфигураторе). Отбор по событию — тому имени, что вы задали в ЗаписьЖурналаРегистрации. Так видно время каждого старта, количество обработанных записей и полный текст ошибки.

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

Как через расширение изменить типовое регламентное задание

Иногда своё задание не нужно, а нужно поправить поведение типового. Например, добавить действие после стандартной загрузки курсов валют.

Порядок:

  1. Найдите в основной конфигурации регламентное задание и посмотрите его «Имя метода» — там модуль и процедура.
  2. Заимствуйте этот общий модуль в расширение (правый щелчок → «Добавить в расширение»).
  3. В модуле расширения создайте процедуру с аннотацией:
&После("ЗагрузкаКурсовВалют")
Процедура мр_ЗагрузкаКурсовВалютПосле()
	// Ваши действия после типовой загрузки
КонецПроцедуры

Имя в аннотации должно совпадать с именем процедуры основной конфигурации. Пример выше условный: точное имя возьмите из свойства «Имя метода» вашего типового задания.

АннотацияКогда срабатываетРиск при обновлении
&ПередДо типовой процедурыНизкий
&ПослеПосле типовой процедурыНизкий
&ВместоПолностью заменяет типовуюВысокий: исправления 1С не попадут в работу
&ИзменениеИКонтрольПравка отдельных строк типового кодаСредний: при изменении процедуры в релизе расширение не применится, пока не поправите

Расписание типового задания через расширение менять не нужно — для этого есть форма «Регламентные и фоновые задания».

Почему регламентное задание из расширения не запускается

Диагностика: выберите симптом

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

Можно ли передать параметры в процедуру регламентного задания?
Да. У экземпляра задания есть свойство «Параметры» — массив значений. Процедура в модуле тогда объявляется с соответствующим числом параметров. Удобно для непредопределённых заданий: один шаблон, разные экземпляры с разными параметрами.
От имени какого пользователя выполняется задание?
Если у экземпляра указано имя пользователя, задание работает с его правами. Если не указано — от имени пользователя без ограничений. Для заданий, которые пишут данные, лучше завести отдельного служебного пользователя.
Что будет с заданиями, если отключить расширение?
Предопределённые задания из расширения перестанут выполняться: платформа не найдёт ни объекта, ни метода. После повторного включения расширения они снова заработают.
Запустится ли пропущенное задание, если сервер был выключен?
Нет, догоняющего запуска не будет. Задание стартует в ближайший момент по расписанию после включения сервера. Если пропуск критичен, проверяйте дату последней успешной выгрузки внутри процедуры.
Могут ли два экземпляра одного задания выполняться одновременно?
Платформа не запускает новый экземпляр того же регламентного задания, пока не завершился предыдущий. Если процедура дольше интервала, часть запусков просто пропускается.