Разработка и Конфигурация · 12 мин
Как сделать регламентное задание в расширении 1С
Как добавить регламентное задание в расширение 1С: создание объекта метаданных, написание обработчика, настройка расписания, типичные ошибки и проверка работы.
Расширения конфигурации в 1С позволяют добавлять собственные объекты метаданных, не изменяя типовую конфигурацию, и регламентные задания — один из самых востребованных сценариев. С их помощью можно запускать фоновую синхронизацию, пересчёт данных, отправку уведомлений или очистку устаревших записей по расписанию, не трогая основной код поставщика.
Добавить регламентное задание в расширение можно только в режиме «Изменение» или «Добавление»: если расширение подключено в режиме «Исправление», новые объекты метаданных создавать нельзя. Кроме того, код обработчика задания должен размещаться в общем модуле расширения с установленным флагом «Сервер», иначе платформа не сможет его выполнить.
Ниже разобран полный цикл работ: от создания общего модуля и объекта метаданных до настройки расписания и проверки выполнения в журнале регистрации. Материал ориентирован на конфигуратор управляемого приложения с совместимостью не ниже 8.3.11, где поддержка регламентных заданий в расширениях уже реализована.
Что нужно подготовить перед созданием задания
Прежде чем добавлять объект метаданных, убедитесь, что расширение подключено в подходящем режиме. Откройте список расширений («Все функции» → «Стандартные» → «Управление расширениями конфигурации» или соответствующий пункт в администрировании) и проверьте назначение: для добавления новых объектов требуется режим «Изменение» или «Добавление». В режиме «Исправление» кнопка добавления объекта будет недоступна.
Второе условие — наличие общего модуля. Регламентное задание вызывает процедуру из общего модуля, поэтому заранее продумайте, где будет лежать код. Если в расширении уже есть серверный общий модуль, можно использовать его; если нет — создайте новый. Модуль должен иметь свойства «Сервер» = Истина и «Вызов сервера» = Истина, если планируется обращаться к нему ещё и из клиентского кода.
Третий момент — права. Пользователь, от имени которого выполняется регламентное задание, должен иметь права на все объекты, с которыми работает обработчик: чтение и запись регистров, документов, справочников. Задание, запущенное от пользователя без прав, завершится ошибкой, которая отразится только в журнале регистрации.
Создание общего модуля и процедуры обработчика
В дереве конфигурации расширения найдите ветку «Общие» → «Общие модули» и добавьте новый модуль, например Расш1_РегламентныеОперации. Префикс помогает не пересечься с модулями основной конфигурации и других расширений. В свойствах модуля установите флаги «Сервер» и, при необходимости, «Вызов сервера». Флаг «Клиент (обычное приложение)» и «Клиент (управляемое приложение)» для регламентных заданий не нужен — задания выполняются на сервере.
В модуле создайте экспортную процедуру без параметров. Именно её платформа будет вызывать по расписанию. Пример простого обработчика, который логирует факт запуска:
Процедура Расш1_ВыполнитьОбменДанными() Экспорт
ЗаписьЖурналаРегистрации("Расширение.ОбменДанными",
УровеньЖурналаРегистрации.Информация, , ,
"Запуск регламентного задания из расширения");
// Основная логика задания
КонецПроцедуры
Обратите внимание: процедура не должна принимать параметры, если вы не планируете передавать их через свойство «Параметры» задания. Для большинства задач проще оставить процедуру без параметров и хранить настройки в константах или регистре сведений, добавленных тем же расширением.
Добавление объекта метаданных «Регламентное задание»
В дереве конфигурации расширения перейдите в ветку «Общие» → «Регламентные задания» и добавьте новый объект. Задайте понятное имя, например Расш1_ОбменДанными, и синоним, который увидят администраторы в консоли заданий. В свойстве «Имя метода» укажите полный путь к процедуре: Расш1_РегламентныеОперации.Расш1_ВыполнитьОбменДанными.
Обратите внимание на ключевые свойства объекта. «Использование» определяет, активно ли задание по умолчанию. «Ключ» позволяет исключить параллельный запуск заданий с одинаковым ключом — полезно, если одна и та же логика используется в нескольких заданиях. «Наименование» отображается в списке фоновых заданий и помогает отличать процессы в консоли.
Расписание в конфигураторе задать нельзя — оно хранится в базе данных и настраивается уже после обновления конфигурации. Поэтому после добавления объекта выполните «Обновить конфигурацию базы данных» (F7) и убедитесь, что обновление прошло без ошибок. Если расширение добавлено в файловую базу, обновление выполняется сразу; в клиент-серверном варианте может потребоваться монопольный доступ или динамическое обновление, если изменения это позволяют.
- 1Создайте в расширении общий серверный модуль с экспортной процедурой без параметров
- 2Добавьте объект метаданных «Регламентное задание» и укажите имя метода в формате «Модуль.Процедура»
- 3Задайте синоним, ключ и признак использования
- 4Обновите конфигурацию базы данных (F7)
- 5Настройте расписание через консоль заданий или программно
- 6Проверьте выполнение в журнале регистрации
Настройка расписания и активация задания
После обновления конфигурации задание появится в списке регламентных заданий базы, но с пустым расписанием оно выполняться не будет. В типовых конфигурациях на управляемом приложении расписание настраивается через раздел «Администрирование» → «Обслуживание» → «Регламентные и фоновые задания». Найдите своё задание по синониму, откройте его и задайте расписание: периодичность, время начала, дни недели.
Если типовой обработки нет или нужно автоматизировать включение, расписание можно установить программно. Для этого используется менеджер регламентных заданий:
Отбор = Новый Структура("Метаданные", Метаданные.РегламентныеЗадания.Расш1_ОбменДанными);
Задания = РегламентныеЗадания.ПолучитьРегламентныеЗадания(Отбор);
Для Каждого Задание Из Задания Цикл
Расписание = Новый РасписаниеРегламентногоЗадания;
Расписание.ПериодПовтораДней = 1;
Расписание.ПериодПовтораВТечениеДня = 3600; // каждый час
Задание.Расписание = Расписание;
Задание.Использование = Истина;
Задание.Записать();
КонецЦикла;
Такой код удобно выполнить один раз через внешнюю обработку или в процедуре первоначального заполнения расширения. Учтите, что ПолучитьРегламентныеЗадания требует права «Администрирование» или выполнения в привилегированном режиме — оберните вызов в УстановитьПривилегированныйРежим(Истина), если код запускается от обычного пользователя.
Проверка выполнения и диагностика ошибок
Первый признак корректной работы — записи в журнале регистрации. Откройте «Администрирование» → «Обслуживание» → «Журнал регистрации», отфильтруйте по событию, которое пишет ваш обработчик, или по пользователю, от имени которого выполняется задание. Если обработчик завершается ошибкой, в журнале появится событие с уровнем «Ошибка» и текстом исключения.
Второй инструмент — консоль фоновых заданий. В типовых конфигурациях она находится рядом со списком регламентных заданий и показывает состояние каждого запуска: «Выполняется», «Завершено», «Ошибка». Если задание зависло в состоянии «Выполняется», проверьте, нет ли в коде бесконечного цикла, блокировок на запись или ожидания внешнего ресурса.
Для отладки логики без ожидания расписания вызовите процедуру обработчика напрямую из внешней обработки или через «Выполнить произвольный код» в инструментах разработчика. Так вы отловите ошибки в логике до того, как они начнут сыпаться в журнал регистрации по расписанию.
Как проверить результат
Событие обработчика с уровнем «Информация» в ожидаемое время
Событие с уровнем «Ошибка» или полное отсутствие записей
Статус «Завершено» после каждого запуска
Статус «Ошибка» или бесконечное «Выполняется»
Данные созданы или обновлены, как задумано
Данные не меняются либо появляются дубли
Типичные ошибки и ограничения расширений
Самая частая проблема — ошибка «Метод не обнаружен» при запуске задания. Причины: опечатка в свойстве «Имя метода», отсутствие слова «Экспорт» у процедуры, неустановленный флаг «Сервер» у общего модуля или ситуация, когда модуль существует только в расширении, которое отключено. Проверяйте все четыре пункта по очереди.
Вторая группа проблем связана с правами и контекстом. Регламентное задание выполняется на сервере без пользовательского интерфейса: в обработчике нельзя использовать модальные вызовы, Предупреждение, Вопрос и обращения к клиентскому контексту. Любая попытка интерактивного вызова приведёт к ошибке выполнения.
Третье ограничение — зависимость от основной конфигурации. Если типовая конфигурация обновилась и переименовала объекты, к которым обращается ваш обработчик, задание начнёт падать после обновления. Поэтому после каждого обновления конфигурации проверяйте расширение на совместимость: конфигуратор умеет делать это автоматически при загрузке расширения, но логику обращений к данным он не проверит.
Когда расширение не подходит: альтернативы
Расширение — правильный выбор, если нужно добавить задание к типовой конфигурации на поддержке без снятия её с замка. Но есть ситуации, когда лучше выбрать другой путь. Если конфигурация уже снята с поддержки и активно дорабатывается, проще добавить регламентное задание напрямую в основную конфигурацию — так не будет лишнего слоя зависимостей.
Если задача разовая или запускается вручную, регламентное задание вообще не нужно: достаточно внешней обработки, которую администратор запускает по требованию. А для интеграций с внешними системами иногда надёжнее использовать внешний планировщик (например, планировщик задач ОС), который запускает 1С в пакетном режиме, — так не зависишь от состояния кластера регламентных заданий.
Сравнение вариантов
Подходит для типовых конфигураций на поддержке; ограничение — зависит от обновлений основной конфигурации
Подходит, если конфигурация уже дорабатывается; ограничение — требует снятия с поддержки
Подходит для интеграций и независимого запуска; ограничение — нужен отдельный запуск сеанса 1С
Частые вопросы
Можно ли добавить регламентное задание в расширение в файловой базе?
Да, механизм работает и в файловом, и в клиент-серверном варианте. Разница в том, что в файловой базе фоновые задания выполняются в отдельном процессе той же машины, а в клиент-серверной — на рабочем процессе кластера. Настройка объекта метаданных и обработчика идентична.
Почему задание не запускается, хотя расписание настроено?
Проверьте три вещи: флаг «Использование» у задания в базе, не заблокированы ли регламентные задания на уровне кластера (в консоли кластера есть свойство «Блокировка регламентных заданий» у информационной базы) и не отключено ли само расширение. Блокировка заданий часто включается при восстановлении копии базы и забывается.
Можно ли передать параметры в процедуру регламентного задания?
Да, у объекта метаданных есть свойство «Параметры» — количество параметров, которые платформа передаст в метод. Значения параметров задаются в свойствах конкретного задания в базе. На практике удобнее хранить настройки в константе или регистре сведений расширения и читать их внутри обработчика — так настройки можно менять без правки задания.
Что будет с заданием при отключении расширения?
Объект метаданных исчезнет из конфигурации, и задание перестанет выполняться. При повторном подключении расширения задание появится снова, но настройки расписания, сделанные в базе, могут потеряться — после переподключения проверьте расписание заново.
Как запустить задание вручную для теста, не дожидаясь расписания?
В консоли регламентных и фоновых заданий типовой конфигурации есть команда «Выполнить сейчас». Альтернатива — вызвать процедуру обработчика напрямую из внешней обработки или консоли кода, предварительно включив привилегированный режим, если обработчик обращается к данным, на которые у текущего пользователя нет прав.
Влияет ли регламентное задание из расширения на обновление типовой конфигурации?
Само по себе нет: расширения не блокируют обновление. Но если обработчик обращается к объектам, которые в новой версии переименованы или удалены, задание начнёт завершаться с ошибкой после обновления. После каждого обновления конфигурации выполняйте проверку применимости расширения и тестовый запуск задания.
Что важно запомнить
Регламентное задание в расширении создаётся в три шага: серверный общий модуль с экспортной процедурой, объект метаданных с правильным именем метода, настройка расписания в базе после обновления конфигурации. Контролируйте выполнение через журнал регистрации, избегайте интерактивных вызовов в обработчике и проверяйте расширение после каждого обновления типовой конфигурации.