Главная » Разработка Битрикс » Полезное » CAgent — регистрация и частые ошибки агентов в Битрикс

CAgent — регистрация и частые ошибки агентов в Битрикс

Схема регистрации и работы агента через CAgent::AddAgent в 1С-Битрикс

Агенты в 1С-Битрикс — механизм отложенного и периодического выполнения кода, встроенный в ядро с самого начала. Разберём CAgent: как зарегистрировать агент, какие требования предъявляются к функции-обработчику и почему агент, забытый после отладки, может годами незаметно грузить сервер.

Регистрация агента

<?php

CAgent::AddAgent(
    'syncStockBalances();',      // вызываемая функция как строка
    'my.module',                 // модуль, к которому привязан агент
    'N',                         // периодичность: N — по интервалу
    3600,                        // интервал в секундах
    '',                          // дата первого запуска (пусто — сейчас)
    'Y',                         // активен
    '',
    50                           // сортировка среди агентов
);

Ключевая особенность API агентов — функция передаётся не как callable, а как строка PHP-кода, которая будет выполнена через eval в момент срабатывания. Отсюда следует требование к сигнатуре: функция должна быть либо глобальной, либо доступной в этой строке без дополнительного контекста (например, статический метод класса).

Обязательное требование: функция должна возвращать себя

<?php

function syncStockBalances(): string
{
    // ... логика синхронизации остатков ...

    return 'syncStockBalances();'; // агент выполнится снова через заданный интервал
}

Это правило регулярно ломает агенты, написанные без документации под рукой: если функция ничего не возвращает или возвращает пустую строку, агент автоматически деактивируется после первого же выполнения. Возврат строки с вызовом самой себя — единственный способ указать системе, что агент должен сработать снова.

Нужна помощь с Битрикс?





    Обработка ошибок внутри агента

    <?php
    
    function syncStockBalances(): string
    {
        try {
            // ... логика ...
        } catch (\Throwable $e) {
            AddMessage2Log('Agent syncStockBalances error: ' . $e->getMessage(), 'my.module');
        }
    
        return 'syncStockBalances();'; // выполнится снова, даже если была ошибка
    }

    Исключение, вылетевшее из тела функции без перехвата, прерывает выполнение агента до оператора return — агент деактивируется, как и при пустом возврате. Оборачивание логики в try/catch с логированием — обязательная практика для агентов, которые должны продолжать работать даже после единичного сбоя.

    Просмотр и управление агентами

    Список зарегистрированных агентов и время их следующего запуска доступны в разделе Настройки → Инструменты разработчика → Агенты. Там же можно вручную запустить агент для проверки, деактивировать его без удаления кода или временно изменить интервал.

    Программное удаление агента

    <?php
    
    CAgent::RemoveAgent('syncStockBalances();', 'my.module');

    Важно передавать точно ту же строку функции, что была указана при регистрации, — по ней и по модулю агент ищется в таблице. Удаление агента стоит выполнять в обработчике деинсталляции модуля, чтобы он не оставался в системе после удаления самого функционала.

    Забытый агент после отладки

    Частый практический сценарий: разработчик временно регистрирует агент с коротким интервалом (например, 60 секунд) для отладки тяжёлой синхронизации, а после переноса на постоянный интервал забывает удалить старую регистрацию. В таблице агентов остаётся запись, продолжающая дёргать функцию каждую минуту месяцами, незаметно нагружая сервер. Стоит взять за правило проверять список активных агентов при подозрении на необъяснимую фоновую нагрузку.

    Требования к времени выполнения кроном

    Агенты запускаются не сами по себе, а при заходе на сайт любого посетителя (если не настроен запуск по cron) или по системному cron через agents.php. На проектах с низкой посещаемостью и без настроенного cron-задания агенты могут срабатывать значительно реже заданного интервала — стоит убедиться, что для критичных по времени агентов настроен именно cron, а не расчёт на визиты пользователей.

    Частые ошибки

    • Функция не возвращает строку самовызова. Агент автоматически деактивируется после первого выполнения.
    • Необработанное исключение внутри агента. Прерывает выполнение до return — тот же эффект деактивации.
    • Забытый отладочный агент с коротким интервалом. Годами создаёт незаметную фоновую нагрузку на сервер.
    • Расчёт на визиты вместо системного cron. Критичный по времени агент срабатывает непредсказуемо редко на малопосещаемых сайтах.

    Итог

    CAgent — простой, но требовательный к деталям механизм: функция-обработчик обязана возвращать строку своего повторного вызова, иначе агент молча деактивируется. Для стабильной работы критичных агентов нужен настроенный системный cron, а для предотвращения незаметной фоновой нагрузки — периодическая проверка списка активных агентов на предмет забытых отладочных записей.

    Нужна помощь с Битрикс?

    Исправим ошибку, доработаем сайт, ускорим Битрикс или поможем разобраться с проблемой.

    Услуги
    Инструменты
    База знаний