Разработка и Конфигурация · 13 мин
Как создать регламентное задание в расширении 1С
Как добавить регламентное задание через расширение 1С, не меняя конфигурацию: создание объекта, обработчик, расписание, типичные ошибки и проверка работы.
Регламентные задания — штатный механизм платформы 1С:Предприятие для автоматического выполнения процедур по расписанию. Когда конфигурация находится на поддержке или изменять её нельзя по условиям сопровождения, задание добавляют через расширение. Это позволяет запускать обмены, пересчёты, очистку данных и рассылки без снятия конфигурации с поддержки и без риска потерять доработку при обновлении.
Механика проста: в расширении создаётся собственный объект метаданных «Регламентное задание», ему назначается обработчик — экспортная процедура в общем модуле расширения — и задаётся расписание. После публикации расширения задание появляется в списке регламентных заданий информационной базы и выполняется планировщиком наравне со штатными.
Ограничения тоже есть: обработчик должен быть серверной процедурой без параметров, расширение должно иметь профиль безопасности, допускающий выполнение кода, а в файловой базе задания выполняются только при запущенном сеансе с отдельным фоновым процессом. Ниже разобран полный цикл — от создания объекта до проверки выполнения и исправления типичных ошибок.
Когда задание стоит делать в расширении, а когда — в конфигурации
Расширение оправдано, если конфигурация типовая и находится на полной поддержке: любое прямое изменение потребует включения возможности изменения и усложнит обновления. Вторая ситуация — доработка, которую нужно быстро отключить: расширение снимается без последствий, и задание перестаёт существовать в базе. Третий случай — поставка функциональности нескольким клиентам, где расширение выступает единым пакетом доработок.
Прямое изменение конфигурации разумно, когда база уже давно снята с поддержки, доработки массовые и тесно переплетены с типовой логикой, а также когда задание должно использовать приватные методы конфигурации, недоступные из расширения. В самописных конфигурациях отдельное расширение чаще всего не нужно вовсе.
Сравнение вариантов
Подходит для типовых конфигураций на поддержке; легко отключается; ограничение — обработчик только в общем модуле расширения, нет доступа к приватным методам конфигурации.
Подходит для снятых с поддержки и самописных конфигураций; полный доступ к коду; минус — усложняется обновление типовых релизов.
Запасной вариант для файловых баз без постоянного сеанса; требует настройки Windows Task Scheduler и хранения паролей вне 1С.
Подготовка: общий модуль с обработчиком задания
Обработчик регламентного задания — это экспортная процедура без параметров, расположенная в общем модуле. В дереве конфигурации расширения добавьте новый общий модуль, например Расш1_РегламентныеОперации. В свойствах модуля установите флажки «Сервер» и «Вызов сервера», снимите «Клиент (обычное приложение)» и «Клиент (управляемое приложение)» — обработчик исполняется только на сервере.
Если задание должно выполняться в привилегированном режиме (обход прав доступа), включите флажок «Привилегированный режим» либо используйте УстановитьПривилегированныйРежим(Истина) внутри процедуры. Первый вариант проще, но снижает контроль: весь код модуля будет работать без проверки прав.
Пример обработчика:
// Общий модуль Расш1_РегламентныеОперации
#Область ПрограммныйИнтерфейс
Процедура Расш1_ОчисткаУстаревшихДанных() Экспорт
УстановитьПривилегированныйРежим(Истина);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1000
| Журнал.Ссылка КАК Ссылка
|ИЗ
| Справочник.Расш1_ЖурналОбмена КАК Журнал
|ГДЕ
| Журнал.ДатаСоздания < &Граница";
Запрос.УстановитьПараметр("Граница", ДобавитьМесяц(ТекущаяДатаСеанса(), -3));
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Объект = Выборка.Ссылка.ПолучитьОбъект();
Объект.Удалить();
КонецЦикла;
КонецПроцедуры
#КонецОбласти
Обратите внимание на префикс в имени процедуры: он снижает риск коллизий при заимствовании объектов и упрощает поиск своих доработок. Обработку ошибок внутри процедуры делайте через Попытка...Исключение с записью в журнал регистрации — иначе диагностика сбоев превратится в гадание.
Создание регламентного задания в расширении
В дереве метаданных расширения перейдите в ветку «Общие» → «Регламентные задания» и добавьте новый объект. Заполните ключевые свойства: «Имя» (латиницей, например Расш1_ОчисткаУстаревшихДанных), «Имя метода» — полное имя процедуры в формате Расш1_РегламентныеОперации.Расш1_ОчисткаУстаревшихДанных, «Наименование» — понятное пользователю название, которое будет видно в консоли заданий.
Свойство «Использование» определяет, активно ли задание по умолчанию. Если оставить его включённым, задание начнёт выполняться сразу после публикации расширения — не всегда желательно на рабочей базе. Практичнее создать задание выключенным и включить его через консоль после проверки расписания и прав.
Свойство «Количество повторов при аварийном завершении» и «Интервал повтора при аварийном завершении» определяют поведение при сбое. Для некритичных задач разумно 2–3 повтора с паузой в несколько минут; для задач, где повторный запуск опасен (например, отправка писем), повторы лучше отключить.
- 1Создайте в расширении общий серверный модуль с экспортной процедурой без параметров
- 2Добавьте объект «Регламентное задание» и укажите имя метода в формате ИмяМодуля.ИмяПроцедуры
- 3Задайте расписание или оставьте его настройку администратору через консоль заданий
- 4Проверьте синтаксис модуля и обновите конфигурацию базы данных расширения
- 5Опубликуйте расширение в режиме Предприятия и включите задание
- 6Контролируйте первые запуски через журнал регистрации или консоль заданий
Настройка расписания
Расписание задаётся в свойстве «Расписание» объекта либо программно/интерактивно уже в базе через стандартную консоль регламентных заданий (в типовых конфигурациях на БСП — «Администрирование» → «Обслуживание» → «Регламентные операции»). В конфигураторе доступны периодичности: ежедневно, еженедельно, ежемесячно, по произвольному cron-подобному шаблону.
Для тяжёлых задач выбирайте ночные часы с низкой активностью пользователей и учитывайте время других заданий: одновременный запуск нескольких ресурсоёмких процедур приведёт к конкуренции за блокировки и росту времени выполнения всех задач. Минимальный осмысленный интервал — минута; слишком частые задания (каждые несколько секунд) планировщик не гарантирует.
В клиент-серверном варианте расписание хранится в базе и может быть изменено администратором без конфигуратора. Это значит, что зашитое в расширение расписание — лишь начальное значение, и в код не стоит закладывать логику, зависящую от точного времени запуска.
Публикация расширения и проверка выполнения
После обновления конфигурации базы данных подключите расширение в режиме Предприятия: «Все функции» → «Стандартные» → «Управление расширениями конфигурации» (в типовых — «Администрирование» → «Печатные формы, отчеты и обработки» → «Расширения»). Убедитесь, что у расширения снят флажок «Безопасный режим», если обработчику требуются операции, ограниченные безопасным режимом, либо явно настройте профиль безопасности.
Откройте список регламентных заданий и убедитесь, что новое задание присутствует, включено и имеет корректное расписание. Для мгновенной проверки запустите задание вручную из консоли — не дожидаясь срабатывания расписания. Затем проверьте журнал регистрации: отфильтруйте события по имени задания и убедитесь в отсутствии ошибок.
Как проверить результат
Задание видно, включено, расписание корректно
Задание отсутствует — расширение не опубликовано или отключено
Есть событие о начале и успешном завершении метода
Ошибка «Метод не обнаружен» или исключение в тексте обработчика
Целевые объекты изменены/созданы согласно логике обработчика
Данные не изменились — метод отработал, но условия отбора пусты или нет прав
Типичные ошибки и их устранение
Самая частая проблема — ошибка «Метод не обнаружен». Причины: процедура не объявлена с ключевым словом Экспорт, неверно указано имя метода (пропущено имя модуля или опечатка), модуль не является серверным. Вторая по частоте ситуация — задание «выполняется», но ничего не делает: обычно это пустая выборка из-за неверных условий запроса или отсутствие прав у пользователя, от имени которого стартует задание.
В файловых базах регламентные задания выполняются только когда запущен сеанс, у которого включено выполнение фоновых заданий (например, отдельный сеанс с параметром запуска /ExecuteScheduledJobs или работа пользователя, если не применяется отдельный механизм). Если задание «молчит» в файловой базе — проверьте, есть ли активный сеанс-планировщик.
Ещё одна ловушка — взаимоблокировки и длительные транзакции. Обработчик, обрабатывающий тысячи объектов одной транзакцией, блокирует таблицы надолго. Разбивайте работу на порции (как в примере с «ПЕРВЫЕ 1000») и фиксируйте транзакции чаще.
Программное управление заданием из кода
После публикации заданием можно управлять программно через объект РегламентныеЗадания. Поиск выполняется по имени метаданных с учётом префикса расширения:
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Метаданные",
Метаданные.РегламентныеЗадания.РасширенияКонфигурации); // см. ниже
// Надёжнее искать по имени задания
Задания = РегламентныеЗадания.ПолучитьРегламентныеЗадания();
Для Каждого Задание Из Задания Цикл
Если СтрНайти(Задание.Метаданные.Имя, "Расш1_ОчисткаУстаревшихДанных") > 0 Тогда
Задание.Использование = Истина;
Задание.Записать();
КонецЕсли;
КонецЦикла;
Такой подход позволяет включать задание при первом запуске обработчика настройки расширения, менять расписание из формы настроек и диагностировать состояние. Для однократного запуска вне расписания используйте ФоновыеЗадания.Выполнить("Расш1_РегламентныеОперации.Расш1_ОчисткаУстаревшихДанных").
Ограничения механизма и альтернативы
Расширение не может изменить существующее регламентное задание конфигурации — только добавить своё. Если нужно подменить логику типового задания, варианты такие: отключить типовое задание через консоль (настройка хранится в базе и переживёт обновления) и создать в расширении собственное с нужной логикой, либо вызывать типовой метод из своего обработчика до/после дополнительных действий.
Учитывайте, что при отключении расширения задание исчезает из базы вместе с историей настроек расписания. Если расписание тонко настраивал администратор, перед обновлением расширения зафиксируйте текущие параметры. Также помните, что в безопасном режиме расширения доступ к файловой системе, COM-объектам и внешним компонентам из обработчика будет запрещён.
Удобно добавить в расширение простую форму настроек, где администратор видит состояние задания, время последнего запуска и может изменить расписание, не открывая консоль заданий. Это снижает число обращений к разработчику и упрощает сопровождение.
Частые вопросы
Можно ли задать параметры обработчику регламентного задания?
Нет, платформа вызывает метод без параметров. Настройки храните в константах, справочнике настроек или хранилище общих настроек и читайте их внутри процедуры. Для разных режимов работы создайте несколько заданий, каждое со своей процедурой-обёрткой.
Почему задание не выполняется в файловой базе?
В файловом варианте нет постоянно работающего планировщика: задания исполняются только при активном сеансе, в котором разрешено выполнение фоновых заданий. Запустите отдельный сеанс с соответствующим параметром командной строки или учитывайте, что задания отработают при работе пользователей.
Что произойдёт с заданием при обновлении типовой конфигурации?
Задание из расширения не конфликтует с обновлением: расширение остаётся подключённым, если совместимо с новой версией. Проверяйте после обновления, что расширение активно и не отключено автоматически из-за нарушения контроля совместимости.
Как запустить задание немедленно, не дожидаясь расписания?
В консоли регламентных заданий типовой конфигурации есть команда ручного запуска. Программно можно выполнить ту же процедуру через ФоновыеЗадания.Выполнить с указанием полного имени метода — это удобно для отладки из внешней обработки.
Можно ли из расширения отключить типовое регламентное задание?
Изменить объект метаданных конфигурации расширение не может, но отключить задание можно программно: найдите его через РегламентныеЗадания.ПолучитьРегламентныеЗадания() и установите Использование = Ложь. Настройка сохранится в базе и переживёт обновления.
От чьего имени выполняется задание и как это влияет на права?
Задание выполняется от имени пользователя, указанного в его свойствах (по умолчанию — без пользователя, с ограниченными правами). Если обработчику не хватает прав, включите привилегированный режим в модуле или назначьте заданию пользователя с нужной ролью через консоль заданий.
Что важно запомнить
Регламентное задание в расширении — это собственный объект метаданных плюс экспортная серверная процедура без параметров в общем модуле. Создайте задание выключенным, протестируйте обработчик вручную на копии базы, затем включите и контролируйте первые запуски через журнал регистрации. Дробите длительные операции на порции и предусмотрите обработку ошибок.