КОНСТРУКТОР
Планировщик задач
Планировщик — серверный механизм, который запускает ваш код по расписанию, без участия человека и без открытого браузера. Типичные задачи:
- выгрузка и загрузка данных из внешних систем;
- отправка ежедневных писем или отчётов;
- очистка и архивация старых записей;
- пересчёты и служебные операции ночью.
Планировщик запускается автоматически вместе с сервером и сам подгружает задачи из базы.
Планировщики создаются в Конструкторе: раздел Планировщик → Добавить. Внутри одного планировщика может быть много задач.
# Шапка планировщика
| Элемент | Что делает |
|---|---|
| Имя планировщика | Название |
| Индикатор Сервер запущен / Сервер остановлен | Зелёная точка — задачи выполняются; серая — нет |
| Задач: N | Сколько задач в планировщике |
| След: hh:mm | Время ближайшего запуска |
| Запустить сервер (зелёная) | Включает выполнение задач |
| Остановить сервер | Выключает выполнение задач |
| 🗑 | Удаляет планировщик целиком (диалог «Удалить планировщик? Это действие необратимо.») |
# Экран «Задачи планировщика»
Список задач в виде карточек. Кнопка Новая задача (зелёная, с плюсом).
На каждой карточке:
| Элемент | Что показывает |
|---|---|
| Зелёная или серая точка | Задача активна / выключена. Выключенная карточка показывается бледнее |
| Название задачи | Имя |
| Компонент | Какой компонент выполняется |
| Расписание | Описание расписания словами, например «Каждые 5 минут» |
| След. запуск: | Когда задача выполнится в следующий раз |
| Запусков: | Сколько раз она уже выполнялась |
| Последний запуск: | успех (зелёная галочка) или ошибка (красный крест) |
| Кнопка ▶ / ⏸ | Включить или выключить задачу |
| Редактировать | Открывает форму задачи |
| Лог | Открывает журнал выполнений. Иконка меняется по результату последнего запуска |
| 🗑 | Удалить задачу (диалог «Удалить задачу? Это действие необратимо.») |
Если задач нет: «Нет созданных задач» и подсказка «Нажмите "Новая задача" для создания».
# Форма задачи
# Основное
| Поле | Что означает |
|---|---|
| Название задачи | Имя, по которому вы узнаёте задачу |
| Компонент | Что именно выполнять. Значение по умолчанию — «Выберите компонент» |
| Описание | Свободный текст |
| Активна (задача будет выполняться по расписанию) | Галочка. Снятая галочка отключает выполнение |
Код берётся из подключённого компонента. См. Компоненты.
# Режим запуска
| Режим | Что происходит |
|---|---|
| 1 · Один раз | Задача выполнится один раз и отключится |
| N · Несколько | Задача выполнится указанное число раз (поле Максимальное количество запусков) |
| ∞ · Непрерывно | Задача выполняется по расписанию бесконечно |
Для режимов «Один раз» и «Несколько» появляется дополнительное поле количества запусков.
# Расписание
Выберите тип, затем заполните поля типа:
| Тип | Настройки | Пример |
|---|---|---|
| Интервал | Интервал (секунды) | 300 — каждые 5 минут |
| Ежедневно | Время запуска | 02:00 |
| Еженедельно | День недели, Время | Понедельник, 09:00 |
| Ежемесячно | День месяца, Время | 1, 00:00 |
| Cron | Cron выражение | 0 */6 * * * — каждые 6 часов |
Примеры Cron-выражений:
*/5 * * * * каждые 5 минут
0 */2 * * * каждые 2 часа
0 0 * * 0 каждое воскресенье в полночь
0 0 1 * * 1-го числа каждого месяца в полночь# Код задачи
Задача вызывает функцию из компонента. Имя функции — onSchedule (если её нет — вызывается main). Функция получает два аргумента: formApi и объект задачи.
// Компонент «Синхронизация товаров»
async function onSchedule(formApi, schedulerTask) {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
for (const item of data) {
await formApi.create('Справочник', 'Товары', {
'Наименование': item.name,
'Артикул': item.sku,
'Цена': item.price
});
}
const ctx = formApi.getContext();
// ctx = { currentUser, task: { id, name, componentId, ... } }
return `Синхронизировано: ${data.length}`;
}# Журнал выполнений («Лог»)
Каждая задача ведёт журнал последних 50 запусков. Кнопка Лог в карточке задачи открывает диалог с записями.
Каждая запись содержит:
| Элемент | Что показывает |
|---|---|
| Статус | Успех или ошибка |
| Время и длительность | Когда выполнялось и сколько миллисекунд заняло |
Вывод console | То, что код напечатал через console.log, warn, error |
| Возвращено: | Значение, которое вернула функция |
| Ошибка: | Текст ошибки и стек вызова, если выполнение упало |
Если задача ещё ни разу не выполнялась: «Задача ещё не выполнялась» и «Журнал появится после первого запуска планировщика». Кнопка Закрыть закрывает диалог.
Журнал обновляется сам — открытый лог показывает новые выполнения без перезагрузки страницы.
# Что доступно в коде задачи
| Доступно | Недоступно |
|---|---|
formApi.create, update, delete, read, readList | Работа с табличными частями (getTabularSection и подобные) |
| Отправка почты, вызовы внешних сервисов | getValue / setValue — в серверном контексте нет формы |
getContext() → { currentUser, task } | post / unpost — проведение делается записью поля «Проведён» |
Особенности:
- код выполняется в изолированном окружении с таймаутом;
- ошибка одной задачи не останавливает планировщик;
- после ошибки следующий запуск задачи переносится на минуту;
read()не разворачивает ссылочные реквизиты автоматически, как в интерфейсе.
# Надёжность и производительность
| Свойство | Значение |
|---|---|
| Проверка расписания | Каждую 1 секунду |
| Рекомендуемый минимальный интервал | 60 секунд |
| Счётчики и журнал | Сохраняются автоматически после каждого выполнения |
| Влияние на конфигурацию | Статистика выполнения — не изменение конфигурации, версия не меняется |
# Частые проблемы
| Проблема | Что проверить |
|---|---|
| Задача не выполняется | Запущен ли сервер (зелёный индикатор), стоит ли галочка Активна, верно ли расписание |
| Ошибка выполнения | Синтаксис JavaScript, использование await для асинхронных операций, журнал Лог |
| Компонент не найден | Компонент существует и содержит код |
| Планировщик не запускается | Ошибки в консоли сервера, занят ли порт, загружены ли метаданные |
