Своё регламентное задание без правки типовой: делаем через расширение
Содержание
Чтобы создать регламентное задание
в расширении 1С, откройте расширение в Конфигураторе, добавьте в него общий модуль с флагом «Сервер» и экспортной процедурой, затем в ветке Общие → Регламентные задания расширения создайте задание, укажите эту процедуру в свойстве «Имя метода», включите «Использование» и задайте расписание. После этого обновите расширение в базе данных — и задание начнёт запускаться по графику.
Типовую конфигурацию при этом не снимаете с поддержки, обновления ставятся как обычно. Всё описанное касается платформы 8.3 версий 8.3.2x и не зависит от конкретной конфигурации: БП, ЗУП, УТ или ERP — механизм один.
Что подготовить в расширении до создания задания
Расширение — отдельная «надстройка» над основной конфигурацией. Регламентное задание в нём живёт так же, как в основной конфигурации, но со своими ограничениями.
Перед началом проверьте три вещи:
- 🧩 Расширение есть и открыто. В Конфигураторе:
Конфигурация → Расширения конфигурации. Если расширения нет — создайте новое кнопкой «Добавить». Дерево расширения откроется отдельным окном. - 🏷️ Префикс имён. В свойствах корня расширения есть «Префикс». Все новые объекты называйте с ним:
Расш1_ВыгрузкаОстатков, а неВыгрузкаОстатков. Так имена не столкнутся с объектами типовой после её обновления. - 🔒 Режим безопасности. У расширения есть свойство «Безопасный режим». Если задание будет писать файлы, обращаться к COM, внешним сайтам или другим базам — в безопасном режиме это запрещено. Решите заранее, нужен ли вам полный доступ.
Назначение расширения («Исправление», «Адаптация», «Дополнение») на создание задания не влияет. Для собственных фоновых процессов обычно выбирают «Дополнение» или «Адаптация».
Если вы правите поведение уже существующего типового задания, своё задание создавать не нужно. Заимствуйте в расширение общий модуль, где лежит его метод, и перехватите процедуру аннотацией &После или &Вместо. Расписание типового задания при этом не трогаете.
Общий модуль и процедура: что пишем в коде
Регламентное задание само кода не содержит. Оно лишь ссылается на экспортную процедуру общего модуля. Поэтому сначала модуль.
Создаём общий модуль
- В дереве расширения откройте
Общие → Общие модулии нажмите «Добавить». - Задайте имя с префиксом, например
Расш1_РегламентныеЗадания. - В свойствах модуля отметьте «Сервер». Флаги «Клиент (управляемое приложение)», «Вызов сервера» и «Глобальный» не нужны.
- По желанию отметьте «Привилегированный» — тогда код модуля выполняется без проверки прав. Делайте это осознанно: задание сможет читать и писать всё.
Если у модуля не стоит флаг «Сервер» или процедура не помечена Экспорт, задание в свойстве «Имя метода» её просто не увидит.
Пишем процедуру
Шаблон, который удобно брать за основу:
Процедура ВыгрузкаОстатков() Экспорт
// В конфигурациях на БСП — обязательная первая строка:
// проверяет, можно ли сейчас выполнять задание, и устанавливает контекст.
ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(
Метаданные.РегламентныеЗадания.Расш1_ВыгрузкаОстатков);
Попытка
Расш1_ВыгрузкаОстатковСервер.Выполнить();
Исключение
ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗаписьЖурналаРегистрации("Расш1.ВыгрузкаОстатков",
УровеньЖурналаРегистрации.Ошибка,
Метаданные.РегламентныеЗадания.Расш1_ВыгрузкаОстатков, ,
ТекстОшибки);
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Что здесь важно:
- 🧱 Вызов
ПриНачалеВыполненияРегламентногоЗадания. Есть во всех типовых на Библиотеке стандартных подсистем. Без него задание может запуститься там, где не должно: например, в копии базы, где регламентные операции заблокированы. - 🧯
ВызватьИсключениепосле записи в журнал. Если ошибку «проглотить», фоновое задание завершится как успешное. Тогда не сработают повторы при аварийном завершении, а в списке заданий вы увидите зелёный статус при сломанной выгрузке. - 🗂️ Логику — в отдельный модуль. В самой процедуре задания держите только «обвязку». Основную работу вынесите в другой серверный модуль: его удобно вызывать вручную при отладке.
Регистрация задания и настройка расписания
Теперь сам объект метаданных.
Создаём объект «Регламентное задание»
- В дереве расширения:
Общие → Регламентные задания → Добавить. - Имя — с префиксом:
Расш1_ВыгрузкаОстатков. Синоним — понятный человеку, его увидят администраторы в списке заданий. - Имя метода — нажмите кнопку выбора и укажите
Расш1_РегламентныеЗадания.ВыгрузкаОстатков. - Использование — отметьте, иначе задание не запустится ни разу.
- Предопределенное — отметьте, если нужен ровно один экземпляр, который платформа создаст сама.
- Количество повторов при аварийном завершении и Интервал повтора (в секундах) — например, 3 повтора через 600 секунд для обмена с внешним сервисом.
Расписание
Кнопка «Открыть» у свойства «Расписание» вызывает окно с вкладками: общие параметры, дневное, недельное и месячное расписание. Типовые варианты:
| Задача | Что выставить |
|---|---|
| Раз в сутки ночью | Повтор каждые 1 дн., время начала 02:00 |
| Каждые 30 минут в рабочее время | Повтор каждые 1 дн., повторять через 1800 сек., с 08:00 до 20:00 |
| По будням | Недельное расписание: Пн–Пт |
| Первого числа месяца | Месячное: день месяца 1 |
Слишком частое расписание (каждые 10–30 секунд) на нагруженной базе — частая причина торможения. Если задача тяжёлая, ставьте интервал не меньше времени её выполнения с запасом.
Обновляем расширение в базе
После сохранения нажмите в окне расширения «Обновить конфигурацию базы данных» (F7). Для расширения монопольный доступ обычно не требуется, но работающие пользователи увидят изменения только после перезапуска своих сеансов.
Проверьте в режиме 1С:Предприятие, что расширение активно: Администрирование → Печатные формы, отчеты и обработки → Расширения. В карточке расширения там же видно и включённый «Безопасный режим».
Переносим расширение в рабочую базу
Разрабатывать задание удобнее в копии базы. В рабочую его переносят файлом расширения:
- В окне расширения в Конфигураторе сохраните его в файл
.cfe— через менюКонфигурация → Расширения конфигурации, команда сохранения в файл. - В рабочей базе загрузите файл: в Конфигураторе — тем же списком расширений, в режиме 1С:Предприятие — кнопкой «Добавить из файла» в списке расширений.
- Загрузка файла и обновление базы данных — разные шаги. После загрузки в Конфигураторе отдельно выполните «Обновить конфигурацию базы данных».
- Если в задании отмечено «Предопределенное», экземпляр появится в рабочей базе сам. Непредопределённые экземпляры создайте кодом заново: они хранятся в данных базы, а не в файле расширения.
Параметры, пользователь и контекст: как задание «видит» базу
Задание выполняется на сервере как фоновое. Клиента, форм и диалогов у него нет. Отсюда несколько правил.
Передача параметров
Если процедуре нужны параметры, объявите их в сигнатуре: Процедура ВыгрузкаОстатков(ИмяСклада) Экспорт. Значения передаются массивом из свойства Параметры экземпляра задания — по порядку.
У предопределённого задания параметры в Конфигураторе не задать. Два рабочих варианта:
- 🅰️ Сделать задание непредопределённым и создавать экземпляры кодом — сколько нужно, каждый со своими параметрами.
- 🅱️ Оставить одно предопределённое задание без параметров, а настройки хранить в константе или регистре сведений расширения и читать их в коде.
Создание экземпляра с параметрами:
Задание = РегламентныеЗадания.СоздатьРегламентноеЗадание(
Метаданные.РегламентныеЗадания.Расш1_ВыгрузкаОстатков);
Задание.Наименование = "Выгрузка остатков: склад Центральный";
Задание.Ключ = "Склад_Центральный";
Параметры = Новый Массив;
Параметры.Добавить("Центральный");
Задание.Параметры = Параметры;
Расписание = Новый РасписаниеРегламентногоЗадания;
Расписание.ПериодПовтораДней = 1;
Расписание.ПериодПовтораВТечениеДня = 1800;
Расписание.ВремяНачала = '00010101080000';
Расписание.ВремяКонца = '00010101200000';
Задание.Расписание = Расписание;
Задание.Использование = Истина;
Задание.Записать();
Ключ нужен, чтобы различать экземпляры: платформа не запустит второе фоновое задание с тем же ключом, пока первое ещё работает.
От чьего имени выполняется
Пользователь задаётся свойством ИмяПользователя экземпляра задания — программно или в типовом списке заданий. Если пользователь указан, задание получает его права и его значения параметров сеанса.
Для задания, которое меняет данные, удобно завести отдельного служебного пользователя с нужными ролями. Тогда в журнале регистрации сразу видно, какие изменения сделал регламент.
Что недоступно в контексте задания
- 🚫 Формы,
Предупреждение(),Вопрос()— клиентских методов нет. - 🚫 Модули с флагами только «Клиент» — не вызвать.
- ⚠️ В безопасном режиме расширения — работа с файлами, COM, внешними соединениями и интернетом.
- 🕐 Текущая дата — серверная. Если сервер в другом часовом поясе, расписание и
ТекущаяДатаСеанса()могут разойтись на часы.
Как отладить и проследить запуски
Ждать, пока расписание сработает, неудобно. Отлаживайте в три приёма.
1. Вызвать логику напрямую
Создайте в расширении обработку или временную команду и вызовите из неё Расш1_ВыгрузкаОстатковСервер.Выполнить() на сервере. Так вы ловите ошибки самой логики обычной точкой останова.
2. Запустить как фоновое задание
Чтобы проверить работу именно в фоне — с тем же контекстом и правами:
Параметры = Новый Массив;
Параметры.Добавить("Центральный");
ФоновыеЗадания.Выполнить("Расш1_РегламентныеЗадания.ВыгрузкаОстатков",
Параметры, , "Ручной запуск выгрузки");
Чтобы остановиться на точке останова внутри фонового задания, в Конфигураторе откройте Отладка → Подключение, затем «Автоматическое подключение» и отметьте фоновые задания. В клиент-серверном варианте сервер 1С должен быть запущен с разрешённой отладкой — без этого отладчик к серверным процессам не подключится.
3. Мониторинг на рабочей базе
- 📋 Список заданий. В типовых:
Администрирование → Обслуживание → Регламентные операции → Регламентные и фоновые задания. Здесь видно состояние последнего запуска, можно выполнить задание вручную и поменять расписание без Конфигуратора. - 📒 Журнал регистрации. Отбор по событию с вашим именем (
Расш1.ВыгрузкаОстатков) или по метаданным задания. Платформа сама фиксирует запуск и завершение регламентных заданий. - 🔎 Программно. Последние запуски и текст ошибки:
Отбор = Новый Структура("Ключ", "Склад_Центральный");
Для Каждого ФЗ Из ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор) Цикл
Если ФЗ.Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно Тогда
Сообщить(ПодробноеПредставлениеОшибки(ФЗ.ИнформацияОбОшибке));
КонецЕсли;
КонецЦикла;
Когда задание не запускается: файловая база и сервер
Регламентные задания запускает не расширение, а платформа. И правила здесь разные для двух вариантов работы.
| Вариант | Кто запускает задания | На что смотреть |
|---|---|---|
| Файловая база | Сеанс клиента 1С, открытый на любом компьютере | Пока ни один клиент не запущен, задания стоят |
| Клиент-сервер | Кластер серверов 1С | Флаг «Блокировка регламентных заданий включена» в свойствах базы в консоли кластера |
Для файловой базы рабочий приём — держать отдельный сеанс 1С под служебным пользователем, запущенный с параметром /AllowExecuteScheduledJobs -Force. Он отвечает за выполнение заданий, даже если обычные пользователи разошлись.
Флаг блокировки регламентных заданий в консоли кластера часто ставят на копиях рабочей базы, чтобы они не отправляли письма и не выгружали данные. Если вы перенесли расширение из теста в рабочую базу, а задание молчит — сначала проверьте этот флаг, а не код.
Ошибки, на которых спотыкаются чаще всего
Ещё одна неочевидная ловушка — разные базы с одним расширением. Если расширение загружено в тестовую копию, предопределённое задание создастся и там. Без блокировки регламентных заданий копия начнёт выполнять ту же выгрузку, что и рабочая база.
Частые вопросы
Можно ли изменить расписание без Конфигуратора?
Сохранится ли задание после обновления типовой конфигурации?
Чем предопределённое задание отличается от непредопределённого?
Нужен ли монопольный доступ, чтобы добавить задание в расширение?
Можно ли отключить задание, не удаляя расширение?
Задание.Использование = Ложь и Записать().