Меню

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

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

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

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

Для начала напишем скрипт, который будет обновлять значение свойства. Получаем 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, чтобы сайт не тормозил, используя хиты пользователей

Михаил Базаров 11.08.2024
Тоже самое на D7, при тестах работает чуть медленее. Примерно на 10-15 секунд дольше
Код
use Bitrix\Main\Loader;
use Bitrix\Iblock\ElementTable;
use Bitrix\Catalog\StoreProductTable;

function UpdateAvPropAgent()
{
    // Подключение необходимых модулей
    if (!Loader::includeModule('iblock') || !Loader::includeModule('catalog')) {
        return 'UpdateAvPropAgent();'; // Перезапуск агента в случае ошибки подключения модулей
    }

    // Получение списка активных элементов из инфоблока
    $elements = ElementTable::getList([
        'filter' => [
               'IBLOCK_ID' => 4, 
               'ACTIVE' => 'Y'
         ],
        'select' => ['ID']
    ]);

    while ($element = $elements->fetch()) {
        $hasOnStore = 0;

        // Проверка наличия остатков на определенных складах
        $storeProducts = StoreProductTable::getList([
            'filter' => [
                   'PRODUCT_ID' => $element['ID'], 
                   'STORE_ID' => [6, 13]
             ],
            'select' => ['AMOUNT']
        ]);

        while ($storeProduct = $storeProducts->fetch()) {
            $hasOnStore += $storeProduct['AMOUNT'];
        }

        // Установка значения свойства в зависимости от наличия остатков
        $propertyValue = $hasOnStore > 0 ? 'Да' : 'Нет';
        \CIBlockElement::SetPropertyValuesEx(
            $element['ID'], 
            4, 
            ['ATT_NAL_FIL' => $propertyValue]);
    }

    return 'UpdateAvPropAgent();'; // Перезапуск агента
}

Стоимость и сроки разработки сайтов и приложений

Окончательная стоимость и сроки разработки сайта формируются после обсуждения деталей на этапе заказа. Как правило, они редко выходят за обозначенные ниже рамки.

Интернет магазин: разработка с нуля от 400 000 руб.
от 5-ти недель

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

Интернет-магазин на готовом решении от 100 000 руб.
от 7-ми дней

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

Мобильное приложение от 400 000 руб.
от 1-го месяца

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

Опросник на разработку. После ознакомления, задам уточняющие вопросы и оценю проект по стоимости и срокам разработки.