К статье
Практический материал

Разработка и Конфигурация · 13 мин

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

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

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

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

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

Когда задание стоит делать в расширении, а когда — в конфигурации

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

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

Сравнение вариантов

Расширение конфигурации

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

Изменение основной конфигурации

Подходит для снятых с поддержки и самописных конфигураций; полный доступ к коду; минус — усложняется обновление типовых релизов.

Внешняя обработка + планировщик ОС

Запасной вариант для файловых баз без постоянного сеанса; требует настройки Windows Task Scheduler и хранения паролей вне 1С.

Подготовка: общий модуль с обработчиком задания

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

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

Пример обработчика:

// Общий модуль Расш1_РегламентныеОперации

#Область ПрограммныйИнтерфейс

Процедура Расш1_ОчисткаУстаревшихДанных() Экспорт

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ ПЕРВЫЕ 1000

| Журнал.Ссылка КАК Ссылка

|ИЗ

| Справочник.Расш1_ЖурналОбмена КАК Журнал

|ГДЕ

| Журнал.ДатаСоздания < &Граница";

Запрос.УстановитьПараметр("Граница", ДобавитьМесяц(ТекущаяДатаСеанса(), -3));

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

Объект = Выборка.Ссылка.ПолучитьОбъект();

Объект.Удалить();

КонецЦикла;

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

#КонецОбласти

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

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

В дереве метаданных расширения перейдите в ветку «Общие» → «Регламентные задания» и добавьте новый объект. Заполните ключевые свойства: «Имя» (латиницей, например Расш1_ОчисткаУстаревшихДанных), «Имя метода» — полное имя процедуры в формате Расш1_РегламентныеОперации.Расш1_ОчисткаУстаревшихДанных, «Наименование» — понятное пользователю название, которое будет видно в консоли заданий.

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

Свойство «Количество повторов при аварийном завершении» и «Интервал повтора при аварийном завершении» определяют поведение при сбое. Для некритичных задач разумно 2–3 повтора с паузой в несколько минут; для задач, где повторный запуск опасен (например, отправка писем), повторы лучше отключить.

Порядок действий
  1. 1
    Создайте в расширении общий серверный модуль с экспортной процедурой без параметров
  2. 2
    Добавьте объект «Регламентное задание» и укажите имя метода в формате ИмяМодуля.ИмяПроцедуры
  3. 3
    Задайте расписание или оставьте его настройку администратору через консоль заданий
  4. 4
    Проверьте синтаксис модуля и обновите конфигурацию базы данных расширения
  5. 5
    Опубликуйте расширение в режиме Предприятия и включите задание
  6. 6
    Контролируйте первые запуски через журнал регистрации или консоль заданий

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

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

Для тяжёлых задач выбирайте ночные часы с низкой активностью пользователей и учитывайте время других заданий: одновременный запуск нескольких ресурсоёмких процедур приведёт к конкуренции за блокировки и росту времени выполнения всех задач. Минимальный осмысленный интервал — минута; слишком частые задания (каждые несколько секунд) планировщик не гарантирует.

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

Публикация расширения и проверка выполнения

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

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

Контрольные точки

Как проверить результат

Задание в списке регламентных заданий
Норма

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

Тревожный признак

Задание отсутствует — расширение не опубликовано или отключено

Журнал регистрации после запуска
Норма

Есть событие о начале и успешном завершении метода

Тревожный признак

Ошибка «Метод не обнаружен» или исключение в тексте обработчика

Результат работы в данных
Норма

Целевые объекты изменены/созданы согласно логике обработчика

Тревожный признак

Данные не изменились — метод отработал, но условия отбора пусты или нет прав

Типичные ошибки и их устранение

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

В файловых базах регламентные задания выполняются только когда запущен сеанс, у которого включено выполнение фоновых заданий (например, отдельный сеанс с параметром запуска /ExecuteScheduledJobs или работа пользователя, если не применяется отдельный механизм). Если задание «молчит» в файловой базе — проверьте, есть ли активный сеанс-планировщик.

Ещё одна ловушка — взаимоблокировки и длительные транзакции. Обработчик, обрабатывающий тысячи объектов одной транзакцией, блокирует таблицы надолго. Разбивайте работу на порции (как в примере с «ПЕРВЫЕ 1000») и фиксируйте транзакции чаще.

Типичные ошибки
01
Процедура без ключевого слова Экспорт — планировщик не находит метод, в журнале регистрации ошибка вызова
02
Общий модуль без флажка «Сервер» — задание падает при старте, так как контекст выполнения серверный
03
Обработка всех данных одной транзакцией — блокировки таблиц и конфликты с работой пользователей
04
Отсутствие обработки исключений — сбой задания остаётся незамеченным до жалоб пользователей
05
Включённое задание сразу после публикации на рабочей базе — неконтролируемый запуск до проверки расписания

Программное управление заданием из кода

После публикации заданием можно управлять программно через объект РегламентныеЗадания. Поиск выполняется по имени метаданных с учётом префикса расширения:

ПараметрыОтбора = Новый Структура;

ПараметрыОтбора.Вставить("Метаданные",

Метаданные.РегламентныеЗадания.РасширенияКонфигурации); // см. ниже

// Надёжнее искать по имени задания

Задания = РегламентныеЗадания.ПолучитьРегламентныеЗадания();

Для Каждого Задание Из Задания Цикл

Если СтрНайти(Задание.Метаданные.Имя, "Расш1_ОчисткаУстаревшихДанных") > 0 Тогда

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

Задание.Записать();

КонецЕсли;

КонецЦикла;

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

Ограничения механизма и альтернативы

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

Учитывайте, что при отключении расширения задание исчезает из базы вместе с историей настроек расписания. Если расписание тонко настраивал администратор, перед обновлением расширения зафиксируйте текущие параметры. Также помните, что в безопасном режиме расширения доступ к файловой системе, COM-объектам и внешним компонентам из обработчика будет запрещён.

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

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

Можно ли задать параметры обработчику регламентного задания?

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

Почему задание не выполняется в файловой базе?

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

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

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

Как запустить задание немедленно, не дожидаясь расписания?

В консоли регламентных заданий типовой конфигурации есть команда ручного запуска. Программно можно выполнить ту же процедуру через ФоновыеЗадания.Выполнить с указанием полного имени метода — это удобно для отладки из внешней обработки.

Можно ли из расширения отключить типовое регламентное задание?

Изменить объект метаданных конфигурации расширение не может, но отключить задание можно программно: найдите его через РегламентныеЗадания.ПолучитьРегламентныеЗадания() и установите Использование = Ложь. Настройка сохранится в базе и переживёт обновления.

От чьего имени выполняется задание и как это влияет на права?

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

Итог

Что важно запомнить

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