Своё регламентное задание без снятия конфигурации с поддержки
Содержание
Регламентное задание добавляют в расширение так же, как в основную конфигурацию: в Конфигураторе откройте дерево расширения, в ветке Общие → Регламентные задания создайте новый объект и укажите в свойстве «Имя метода» экспортную процедуру из серверного общего модуля этого же расширения. Затем отметьте «Предопределённое» и «Использование», задайте расписание и обновите конфигурацию базы данных для расширения.
Частое заблуждение — что для своего регламентного задания нужно снимать типовую конфигурацию с поддержки. Не нужно: добавить регламентное задание в расширение 1С можно без правки основной конфигурации, и обновления типового релиза ставятся как раньше. Тонкости начинаются дальше — с безопасного режима, расписания по умолчанию и того, как задание увидит БСП.
Чем задание в расширении отличается от задания в конфигурации
Сам объект метаданных одинаковый. Отличия — в окружении, в котором живёт расширение.
- 🔤 Префикс имени. Все новые объекты расширения получают префикс из свойства расширения «Префикс имён» (по умолчанию
Расш1_). Задание будет называться, например,Расш1_ВыгрузкаОстатков, и в коде к нему обращаютсяМетаданные.РегламентныеЗадания.Расш1_ВыгрузкаОстатков. - 🛡️ Безопасный режим. Если расширение подключено с включённым безопасным режимом, код задания не сможет работать с файлами, COM-объектами, внешними компонентами и привилегированным режимом. Для задания, которое пишет файл на диск или ходит во внешнюю систему, это главный источник «молчаливых» сбоев.
- 🔌 Зависимость от подключения. Задание существует, пока расширение подключено и активно. Отключили расширение — задание пропало из списка, и платформа его не запускает.
- 📦 Жизненный цикл. Расширение переживает обновление типовой конфигурации. Но если в новом релизе изменился объект, который ваш код использует, задание упадёт уже при выполнении, а не при обновлении.
Механизм расширений появился в платформе 8.3.6, а набор объектов, которые в них можно добавлять, с каждой версией рос. Если в дереве расширения нет ветки регламентных заданий, проверьте режим совместимости расширения и версию платформы: на актуальных релизах 8.3 ветка доступна.
Что проверить до создания задания
Пять минут на подготовку снимают большую часть проблем из раздела про ошибки.
| Что проверить | Где | Зачем |
|---|---|---|
| Режим совместимости расширения | Свойства корня расширения | Должен поддерживать добавление регламентных заданий |
| Безопасный режим | Конфигурация → Расширения конфигурации, флажок у расширения | Решает, сможет ли код работать с файлами и внешними ресурсами |
| Тип базы | Файловая или клиент-серверная | В файловой задания выполняются только при открытом сеансе |
| Блокировка регламентных заданий | Свойства информационной базы в консоли кластера | Если флажок стоит, ни одно задание не стартует |
| Наличие БСП | Подсистема СтандартныеПодсистемы в основной конфигурации | Определяет, как пользователь будет управлять заданием |
Если в базе работают пользователи, заранее договоритесь о моменте подключения расширения. Применение изменений расширения к базе не требует монопольного режима, но открытые сеансы увидят новое задание только после переподключения.
Отдельно решите, от чьего имени задание будет выполняться. Под пользователем с полными правами меньше сюрпризов с доступом к данным, но шире поле для ошибок в коде. Под отдельным служебным пользователем — прозрачнее журнал и понятнее, кто что изменил.
Добавление регламентного задания в расширение: пошагово
Шаг 1. Серверный общий модуль с методом
- В дереве расширения откройте
Общие → Общие модулии добавьте новый модуль, напримерРасш1_РегламентныеЗадания. - В свойствах модуля включите флажок «Сервер». Флажок «Глобальный» не ставьте, «Клиент (управляемое приложение)» — тоже.
- Напишите экспортную процедуру без параметров:
Процедура ВыгрузкаОстатков() Экспорт
// Для конфигураций на БСП: проверка, что задание можно выполнять
ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(
Метаданные.РегламентныеЗадания.Расш1_ВыгрузкаОстатков);
ИмяСобытия = НСтр("ru = 'Расш1. Выгрузка остатков'");
ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Информация,
, , "Старт выполнения");
Попытка
Количество = ВыполнитьВыгрузку();
ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Информация,
, , СтрШаблон("Выгружено позиций: %1", Формат(Количество, "ЧН=0; ЧГ=0")));
Исключение
ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Ошибка,
, , ТекстОшибки);
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Функция ВыполнитьВыгрузку()
// Ваша прикладная логика; возвращает число обработанных строк
Возврат 0;
КонецФункции
Вызов ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания нужен только в конфигурациях на БСП. Он проверяет, что база не заблокирована на время обновления и задание разрешено. Если БСП в конфигурации нет, удалите эти строки.
Задание, созданное ниже, ещё не существует, когда вы пишете код. Поэтому сначала создайте объект задания (шаг 2), а потом сохраняйте модуль — иначе синтаксический контроль не найдёт Метаданные.РегламентныеЗадания.Расш1_ВыгрузкаОстатков.
Шаг 2. Объект регламентного задания
- В дереве расширения правой кнопкой по ветке
Общие → Регламентные задания→ «Добавить». - Задайте имя (префикс подставится сам) и синоним — синоним пользователь увидит в списке заданий.
- В свойстве «Имя метода» нажмите кнопку выбора и укажите
Расш1_РегламентныеЗадания.ВыгрузкаОстатков. В списке выбора показываются только экспортные процедуры серверных модулей. - Включите «Предопределённое» — тогда экземпляр задания создастся в базе автоматически.
- Включите «Использование», если задание должно работать сразу после подключения. Для заданий, которые пользователь включает сам, оставьте флажок снятым.
- При необходимости заполните «Ключ»: два экземпляра с одинаковым ключом одновременно выполняться не будут.
- Задайте «Количество повторов при аварийном завершении» и «Интервал повтора при аварийном завершении» (в секундах). Для выгрузки во внешнюю систему разумно 3 повтора с интервалом 300 секунд.
Шаг 3. Расписание и применение к базе
- Откройте ссылку «Расписание» в палитре свойств и задайте расписание по умолчанию (форматы — в следующем разделе).
- Сохраните расширение:
Конфигурация → Расширения конфигурации, выделите расширение → «Конфигурация» → «Обновить конфигурацию базы данных», либо F7 в окне расширения. - Перезапустите сеансы 1С:Предприятия, которые должны увидеть задание.
Непредопределённое задание из кода
Если экземпляров должно быть несколько (например, выгрузка по каждой организации со своими параметрами), флажок «Предопределённое» не ставят, а экземпляры создают программно:
Задание = РегламентныеЗадания.СоздатьРегламентноеЗадание(
Метаданные.РегламентныеЗадания.Расш1_ВыгрузкаОстатков);
Задание.Наименование = "Выгрузка остатков: ООО Север";
Задание.Параметры.Добавить(Организация.УникальныйИдентификатор());
Задание.Использование = Истина;
Задание.Записать();
Параметры передаются в процедуру по порядку, поэтому для такого задания метод должен их принимать. У предопределённого задания параметров нет.
Расписания: какие бывают и как их записать
Расписание по умолчанию задают в окне «Расписание» с вкладками «Общие», «Дневное», «Недельное», «Месячное». То же можно сделать кодом через объект РасписаниеРегламентногоЗадания.
| Нужно | Настройка в окне | Свойства в коде |
|---|---|---|
| Каждые 15 минут круглосуточно | Дневное: повторять каждые 900 секунд | ПериодПовтораДней = 1, ПериодПовтораВТечениеДня = 900 |
| Раз в сутки в 02:30 | Дневное: время начала 02:30 | ПериодПовтораДней = 1, ВремяНачала = '00010101023000' |
| По будням с 9 до 18 каждый час | Недельное: пн–пт; дневное: 3600 с, с 09:00 до 18:00 | ДниНедели, ПериодПовтораВТечениеДня = 3600, ВремяНачала, ВремяКонца |
| 1-го числа каждого месяца | Месячное: день месяца 1 | ДеньВМесяце = 1 |
Пример установки расписания «по будням каждый час с 9 до 18»:
Расписание = Новый РасписаниеРегламентногоЗадания;
Расписание.ПериодПовтораДней = 1;
Расписание.ПериодПовтораВТечениеДня = 3600;
Расписание.ВремяНачала = '00010101090000';
Расписание.ВремяКонца = '00010101180000';
ДниНедели = Новый Массив;
Для НомерДня = 1 По 5 Цикл
ДниНедели.Добавить(НомерДня);
КонецЦикла;
Расписание.ДниНедели = ДниНедели;
Задание = РегламентныеЗадания.НайтиПредопределенное(
Метаданные.РегламентныеЗадания.Расш1_ВыгрузкаОстатков);
Задание.Расписание = Расписание;
Задание.Записать();
💡 Расписание из Конфигуратора — только значение по умолчанию. После того как администратор изменит его в режиме 1С:Предприятия, новое расписание хранится в базе. Правка в расширении и повторное применение не перезапишут его у уже созданного экземпляра.
В конфигурациях на БСП пользователь управляет заданием в форме Администрирование → Обслуживание → Регламентные операции → Регламентные и фоновые задания. Задание из расширения появится там под своим синонимом: можно включить, поменять расписание, указать пользователя и запустить вручную.
Журнал регистрации: как фиксировать результат и сбои
Платформа сама пишет в журнал регистрации события старта, завершения и аварийного завершения регламентного задания. Но в них нет вашей прикладной информации: сколько строк обработано, на каком документе упало. Поэтому пишите свои события.
- 🏷️ Своё имя события с префиксом расширения, например
Расш1. Выгрузка остатков. По нему удобно фильтровать журнал. - 📊 Уровень.
Информация— для старта и итогов,Предупреждение— для пропущенных записей,Ошибка— для исключений. - 🧾 Полный текст ошибки — через
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), а не черезОписаниеОшибки(): в подробном представлении есть стек вызовов. - 🔁 Повторный вызов исключения. После записи в журнал вызывайте
ВызватьИсключение. Иначе платформа сочтёт выполнение успешным и не включит механизм повторов при аварийном завершении.
Не глушите исключения пустым Попытка … Исключение КонецПопытки. Задание будет «успешно» отрабатывать каждый раз, а данные перестанут выгружаться — и узнаете вы об этом от пользователей.
Если задание обрабатывает много объектов, ловите ошибку на уровне одного объекта, пишите её в журнал и идите дальше. Итоговое исключение вызывайте, только если сбой критический для всего прогона.
Отладка и проверка задания
Отлаживать сразу из расписания неудобно: ждать следующего запуска долго. Обычно идут в три этапа.
1. Проверка логики вызовом процедуры напрямую. Создайте внешнюю обработку
или временную команду, которая на сервере вызывает Расш1_РегламентныеЗадания.ВыгрузкаОстатков(). Точки останова в модуле расширения срабатывают как обычно.
2. Запуск как фонового задания. Так код выполняется в том же окружении, что и при регламентном старте, — без клиентского контекста:
ФоновыеЗадания.Выполнить("Расш1_РегламентныеЗадания.ВыгрузкаОстатков", ,
, "Тестовый запуск выгрузки");
Для отладки в клиент-серверной базе сервер 1С должен быть запущен с ключом -debug, а в Конфигураторе в окне Отладка → Подключение нужно включить автоматическое подключение к фоновым заданиям. В файловой базе фоновые задания выполняются в процессе клиента, и отладчик подключается к ним проще.
3. Проверка по расписанию. В БСП-форме регламентных заданий есть команда немедленного запуска. После неё смотрите состояние в списке и журнал регистрации с отбором по вашему имени события.
Файловая база выполняет регламентные задания, только пока открыт хотя бы один сеанс 1С:Предприятия. Для постоянной работы можно держать отдельный сеанс, запущенный с ключом /AllowExecuteScheduledJobs -Force. Закрыли его — задания встали.
Почему задание из расширения не выполняется
Эти сбои встречаются именно с заданиями в расширениях и не следуют напрямую из шагов выше.
Ещё одна ловушка — копия рабочей базы. Если вы развернули копию для теста и не заблокировали в ней регламентные задания, задание из расширения начнёт выгружать данные в ту же внешнюю систему, что и рабочая база. Блокировку ставьте сразу после развёртывания копии.
Частые вопросы
Можно ли вызвать из задания расширения процедуру основной конфигурации?
Что будет с заданием, если удалить расширение?
Как остановить задание, не отключая расширение?
Использование = Ложь и запишите задание. Расширение и остальные его доработки продолжат работать.