Скрипт обновления свойства инфоблока
Для начала напишем скрипт, который будет обновлять значение свойства. Получаем 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 секунд).
И активируем агента в командной PHP строке:
CAgent::AddAgent("UpdateAvPropAgent();");
Само собой, обязательно переключите выполнение всех агентов на cron, чтобы сайт не тормозил, используя хиты пользователей