Словарь
← Словарь03.a / Термин
class· Битрикс· Агент Битрикс· CAgent· Битрикс агент

CAgent (агент Битрикс)

CAgent — механизм фоновых задач в Битрикс, выполняемых при запросах к сайту. Как добавить агент через CAgent::AddAgent(), параметры, отличие от cron.

Категория
Битрикс
Оригинал
CAgent (Агент) · en
Обновлено
27 июн. 2026
Теги
3

CAgent — класс модуля main в 1С-Битрикс, реализующий механизм псевдо-планировщика задач («агентов»). В отличие от системного cron, агенты не запускаются по расписанию операционной системы — они выполняются при обычных HTTP-запросах к сайту в момент, когда наступает их время. Битрикс проверяет очередь агентов при каждом запросе и запускает те, у которых время следующего запуска (NEXT_EXEC) меньше или равно текущему времени.

Как работает механизм агентов Битрикс

При каждом HTTP-запросе к сайту Битрикс выполняет проверку таблицы b_agent. Если находится запись, у которой NEXT_EXEC <= NOW() и ACTIVE = 'Y', соответствующая PHP-функция или статический метод вызывается прямо в рамках текущего запроса. После выполнения NEXT_EXEC обновляется на NOW() + AGENT_INTERVAL.

Агент-функция обязана возвращать своё собственное имя в виде строки — это сигнал Битриксу перепланировать агент на следующий интервал. Если функция возвращает пустую строку или null, агент автоматически деактивируется.

Регистрация агента через CAgent::AddAgent

<?php

// Регистрация агента (обычно в init.php или обработчике события установки модуля)
\CAgent::AddAgent(
    '\Local\User\BirthdayCouponSender::runAgent();', // Имя функции/метода
    'main',   // Модуль-владелец
    'N',      // Переодический агент: Y — да, N — однократный
    86400,    // Интервал в секундах (86400 = 1 сутки)
    '',       // Дата первого запуска (пусто — сейчас)
    'Y'       // Активен: Y/N
);

Проверка существующего агента перед регистрацией:

<?php

$agentName = '\Local\User\BirthdayCouponSender::runAgent();';

$existing = \CAgent::GetList([], ['NAME' => $agentName])->Fetch();
if (!$existing) {
    \CAgent::AddAgent($agentName, 'main', 'N', 86400, '', 'Y');
}

Агент-метод, который правильно возвращает своё имя:

<?php

public static function runAgent(): string
{
    try {
        self::sendCoupons();
    } catch (\Throwable $e) {
        self::log('error', [
            'message' => $e->getMessage(),
            'file'    => $e->getFile(),
            'line'    => $e->getLine(),
        ]);
    }

    return self::AGENT_NAME; // '\Local\User\BirthdayCouponSender::runAgent();'
}

Параметры CAgent::AddAgent

ПараметрОписание
$nameИмя PHP-функции или статического метода со скобками и точкой с запятой: 'MyClass::myMethod();'
$moduleМодуль-владелец (влияет на удаление агентов при деинсталляции модуля)
$periodY — периодический, N — однократный (выполнится один раз и деактивируется)
$intervalИнтервал в секундах между запусками
$datecheckДата первого запуска в формате d.m.Y H:i:s. Пустая строка — немедленно.
$activeY — активен, N — создать, но не запускать

Отличие CAgent от системного crontab

КритерийCAgentСистемный cron
ЗапускПри HTTP-запросах к сайтуПо расписанию ОС, независимо от трафика
Точность времени±несколько минут (зависит от трафика)Точно по расписанию (до минуты)
ТребованияТолько БитриксДоступ к crontab на сервере
Работа при простоеНе запускается, если нет посетителейЗапускается всегда
РесурсыВыполняется в процессе PHP FPM, замедляет запросОтдельный процесс, не влияет на HTTP

Когда использовать CAgent: для несрочных фоновых задач на сайтах с постоянным трафиком, где нет доступа к crontab хостинга (например, на виртуальном хостинге). Подходит для индексации, отправки уведомлений, пересчёта статистики.

Когда использовать crontab: для задач с точным временем запуска, тяжёлых обходов больших таблиц, скриптов с длительным временем выполнения. Системный cron не замедляет HTTP-запросы пользователей и гарантирует запуск даже при нулевом трафике.

Типичная ошибка: агент-функция не возвращает своё имя. В этом случае после первого выполнения Битрикс деактивирует агент, и задача никогда не запустится повторно. Всегда заканчивайте агент-функцию строкой return 'MyClass::myMethod();';.