Своё фоновое расписание без правки типовой: регламентное задание в расширении конфигурации
Содержание
Чтобы настроить регламентное задание в расширении 1С, откройте расширение в Конфигураторе, добавьте в ветку Общие → Регламентные задания новый объект, а в свойстве «Имя метода» укажите экспортную процедуру из серверного общего модуля этого же расширения. Затем задайте расписание, включите флажок «Использование» и обновите конфигурацию базы данных. Типовую конфигурацию
при этом не снимают с поддержки.
Звучит просто, но на практике задание часто «молчит»: расширение подключено в безопасном режиме, база файловая и никто в ней не работает , или в консоли кластера стоит блокировка. Ниже — порядок действий от пустого расширения до проверки в журнале регистрации, плюс разбор причин, по которым задание не стартует.
Как устроено регламентное задание и зачем выносить его в расширение
Регламентное задание — это объект метаданных, который говорит платформе: «вызывай вот эту процедуру по вот такому расписанию». Сам объект кода не содержит. У него нет модуля объекта, как у справочника или документа. Вся логика живёт в процедуре общего модуля, а объект только хранит ссылку на неё и настройки запуска.
Выполняет задание не пользователь, а сервер. В клиент-серверной базе этим занимается менеджер кластера: он по расписанию стартует фоновое задание в рабочем процессе. В файловой базе всё иначе, об этом ниже.
Почему расширение, а не правка типовой:
- 🧩 конфигурация остаётся на поддержке, обновления ставятся без сравнения-объединения;
- 🔁 доработку можно отключить одним флажком, не трогая основную конфигурацию;
- 📦 одно и то же расширение переносится между базами файлом
.cfe; - 🛠 через расширение можно не только добавить своё задание, но и изменить поведение типового — перехватить его процедуру.
Свои регламентные задания в расширениях поддерживаются в актуальных версиях платформы 8.3. Если в вашей сборке ветки Регламентные задания в дереве расширения нет, обновите платформу — сами расширения появились в 8.3.6, а набор объектов, которые можно добавлять, с тех пор заметно вырос.
Шаг 1. Создаём регламентное задание в дереве расширения
Подготовка расширения
- Откройте базу в Конфигураторе.
- Меню
Конфигурация → Расширения конфигурации. - Если расширения ещё нет — кнопка «Добавить». Задайте имя (например,
МоиРегламенты) и префикс имён, допустиммр_. - Двойным щелчком откройте дерево расширения.
Префикс — не формальность. Платформа подставляет его к именам новых объектов, и они не пересекутся с объектами типовой при следующем обновлении. Если в новом релизе 1С появится объект с таким же именем, как ваш без префикса, расширение перестанет применяться.
Добавление объекта
- В дереве расширения раскройте
Общие → Регламентные задания. - Нажмите «Добавить» (или
Ins). - Имя:
мр_ВыгрузкаОстатков, синоним — «Выгрузка остатков на сайт».
Синоним увидит администратор в списке регламентных заданий в пользовательском режиме. Пишите его так, чтобы через полгода было понятно, что делает задание.
Свойства объекта
| Свойство | Что задаёт | Рекомендация |
|---|---|---|
| Имя метода | Процедура, которую вызовет платформа | Выбирается из серверных общих модулей |
| Ключ | Строка для различения экземпляров | Обычно пусто |
| Использование | Включено ли задание | Включите после отладки |
| Предопределенное | Создаётся ли экземпляр автоматически | Да, если нужен ровно один запуск по расписанию |
| Количество повторов при аварийном завершении | Сколько раз перезапустить после ошибки | 1–3 для обменов, 0 для тяжёлых расчётов |
| Интервал повтора при аварийном завершении | Пауза перед повтором, в секундах | 60–300 |
| Расписание | Когда запускать | См. шаг 3 |
Флажок «Предопределенное» решает главный вопрос: нужен один экземпляр задания или много. Предопределённое платформа создаёт сама. Непредопределённое существует только как шаблон — экземпляры создают кодом, например отдельный для каждой организации.
Шаг 2. Где писать код задания: общий модуль расширения
Здесь чаще всего путаются те, кто ищет у задания «модуль объекта». Его нет. Код пишут в общем модуле.
Создание общего модуля
- В дереве расширения:
Общие → Общие модули → Добавить. - Имя:
мр_РегламентныеЗадания. - Флажки: «Сервер» — включён; «Клиент (управляемое приложение)», «Внешнее соединение», «Вызов сервера», «Глобальный» — выключены.
Флажок «Вызов сервера» здесь не нужен: задание и так стартует на сервере, а лишняя доступность с клиента — это лишняя поверхность для ошибок.
Процедура-обработчик
Процедура должна быть экспортной и без параметров (если параметры не передаются через свойство «Параметры» экземпляра):
Процедура ВыгрузкаОстатков() Экспорт
// Для конфигураций на БСП: проверки доступности, разделения данных и т. п.
ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(
Метаданные.РегламентныеЗадания.мр_ВыгрузкаОстатков);
ИмяСобытия = "МоиРегламенты.ВыгрузкаОстатков";
ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Информация, , ,
"Старт выгрузки");
Попытка
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КОЛИЧЕСТВО(*) КАК Количество
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ПометкаУдаления";
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Информация, , ,
СтрШаблон("Обработано позиций: %1", Формат(Выборка.Количество, "ЧН=0; ЧГ=0")));
Исключение
ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Ошибка, , ,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Что важно в этом шаблоне:
- 📌 вызов
ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗаданиянужен в типовых конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11). Он проверяет, можно ли сейчас выполнять задание, — например, не идёт ли обновление базы. В самописной конфигурации без БСП строку уберите; - 📌 своё имя события в журнале регистрации позволит потом отфильтровать записи за секунды;
- 📌
ВызватьИсключениев блокеИсключениевозвращает ошибку платформе. Без него задание будет числиться успешным, и механизм повторов не сработает.
Указываем метод в свойствах
Вернитесь в свойства регламентного задания и нажмите кнопку выбора у поля «Имя метода». В списке появятся только экспортные процедуры серверных общих модулей. Выберите мр_РегламентныеЗадания.ВыгрузкаОстатков.
Если нужной процедуры в списке нет — значит, у модуля не стоит флажок «Сервер» или процедура не помечена Экспорт.
Шаг 3. Расписание и параметры запуска регламентного задания
Расписание в Конфигураторе
В свойствах задания откройте «Расписание». Форма разбита на вкладки: общие настройки, дневное, недельное, месячное расписание. Типичные варианты:
| Задача | Как настроить |
|---|---|
| Раз в сутки ночью | Повторять каждые 1 день, время начала 02:00 |
| Каждые 10 минут в рабочее время | Повторять каждые 1 день, в течение дня каждые 600 секунд, с 08:00 до 20:00 |
| По будням | Недельное расписание: отметить пн–пт |
| Первого числа месяца | Месячное расписание: день месяца 1 |
Расписание, заданное в Конфигураторе, работает как значение по умолчанию. Администратор может изменить его в пользовательском режиме, не открывая Конфигуратор.
Расписание в пользовательском режиме
В Бухгалтерии 3.0, ЗУП 3.1 и УТ 11 список заданий открывается так: Администрирование → Обслуживание → Регламентные операции → Регламентные и фоновые задания. Там же есть кнопка «Выполнить сейчас», журнал запусков и редактор расписания. Задание из расширения появится в этом списке под синонимом, который вы задали.
Расписание кодом
Для непредопределённого задания экземпляр создают программно. Например, при первом запуске расширения или из служебной обработки:
Процедура СоздатьЗаданиеВыгрузки() Экспорт
Отбор = Новый Структура("Метаданные",
Метаданные.РегламентныеЗадания.мр_ВыгрузкаОстатков);
Найденные = РегламентныеЗадания.ПолучитьРегламентныеЗадания(Отбор);
Если Найденные.Количество() > 0 Тогда
Возврат;
КонецЕсли;
Расписание = Новый РасписаниеРегламентногоЗадания;
Расписание.ПериодПовтораДней = 1;
Расписание.ПериодПовтораВТечениеДня = 600;
Расписание.ВремяНачала = Дата(1, 1, 1, 8, 0, 0);
Расписание.ВремяКонца = Дата(1, 1, 1, 20, 0, 0);
Задание = РегламентныеЗадания.СоздатьРегламентноеЗадание(
Метаданные.РегламентныеЗадания.мр_ВыгрузкаОстатков);
Задание.Наименование = "Выгрузка остатков на сайт";
Задание.Расписание = Расписание;
Задание.Использование = Истина;
Задание.Записать();
КонецПроцедуры
Проверка на существование в начале обязательна: иначе каждый вызов процедуры плодит новый экземпляр, и через неделю выгрузка идёт двадцать раз за десять минут. Для предопределённого задания экземпляр получают методом РегламентныеЗадания.НайтиПредопределенное(...), создавать его не нужно.
Шаг 4. Подключение расширения: без этого задание не стартует
После правок сохраните расширение и выполните Конфигурация → Обновить конфигурацию базы данных (F7) в окне расширения. Дальше три вещи, которые проверяют реже всего.
1. Безопасный режим. По умолчанию расширение подключается в безопасном режиме. В нём код не может работать с файлами, COM-объектами, внешними компонентами и рядом сетевых возможностей. Если задание пишет файл или ходит во внешний сервис, его ждёт ошибка. Снять флажок можно в Конфигураторе в списке расширений (свойство «Безопасный режим») или в пользовательском режиме: Администрирование → Печатные формы, отчеты и обработки → Расширения.
Снимайте безопасный режим только для расширений, код которых вы проверили сами. Расширение без безопасного режима получает те же права, что и основная конфигурация.
2. Активность и область действия. Расширение должно быть активным. Задание работает в фоновом сеансе без пользователя, поэтому расширение должно применяться ко всей информационной базе, а не только к отдельному сеансу.
3. Блокировка регламентных заданий. В клиент-серверной базе откройте консоль администрирования серверов, свойства информационной базы. Флажок «Блокировка регламентных заданий включена» должен быть снят. Его часто включают на копиях рабочей базы, чтобы тестовая копия не отправляла выгрузки, — и забывают выключить.
Шаг 5. Отладка и контроль выполнения
Запуск вручную без ожидания расписания
Ждать десять минут ради каждой проверки неудобно. Варианты:
- ▶️ кнопка «Выполнить сейчас» в форме «Регламентные и фоновые задания» (конфигурации на БСП);
- ▶️ фоновое задание из внешней обработки, серверная процедура:
ФоновыеЗадания.Выполнить("мр_РегламентныеЗадания.ВыгрузкаОстатков", , ,
"Ручной запуск выгрузки");
- ▶️ прямой вызов процедуры из той же обработки. Так код выполнится в сеансе пользователя, с его правами, — удобно для поиска логических ошибок, но не покажет проблем с правами и безопасным режимом.
Отладчик в фоновом задании
Точки останова в процедуре задания по умолчанию не срабатывают: фоновый сеанс к отладчику сам не подключается. В Конфигураторе откройте Отладка → Подключение, далее «Автоматическое подключение», и отметьте фоновые задания. После этого запускайте отладку, а задание — вручную.
Для клиент-серверной базы сервер 1С должен быть запущен с разрешённой отладкой (ключ -debug в параметрах службы агента). Если ключа нет, его добавляют в параметры службы и перезапускают её.
Перезапуск службы агента сервера 1С обрывает все сеансы пользователей. Делайте это в нерабочее время или на тестовом сервере.
Журнал регистрации
Администрирование → Обслуживание → Журнал регистрации (или Администрирование → Журнал регистрации в Конфигураторе). Отбор по событию — тому имени, что вы задали в ЗаписьЖурналаРегистрации. Так видно время каждого старта, количество обработанных записей и полный текст ошибки.
В форме «Регламентные и фоновые задания» у каждого задания хранится история последних запусков: время, состояние, сообщение об ошибке.
Как через расширение изменить типовое регламентное задание
Иногда своё задание не нужно, а нужно поправить поведение типового. Например, добавить действие после стандартной загрузки курсов валют.
Порядок:
- Найдите в основной конфигурации регламентное задание и посмотрите его «Имя метода» — там модуль и процедура.
- Заимствуйте этот общий модуль в расширение (правый щелчок → «Добавить в расширение»).
- В модуле расширения создайте процедуру с аннотацией:
&После("ЗагрузкаКурсовВалют")
Процедура мр_ЗагрузкаКурсовВалютПосле()
// Ваши действия после типовой загрузки
КонецПроцедуры
Имя в аннотации должно совпадать с именем процедуры основной конфигурации. Пример выше условный: точное имя возьмите из свойства «Имя метода» вашего типового задания.
| Аннотация | Когда срабатывает | Риск при обновлении |
|---|---|---|
&Перед | До типовой процедуры | Низкий |
&После | После типовой процедуры | Низкий |
&Вместо | Полностью заменяет типовую | Высокий: исправления 1С не попадут в работу |
&ИзменениеИКонтроль | Правка отдельных строк типового кода | Средний: при изменении процедуры в релизе расширение не применится, пока не поправите |
Расписание типового задания через расширение менять не нужно — для этого есть форма «Регламентные и фоновые задания».