До сих пор в ядре CMS 1C-Битрикс не добавлена возможность сортировки по наличию товара на складе, т.е. не по количеству, а по наличию — факту того если ли товар на складе или он отсутствует. Пока на просьбу клиента, чтобы при любой сортировке выдачи каталога товаров те товары, которых нет на складе были в конце списка приходится решать с помощью нижепредставленного велосипеда.1. Нужно создать свойство в информационном блоке, где должна быть такая фильтрация — IS_AVAILABLE . Это свойство можно сделать просто символьного типа. Оно у нас будет принимать всего 2 значения: 0 — если товара нет на складе, 1- если товар есть на складе.
2. Нужно сделать так, чтобы при заведении нового товара или обновлении старого товара свойство IS_AVAILABLE автоматически обновлялось. Этого можно добиться, добавив такой код в файл /bitrix/php_interface/init.php (либо в файл /bitrix/php_interface/Ваш_идентификатор_сайта/init.php при использовании многосайтовости) .
AddEventHandler("catalog", "OnBeforeProductAdd", "OnBeforeIBlockElement"); AddEventHandler("catalog", "OnBeforeProductUpdate", "OnBeforeIBlockElement"); function OnBeforeIBlockElement($ID, $arFields = false) { if(is_array($ID)) { $arFields = $ID; $IS_AVAILABLE = $arFields["QUANTITY"] > 0? 1: 0; $ELEMENT_ID = $arFields["ID"]; CIBlockElement::SetPropertyValuesEx($ELEMENT_ID, false, array("IS_AVAILABLE" => $IS_AVAILABLE)); } elseif(is_int($ID) && is_array($arFields) && isset($arFields["QUANTITY"])) { $IS_AVAILABLE = $arFields["QUANTITY"] > 0? 1: 0; $ELEMENT_ID = $ID; CIBlockElement::SetPropertyValuesEx($ELEMENT_ID, false, array("IS_AVAILABLE" => $IS_AVAILABLE)); } }
3. Нужно добавить сортировку в компонент bitrix:catalog.section и поставить ее первой. Сортировка должна быть по PROPERTY_IS_AVAILABLE , направление DESC.
4. Если у вас уже есть записанные товары и вы не хотите их пересохранять вручную, чтобы свойство перезаписалось, то нужно запустить примерно такой скрипт:
<? require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php"); ?> <? set_time_limit(0); CModule::IncludeModule("iblock"); $arSelect = Array("ID", "NAME", "DATE_ACTIVE_FROM", "CATALOG_QUANTITY"); $arFilter = Array("IBLOCK_ID"=>1); $res = CIBlockElement::GetList(Array(), $arFilter, false, Array("nPageSize"=>10000000), $arSelect); while($ob = $res->GetNext()) { $IS_AVAILABLE = $ob["CATALOG_QUANTITY"] > 0? 1: 0; $ELEMENT_ID = $ob["ID"]; CIBlockElement::SetPropertyValuesEx($ELEMENT_ID, false, array("IS_AVAILABLE" => $IS_AVAILABLE)); } ?> <?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>
В этом скрипте вам нужно заменить в $arFilter = Array(«IBLOCK_ID»=>1); идентификатор инфоблока, на тот, который должен быть у вас.
После этого у вас должна заработать эта сортировка.
К слову говоря, от пользователей платформы такая идея есть http://idea.1c-bitrix.ru/sortirovka-tovarov-po-nalichiyu-na-sklade/ , так что вполне возможно что функционал будет когда-либо выполнен штатным образом. Но пока можно действовать только указанным выше способом.