Задача: Каждый час нужно обновлять свойство элементов/товаров с типом строка "В наличии", вписывать в него либо "Да" либо "Нет" - согласно наличию товара на двух складах. Далее свойство используется в умном фильтре при выводе каталога.
Скрипт обновления свойства инфоблока
Для начала напишем скрипт, который будет обновлять значение свойства. Получаем 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();';
}
Далее идем в админку сайта, по пути "Настройки -> Настройки продукта -> Агенты" и добавляем нового агента:
- Устанавливаем время следующего запуска (можно оставить пустым, но лучше что-то вписать. Поле перезапишется после ближайшего запуска агента).
- Указываем, что агент использует модуль "iblock".
- Вписываем функцию агента, так же как назвали ее в init.php: UpdateAvPropAgent(); (обязательно с
(); на конце). - Указываем интервал, с которым агент будет выполняться. На скриншоте каждые 60 секунд но это слишком часто, поставьте раз в час (это 3600 секунд).
Само собой, обязательно переключите выполнение всех агентов на cron, чтобы сайт не тормозил, используя хиты пользователей