В Bitrix есть несколько способов решить данную задачу. В данном ответе рассмотрим два самых простых и распространенных способа.
1. Использование сортировки в SQL запросе:
В предустановленной настройке, товары в базе данных могут храниться в таблице "b_catalog_price", где хранится информация о ценах. Мы можем изменить запрос к базе данных, чтобы товары с ценой 0 или пустой ценой имели более высокий порядок сортировки и поэтому выводились в конце списка.
$arParams = array( // ... 'ELEMENT_SORT_FIELD' => 'CATALOG_PRICE_1', 'ELEMENT_SORT_ORDER' => 'ASC', // ... ); // Проверяем значения цены if ($arParams['ELEMENT_SORT_FIELD'] === 'CATALOG_PRICE_1') { $arParams['ELEMENT_SORT_FIELD'] .= ', CATALOG_PRICE_1 IS NULL, CATALOG_PRICE_1 = 0'; // Если нужен порядок от большего к меньшему, используйте DESC $arParams['ELEMENT_SORT_ORDER'] .= ', ASC, ASC'; } // Выводим список товаров $APPLICATION->IncludeComponent( "bitrix:catalog.section", "", $arParams, // ... );
2. Использование фильтрации в коде:
$arParams = array( // ... 'FILTER_NAME' => 'myCatalogFilter', 'ELEMENT_SORT_FIELD' => 'SORT', 'ELEMENT_SORT_ORDER' => 'ASC', // ... ); // Определяем фильтр $myCatalogFilter = array( 'CATALOG_PRICE_1' => array(0, false), ); // Выводим список товаров $APPLICATION->IncludeComponent( "bitrix:catalog.section", "", $arParams, // ... );
В обоих примерах мы делаем подстройку настроек компонента "bitrix:catalog.section" для сортировки товаров по полю "CATALOG_PRICE_1" (настраивается в параметрах компонента), которое предполагается использовать для хранения цены. Затем настраиваем сортировку таким образом, чтобы товары с ценой 0 или пустой ценой выводились в конце списка.
Выбор конкретного способа зависит от сложности сайта и требований к его производительности, поэтому можно выбирать оптимальный вариант для вашего случая.