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

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

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

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

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

Добавить регламентное задание в расширение можно только в режиме «Изменение» или «Добавление»: если расширение подключено в режиме «Исправление», новые объекты метаданных создавать нельзя. Кроме того, код обработчика задания должен размещаться в общем модуле расширения с установленным флагом «Сервер», иначе платформа не сможет его выполнить.

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

Что нужно подготовить перед созданием задания

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

Второе условие — наличие общего модуля. Регламентное задание вызывает процедуру из общего модуля, поэтому заранее продумайте, где будет лежать код. Если в расширении уже есть серверный общий модуль, можно использовать его; если нет — создайте новый. Модуль должен иметь свойства «Сервер» = Истина и «Вызов сервера» = Истина, если планируется обращаться к нему ещё и из клиентского кода.

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

Создание общего модуля и процедуры обработчика

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

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

Процедура Расш1_ВыполнитьОбменДанными() Экспорт

ЗаписьЖурналаРегистрации("Расширение.ОбменДанными",

УровеньЖурналаРегистрации.Информация, , ,

"Запуск регламентного задания из расширения");

// Основная логика задания

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

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

Добавление объекта метаданных «Регламентное задание»

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

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

Расписание в конфигураторе задать нельзя — оно хранится в базе данных и настраивается уже после обновления конфигурации. Поэтому после добавления объекта выполните «Обновить конфигурацию базы данных» (F7) и убедитесь, что обновление прошло без ошибок. Если расширение добавлено в файловую базу, обновление выполняется сразу; в клиент-серверном варианте может потребоваться монопольный доступ или динамическое обновление, если изменения это позволяют.

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

Настройка расписания и активация задания

После обновления конфигурации задание появится в списке регламентных заданий базы, но с пустым расписанием оно выполняться не будет. В типовых конфигурациях на управляемом приложении расписание настраивается через раздел «Администрирование» → «Обслуживание» → «Регламентные и фоновые задания». Найдите своё задание по синониму, откройте его и задайте расписание: периодичность, время начала, дни недели.

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

Отбор = Новый Структура("Метаданные", Метаданные.РегламентныеЗадания.Расш1_ОбменДанными);

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

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

Расписание = Новый РасписаниеРегламентногоЗадания;

Расписание.ПериодПовтораДней = 1;

Расписание.ПериодПовтораВТечениеДня = 3600; // каждый час

Задание.Расписание = Расписание;

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

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

КонецЦикла;

Такой код удобно выполнить один раз через внешнюю обработку или в процедуре первоначального заполнения расширения. Учтите, что ПолучитьРегламентныеЗадания требует права «Администрирование» или выполнения в привилегированном режиме — оберните вызов в УстановитьПривилегированныйРежим(Истина), если код запускается от обычного пользователя.

Проверка выполнения и диагностика ошибок

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

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

Для отладки логики без ожидания расписания вызовите процедуру обработчика напрямую из внешней обработки или через «Выполнить произвольный код» в инструментах разработчика. Так вы отловите ошибки в логике до того, как они начнут сыпаться в журнал регистрации по расписанию.

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

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

Запись в журнале регистрации
Норма

Событие обработчика с уровнем «Информация» в ожидаемое время

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

Событие с уровнем «Ошибка» или полное отсутствие записей

Состояние фонового задания
Норма

Статус «Завершено» после каждого запуска

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

Статус «Ошибка» или бесконечное «Выполняется»

Побочный эффект обработчика
Норма

Данные созданы или обновлены, как задумано

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

Данные не меняются либо появляются дубли

Типичные ошибки и ограничения расширений

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

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

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

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

Когда расширение не подходит: альтернативы

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

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

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

Задание в расширении

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

Задание в основной конфигурации

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

Внешний планировщик ОС

Подходит для интеграций и независимого запуска; ограничение — нужен отдельный запуск сеанса 1С

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

Можно ли добавить регламентное задание в расширение в файловой базе?

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

Почему задание не запускается, хотя расписание настроено?

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

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

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

Что будет с заданием при отключении расширения?

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

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

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

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

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

Итог

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

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