Михаил Базаров Разработка на 1С-Битрикс Михаил Базаров

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

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

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

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

use Bitrix\Main\Loader;

Loader::includeModule('iblock');

$dbGoods = CIBlockElement::GetList(
    false,
    [
        'IBLOCK_ID' => '4', // ID инфоблока
        'ACTIVE' => 'Y'     // Только активные
    ],
    false,
    false,
    ['ID']
);
while ($arGood = $dbGoods->Fetch()) {
    $hasOnStore = 0; // Счетчик наличия
    $storeRes = CCatalogStoreProduct::GetList(
        false,
        [
            "PRODUCT_ID" => $arGood['ID'],
            'STORE_ID' => [6, 13] // ID нужных складов
        ],
        false,
        false,
        ["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,
        [
            'IBLOCK_ID' => '4',
            'ACTIVE' => 'Y'
        ],
        false,
        false,
        ['ID']
    );
    while ($arGood = $dbGoods->Fetch()) {
        $hasOnStore = 0;
        $storeRes = CCatalogStoreProduct::GetList(
            false,
            [
                "PRODUCT_ID" => $arGood['ID'],
                'STORE_ID' => [6, 13]
            ],
            false,
            false,
            ["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, чтобы сайт не замедлялся из-за хитов пользователей.

Как не создавать хаос в init.php

Встречаются проекты, где init.php разрастается до 5000 строк и более. Небольшая рекомендация, чтобы этого избежать.

Рядом с этим файлом создайте отдельные директории handlers, agents, functions и т.д., и подключайте файлы из них. Пример:

$arrInitFiles = [

    // АГЕНТЫ
    $_SERVER["DOCUMENT_ROOT"] . "/local/php_interface/agents/Говорящее_Название_Агента.php",
    $_SERVER["DOCUMENT_ROOT"] . "/local/php_interface/agents/Говорящее_Название_Агента2.php",

    // ОБРАБОТЧИКИ
    $_SERVER["DOCUMENT_ROOT"] . "/local/php_interface/handlers/Говорящее_Название_Обработчика.php",
    $_SERVER["DOCUMENT_ROOT"] . "/local/php_interface/handlers/Говорящее_Название_Обработчика2.php",

    // ФУНКЦИИ
    $_SERVER["DOCUMENT_ROOT"] . "/local/php_interface/functions/Говорящее_Название_Функции.php",
    $_SERVER["DOCUMENT_ROOT"] . "/local/php_interface/functions/Говорящее_Название_Функции2.php"

];

foreach ($arrInitFiles as $initFile) {
    if (file_exists($initFile)) {
        include_once($initFile);
    }
}

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

Услуги Стоимость разработки на 1С-Битрикс

Стоимость разработки сайта зависит от объёма и сложности проекта. Ниже приведены ориентировочные цены, как правило не выходят за обозначенные рамки. Срок разработки зависит от сложности проекта: как правило называю сроки с запасом.
Финальная стоимость и сроки разработки обговариваются на этапе обсуждения. Скачайте опросник на разработку, заполните как можно подробнее и вышлите удобным способом. После ознакомления смогу задать уточняющие вопросы и оценить проект.
Поддержка и доработки проектов
от 3 000 руб. от 1 часа

Выполнение доработок любой сложности. Поддержка, модернизация и расширение функционала существующих проектов. Решение задач: от мелких правок вёрстки до разработки новых модулей.

Подробнее
Сайт на готовом решении 1С-Битрикс
от 70 000 руб. от 5-ти дней

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

Подробнее
Индивидуальная разработка магазина
от 300 000 руб. от 5-ти недель

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

Подробнее
Мобильное приложение
от 300 000 руб. от 4-х недель

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

Подробнее
Инфоресурс
от 170 000 руб. от 3-х недель

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

Подробнее
Сайт компании
от 150 000 руб. от 2-х недель

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

Подробнее

Включено в стоимость разработки:

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

Блог-note Заметки по 1С-Битрикс