Создание агента в 1С-Битрикс, на реальном примере

Просмотров: 3689

Задача: Каждый час нужно обновлять свойство элементов/товаров с типом строка "В наличии", вписывать в него либо "Да" либо "Нет" - согласно наличию товара на двух складах. Далее свойство используется в умном фильтре при выводе каталога.

Скрипт обновления свойства инфоблока

Для начала напишем скрипт, который будет обновлять значение свойства. Получаем ID элементов нужного инфоблока и, зная этот ID, получаем остаток товара на складах с ID 6 и 13. Если остатки есть, у элемента обновляется свойство "В наличии" на значение "Да". Если остатков нет, свойство обновляется на "Нет".

use Bitrix\Main\Loader;

Loader::includeModule('iblock');

$dbGoods = CIBlockElement::GetList(
    false,
    array(
        'IBLOCK_ID' => '4', // ID инфоблока
        'ACTIVE' => 'Y' // Только активные
    ),
    false,
    false,
    array(
        'ID'
    )
);
while ($arGood = $dbGoods->Fetch()) {
    $hasOnStore = 0; // Счетчик наличия
    $storeRes = CCatalogStoreProduct::GetList(
        false,
        array(
            "PRODUCT_ID" => $arGood['ID'],
            'STORE_ID' => array(6, 13) // ID нужных складов
        ),
        false,
        false,
        array(
            "AMOUNT" // Нужно только количество
        )
    );
    while ($arStoreParam = $storeRes->Fetch()) {
        $hasOnStore += $arStoreParam['AMOUNT'];
    }
    $propertyValue = $hasOnStore > 0 ? 'Да' : 'Нет';

    CIBlockElement::SetPropertyValues(
        $arGood['ID'],
        4, // ID инфоблока
        $propertyValue, // Значение Да или Нет
        'ATT_NAL_FIL' // Код нужного свойства
    );
}

Запускаем этот скрипт в командной php-строке: убеждаемся в его работоспособности и в том, что он отрабатывает быстрее, чем за 10 минут.

Если скрипт отрабатывает долго, лучше не вешать его выполнение на агента и сделать запускаемым напрямую из crontab, средствами сервера. В моем случае, в каталоге более
60 000 товаров, скрипт отрабатывает за 20-30 секунд.

Создание агента в 1С-Битрикс

Для начала добавляем функцию агента в init.php (лучше через include_once отдельным файлом), модуль инфоблоков в нем не подключаем. В моем случае агент будет называться (его функция, точнее) UpdateAvPropAgent.

function UpdateAvPropAgent()
{
    $dbGoods = CIBlockElement::GetList(
        false,
        array(
            'IBLOCK_ID' => '4',
            'ACTIVE' => 'Y'
        ),
        false,
        false,
        array(
            'ID'
        )
    );
    while ($arGoods = $dbGoods->Fetch()) {
        $hasOnStore = 0;
        $storeRes = CCatalogStoreProduct::GetList(
            false,
            array(
                "PRODUCT_ID" => $arGoods['ID'],
                'STORE_ID' => array(6, 13)
            ),
            false,
            false,
            array(
                "AMOUNT"
            )
        );
        while ($arStoreParam = $storeRes->Fetch()) {
            $hasOnStore += $arStoreParam['AMOUNT'];
        }
        $propertyValue = $hasOnStore > 0 ? 'Да' : 'Нет';

        CIBlockElement::SetPropertyValues(
            $arGood['ID'],
            4, // ID инфоблока
            $propertyValue, // Значение Да или Нет
            'ATT_NAL_FIL' // Код нужного свойства
        );
    }
    return 'UpdateAvPropAgent();';
}

Далее идем в админку сайта, по пути "Настройки -> Настройки продукта -> Агенты" и добавляем нового агента:

Создание агента в 1С-Битрикс, на реальном примере
  • Устанавливаем время следующего запуска (можно оставить пустым, но лучше что-то вписать. Поле перезапишется после ближайшего запуска агента).
  • Указываем, что агент использует модуль "iblock".
  • Вписываем функцию агента, так же как назвали ее в init.php: UpdateAvPropAgent(); (обязательно с
    (); на конце).
  • Указываем интервал, с которым агент будет выполняться. На скриншоте каждые 60 секунд но это слишком часто, поставьте раз в час (это 3600 секунд).

И активируем агента в командной PHP строке:

CAgent::AddAgent("UpdateAvPropAgent();");

Само собой, обязательно переключите выполнение всех агентов на cron, чтобы сайт не тормозил, используя хиты пользователей

Стоимость разработки на 1С-Битрикс:

Индивидуальная разработка магазина

от 500 000 руб. от 5-ти недель

Разработка магазина на 1С-Битрикс с нуля. Дизайн, сборка и оптимизация производительности под конкретный проект и требования. Реализация любого функционала без ограничений готовых решений.

Запуск сайта на готовом решении

от 100 000 руб. от 7-ми дней

Вариант для тех, кто не хочет тратить много средств на индивидуальный проект, и не имеет серьезных требований к сайту. Магазин, быстро запускается на базе одного из 200-та готовых решений.

Мобильное приложение

от 500 000 руб. от 1-го месяца

Разработка кроссплатформенного мобильного приложения, которое не уступает нативным решениям как в производительности, так и пользовательском опыте. Публикуется в AppStore, GooglePlay и RuStore

Сайт компании

от 350 000 руб. от 1-го месяца

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

Инфресурс

от 400 000 руб. от 5-ти недель

Информационный ресурс любой сложности. Сайт для СМИ, городской портал или многопользовательская доска объявлений. Внутренние форумы, блоги- по необходимости.

Лечение сайтов от вирусов

от 40 000 руб. от 2-х дней

Выполню полную проверку сайта и окружения. В случае обнаружения вирусов проведу полный комплекс лечения проекта и закрытия лазеек.