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

· 10 мин

Содержание

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

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

Чем задание в расширении отличается от задания в конфигурации

Сам объект метаданных одинаковый. Отличия — в окружении, в котором живёт расширение.

  • 🔤 Префикс имени. Все новые объекты расширения получают префикс из свойства расширения «Префикс имён» (по умолчанию Расш1_). Задание будет называться, например, Расш1_ВыгрузкаОстатков, и в коде к нему обращаются Метаданные.РегламентныеЗадания.Расш1_ВыгрузкаОстатков.
  • 🛡️ Безопасный режим. Если расширение подключено с включённым безопасным режимом, код задания не сможет работать с файлами, COM-объектами, внешними компонентами и привилегированным режимом. Для задания, которое пишет файл на диск или ходит во внешнюю систему, это главный источник «молчаливых» сбоев.
  • 🔌 Зависимость от подключения. Задание существует, пока расширение подключено и активно. Отключили расширение — задание пропало из списка, и платформа его не запускает.
  • 📦 Жизненный цикл. Расширение переживает обновление типовой конфигурации. Но если в новом релизе изменился объект, который ваш код использует, задание упадёт уже при выполнении, а не при обновлении.

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

Что проверить до создания задания

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

Что проверитьГдеЗачем
Режим совместимости расширенияСвойства корня расширенияДолжен поддерживать добавление регламентных заданий
Безопасный режимКонфигурация → Расширения конфигурации, флажок у расширенияРешает, сможет ли код работать с файлами и внешними ресурсами
Тип базыФайловая или клиент-сервернаяВ файловой задания выполняются только при открытом сеансе
Блокировка регламентных заданийСвойства информационной базы в консоли кластераЕсли флажок стоит, ни одно задание не стартует
Наличие БСППодсистема СтандартныеПодсистемы в основной конфигурацииОпределяет, как пользователь будет управлять заданием

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

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

Добавление регламентного задания в расширение: пошагово

Шаг 1. Серверный общий модуль с методом

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

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

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

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

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

Функция ВыполнитьВыгрузку()
	// Ваша прикладная логика; возвращает число обработанных строк
	Возврат 0;
КонецФункции

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

Задание, созданное ниже, ещё не существует, когда вы пишете код. Поэтому сначала создайте объект задания (шаг 2), а потом сохраняйте модуль — иначе синтаксический контроль не найдёт Метаданные.РегламентныеЗадания.Расш1_ВыгрузкаОстатков.

Шаг 2. Объект регламентного задания

  1. В дереве расширения правой кнопкой по ветке Общие → Регламентные задания → «Добавить».
  2. Задайте имя (префикс подставится сам) и синоним — синоним пользователь увидит в списке заданий.
  3. В свойстве «Имя метода» нажмите кнопку выбора и укажите Расш1_РегламентныеЗадания.ВыгрузкаОстатков. В списке выбора показываются только экспортные процедуры серверных модулей.
  4. Включите «Предопределённое» — тогда экземпляр задания создастся в базе автоматически.
  5. Включите «Использование», если задание должно работать сразу после подключения. Для заданий, которые пользователь включает сам, оставьте флажок снятым.
  6. При необходимости заполните «Ключ»: два экземпляра с одинаковым ключом одновременно выполняться не будут.
  7. Задайте «Количество повторов при аварийном завершении» и «Интервал повтора при аварийном завершении» (в секундах). Для выгрузки во внешнюю систему разумно 3 повтора с интервалом 300 секунд.

Шаг 3. Расписание и применение к базе

  1. Откройте ссылку «Расписание» в палитре свойств и задайте расписание по умолчанию (форматы — в следующем разделе).
  2. Сохраните расширение: Конфигурация → Расширения конфигурации, выделите расширение → «Конфигурация» → «Обновить конфигурацию базы данных», либо F7 в окне расширения.
  3. Перезапустите сеансы 1С:Предприятия, которые должны увидеть задание.
Задание из расширения готово к работе
Выполнено: 0 / 7

Непредопределённое задание из кода

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

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

Параметры передаются в процедуру по порядку, поэтому для такого задания метод должен их принимать. У предопределённого задания параметров нет.

Расписания: какие бывают и как их записать

Расписание по умолчанию задают в окне «Расписание» с вкладками «Общие», «Дневное», «Недельное», «Месячное». То же можно сделать кодом через объект РасписаниеРегламентногоЗадания.

НужноНастройка в окнеСвойства в коде
Каждые 15 минут круглосуточноДневное: повторять каждые 900 секундПериодПовтораДней = 1, ПериодПовтораВТечениеДня = 900
Раз в сутки в 02:30Дневное: время начала 02:30ПериодПовтораДней = 1, ВремяНачала = '00010101023000'
По будням с 9 до 18 каждый часНедельное: пн–пт; дневное: 3600 с, с 09:00 до 18:00ДниНедели, ПериодПовтораВТечениеДня = 3600, ВремяНачала, ВремяКонца
1-го числа каждого месяцаМесячное: день месяца 1ДеньВМесяце = 1

Пример установки расписания «по будням каждый час с 9 до 18»:

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

ДниНедели = Новый Массив;
Для НомерДня = 1 По 5 Цикл
	ДниНедели.Добавить(НомерДня);
КонецЦикла;
Расписание.ДниНедели = ДниНедели;

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

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

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

Журнал регистрации: как фиксировать результат и сбои

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

  • 🏷️ Своё имя события с префиксом расширения, например Расш1. Выгрузка остатков. По нему удобно фильтровать журнал.
  • 📊 Уровень. Информация — для старта и итогов, Предупреждение — для пропущенных записей, Ошибка — для исключений.
  • 🧾 Полный текст ошибки — через ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), а не через ОписаниеОшибки(): в подробном представлении есть стек вызовов.
  • 🔁 Повторный вызов исключения. После записи в журнал вызывайте ВызватьИсключение. Иначе платформа сочтёт выполнение успешным и не включит механизм повторов при аварийном завершении.

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

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

Отладка и проверка задания

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

1. Проверка логики вызовом процедуры напрямую. Создайте внешнюю обработку или временную команду, которая на сервере вызывает Расш1_РегламентныеЗадания.ВыгрузкаОстатков(). Точки останова в модуле расширения срабатывают как обычно.

2. Запуск как фонового задания. Так код выполняется в том же окружении, что и при регламентном старте, — без клиентского контекста:

ФоновыеЗадания.Выполнить("Расш1_РегламентныеЗадания.ВыгрузкаОстатков", ,
	, "Тестовый запуск выгрузки");

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

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

Файловая база выполняет регламентные задания, только пока открыт хотя бы один сеанс 1С:Предприятия. Для постоянной работы можно держать отдельный сеанс, запущенный с ключом /AllowExecuteScheduledJobs -Force. Закрыли его — задания встали.

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

Эти сбои встречаются именно с заданиями в расширениях и не следуют напрямую из шагов выше.

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

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

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

Можно ли вызвать из задания расширения процедуру основной конфигурации?
Да. Код расширения видит общие модули основной конфигурации, поэтому из своего метода можно вызывать их экспортные процедуры. Само «Имя метода» лучше указывать на модуль расширения.
Что будет с заданием, если удалить расширение?
Объект метаданных исчезнет вместе с расширением, и платформа перестанет его запускать. Данные, которые задание успело записать в объекты основной конфигурации, останутся.
Как остановить задание, не отключая расширение?
Снимите флажок использования у экземпляра задания в форме регламентных заданий или кодом установите Использование = Ложь и запишите задание. Расширение и остальные его доработки продолжат работать.
Можно ли добавить задание в расширение для базы в 1С:Фреш?
В сервисе расширения подключаются по правилам самого сервиса, и не все возможности доступны. Перед разработкой уточните у провайдера, разрешены ли регламентные задания в пользовательских расширениях.
Почему расписание в форме отличается от того, что я задал в Конфигураторе?
Значение из Конфигуратора — только начальное. Как только расписание изменили в режиме 1С:Предприятия, оно хранится в базе и при повторном применении расширения не перезаписывается.