Своё регламентное задание без правки типовой: делаем через расширение

· 9 мин

Содержание

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

Типовую конфигурацию при этом не снимаете с поддержки, обновления ставятся как обычно. Всё описанное касается платформы 8.3 версий 8.3.2x и не зависит от конкретной конфигурации: БП, ЗУП, УТ или ERP — механизм один.

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

Расширение — отдельная «надстройка» над основной конфигурацией. Регламентное задание в нём живёт так же, как в основной конфигурации, но со своими ограничениями.

Перед началом проверьте три вещи:

  • 🧩 Расширение есть и открыто. В Конфигураторе: Конфигурация → Расширения конфигурации. Если расширения нет — создайте новое кнопкой «Добавить». Дерево расширения откроется отдельным окном.
  • 🏷️ Префикс имён. В свойствах корня расширения есть «Префикс». Все новые объекты называйте с ним: Расш1_ВыгрузкаОстатков, а не ВыгрузкаОстатков. Так имена не столкнутся с объектами типовой после её обновления.
  • 🔒 Режим безопасности. У расширения есть свойство «Безопасный режим». Если задание будет писать файлы, обращаться к COM, внешним сайтам или другим базам — в безопасном режиме это запрещено. Решите заранее, нужен ли вам полный доступ.

Назначение расширения («Исправление», «Адаптация», «Дополнение») на создание задания не влияет. Для собственных фоновых процессов обычно выбирают «Дополнение» или «Адаптация».

Если вы правите поведение уже существующего типового задания, своё задание создавать не нужно. Заимствуйте в расширение общий модуль, где лежит его метод, и перехватите процедуру аннотацией &После или &Вместо. Расписание типового задания при этом не трогаете.

Общий модуль и процедура: что пишем в коде

Регламентное задание само кода не содержит. Оно лишь ссылается на экспортную процедуру общего модуля. Поэтому сначала модуль.

Создаём общий модуль

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

Если у модуля не стоит флаг «Сервер» или процедура не помечена Экспорт, задание в свойстве «Имя метода» её просто не увидит.

Пишем процедуру

Шаблон, который удобно брать за основу:

Процедура ВыгрузкаОстатков() Экспорт

    // В конфигурациях на БСП — обязательная первая строка:
    // проверяет, можно ли сейчас выполнять задание, и устанавливает контекст.
    ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(
        Метаданные.РегламентныеЗадания.Расш1_ВыгрузкаОстатков);

    Попытка
        Расш1_ВыгрузкаОстатковСервер.Выполнить();
    Исключение
        ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
        ЗаписьЖурналаРегистрации("Расш1.ВыгрузкаОстатков",
            УровеньЖурналаРегистрации.Ошибка,
            Метаданные.РегламентныеЗадания.Расш1_ВыгрузкаОстатков, ,
            ТекстОшибки);
        ВызватьИсключение;
    КонецПопытки;

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

Что здесь важно:

  • 🧱 Вызов ПриНачалеВыполненияРегламентногоЗадания. Есть во всех типовых на Библиотеке стандартных подсистем. Без него задание может запуститься там, где не должно: например, в копии базы, где регламентные операции заблокированы.
  • 🧯 ВызватьИсключение после записи в журнал. Если ошибку «проглотить», фоновое задание завершится как успешное. Тогда не сработают повторы при аварийном завершении, а в списке заданий вы увидите зелёный статус при сломанной выгрузке.
  • 🗂️ Логику — в отдельный модуль. В самой процедуре задания держите только «обвязку». Основную работу вынесите в другой серверный модуль: его удобно вызывать вручную при отладке.

Регистрация задания и настройка расписания

Теперь сам объект метаданных.

Создаём объект «Регламентное задание»

  1. В дереве расширения: Общие → Регламентные задания → Добавить.
  2. Имя — с префиксом: Расш1_ВыгрузкаОстатков. Синоним — понятный человеку, его увидят администраторы в списке заданий.
  3. Имя метода — нажмите кнопку выбора и укажите Расш1_РегламентныеЗадания.ВыгрузкаОстатков.
  4. Использование — отметьте, иначе задание не запустится ни разу.
  5. Предопределенное — отметьте, если нужен ровно один экземпляр, который платформа создаст сама.
  6. Количество повторов при аварийном завершении и Интервал повтора (в секундах) — например, 3 повтора через 600 секунд для обмена с внешним сервисом.

Расписание

Кнопка «Открыть» у свойства «Расписание» вызывает окно с вкладками: общие параметры, дневное, недельное и месячное расписание. Типовые варианты:

ЗадачаЧто выставить
Раз в сутки ночьюПовтор каждые 1 дн., время начала 02:00
Каждые 30 минут в рабочее времяПовтор каждые 1 дн., повторять через 1800 сек., с 08:00 до 20:00
По буднямНедельное расписание: Пн–Пт
Первого числа месяцаМесячное: день месяца 1

Слишком частое расписание (каждые 10–30 секунд) на нагруженной базе — частая причина торможения. Если задача тяжёлая, ставьте интервал не меньше времени её выполнения с запасом.

Обновляем расширение в базе

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

Проверьте в режиме 1С:Предприятие, что расширение активно: Администрирование → Печатные формы, отчеты и обработки → Расширения. В карточке расширения там же видно и включённый «Безопасный режим».

Переносим расширение в рабочую базу

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

  1. В окне расширения в Конфигураторе сохраните его в файл .cfe — через меню Конфигурация → Расширения конфигурации, команда сохранения в файл.
  2. В рабочей базе загрузите файл: в Конфигураторе — тем же списком расширений, в режиме 1С:Предприятие — кнопкой «Добавить из файла» в списке расширений.
  3. Загрузка файла и обновление базы данных — разные шаги. После загрузки в Конфигураторе отдельно выполните «Обновить конфигурацию базы данных».
  4. Если в задании отмечено «Предопределенное», экземпляр появится в рабочей базе сам. Непредопределённые экземпляры создайте кодом заново: они хранятся в данных базы, а не в файле расширения.

Параметры, пользователь и контекст: как задание «видит» базу

Задание выполняется на сервере как фоновое. Клиента, форм и диалогов у него нет. Отсюда несколько правил.

Передача параметров

Если процедуре нужны параметры, объявите их в сигнатуре: Процедура ВыгрузкаОстатков(ИмяСклада) Экспорт. Значения передаются массивом из свойства Параметры экземпляра задания — по порядку.

У предопределённого задания параметры в Конфигураторе не задать. Два рабочих варианта:

  • 🅰️ Сделать задание непредопределённым и создавать экземпляры кодом — сколько нужно, каждый со своими параметрами.
  • 🅱️ Оставить одно предопределённое задание без параметров, а настройки хранить в константе или регистре сведений расширения и читать их в коде.

Создание экземпляра с параметрами:

Задание = РегламентныеЗадания.СоздатьРегламентноеЗадание(
    Метаданные.РегламентныеЗадания.Расш1_ВыгрузкаОстатков);
Задание.Наименование = "Выгрузка остатков: склад Центральный";
Задание.Ключ = "Склад_Центральный";

Параметры = Новый Массив;
Параметры.Добавить("Центральный");
Задание.Параметры = Параметры;

Расписание = Новый РасписаниеРегламентногоЗадания;
Расписание.ПериодПовтораДней = 1;
Расписание.ПериодПовтораВТечениеДня = 1800;
Расписание.ВремяНачала = '00010101080000';
Расписание.ВремяКонца = '00010101200000';
Задание.Расписание = Расписание;

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

Ключ нужен, чтобы различать экземпляры: платформа не запустит второе фоновое задание с тем же ключом, пока первое ещё работает.

От чьего имени выполняется

Пользователь задаётся свойством ИмяПользователя экземпляра задания — программно или в типовом списке заданий. Если пользователь указан, задание получает его права и его значения параметров сеанса.

Для задания, которое меняет данные, удобно завести отдельного служебного пользователя с нужными ролями. Тогда в журнале регистрации сразу видно, какие изменения сделал регламент.

Что недоступно в контексте задания

  • 🚫 Формы, Предупреждение(), Вопрос() — клиентских методов нет.
  • 🚫 Модули с флагами только «Клиент» — не вызвать.
  • ⚠️ В безопасном режиме расширения — работа с файлами, COM, внешними соединениями и интернетом.
  • 🕐 Текущая дата — серверная. Если сервер в другом часовом поясе, расписание и ТекущаяДатаСеанса() могут разойтись на часы.

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

Ждать, пока расписание сработает, неудобно. Отлаживайте в три приёма.

1. Вызвать логику напрямую

Создайте в расширении обработку или временную команду и вызовите из неё Расш1_ВыгрузкаОстатковСервер.Выполнить() на сервере. Так вы ловите ошибки самой логики обычной точкой останова.

2. Запустить как фоновое задание

Чтобы проверить работу именно в фоне — с тем же контекстом и правами:

Параметры = Новый Массив;
Параметры.Добавить("Центральный");
ФоновыеЗадания.Выполнить("Расш1_РегламентныеЗадания.ВыгрузкаОстатков",
    Параметры, , "Ручной запуск выгрузки");

Чтобы остановиться на точке останова внутри фонового задания, в Конфигураторе откройте Отладка → Подключение, затем «Автоматическое подключение» и отметьте фоновые задания. В клиент-серверном варианте сервер 1С должен быть запущен с разрешённой отладкой — без этого отладчик к серверным процессам не подключится.

3. Мониторинг на рабочей базе

  • 📋 Список заданий. В типовых: Администрирование → Обслуживание → Регламентные операции → Регламентные и фоновые задания. Здесь видно состояние последнего запуска, можно выполнить задание вручную и поменять расписание без Конфигуратора.
  • 📒 Журнал регистрации. Отбор по событию с вашим именем (Расш1.ВыгрузкаОстатков) или по метаданным задания. Платформа сама фиксирует запуск и завершение регламентных заданий.
  • 🔎 Программно. Последние запуски и текст ошибки:
Отбор = Новый Структура("Ключ", "Склад_Центральный");
Для Каждого ФЗ Из ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор) Цикл
    Если ФЗ.Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно Тогда
        Сообщить(ПодробноеПредставлениеОшибки(ФЗ.ИнформацияОбОшибке));
    КонецЕсли;
КонецЦикла;

Когда задание не запускается: файловая база и сервер

Регламентные задания запускает не расширение, а платформа. И правила здесь разные для двух вариантов работы.

ВариантКто запускает заданияНа что смотреть
Файловая базаСеанс клиента 1С, открытый на любом компьютереПока ни один клиент не запущен, задания стоят
Клиент-серверКластер серверов 1СФлаг «Блокировка регламентных заданий включена» в свойствах базы в консоли кластера

Для файловой базы рабочий приём — держать отдельный сеанс 1С под служебным пользователем, запущенный с параметром /AllowExecuteScheduledJobs -Force. Он отвечает за выполнение заданий, даже если обычные пользователи разошлись.

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

Ошибки, на которых спотыкаются чаще всего

Диагностика: выберите симптом

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

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

Можно ли изменить расписание без Конфигуратора?
Да. В типовых на БСП расписание меняется в списке «Регламентные и фоновые задания» в режиме 1С:Предприятие. Изменение хранится в базе и не трогает расширение.
Сохранится ли задание после обновления типовой конфигурации?
Да, если расширение остаётся применимым. Собственное задание и общий модуль расширения от обновления типовой не зависят.
Чем предопределённое задание отличается от непредопределённого?
Предопределённое платформа создаёт сама в единственном экземпляре. Непредопределённые создаются кодом, их может быть много, у каждого свои параметры и расписание.
Нужен ли монопольный доступ, чтобы добавить задание в расширение?
Обычно нет: изменения расширения применяются без монопольного режима. Пользователи увидят их после перезапуска сеансов.
Можно ли отключить задание, не удаляя расширение?
Да. Снимите «Использование» в карточке задания в списке регламентных заданий или программно: Задание.Использование = Ложь и Записать().