Как в Битрике товары у которых цена 0 или пустая, всегда выводить в конце списка?

В 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 или пустой ценой выводились в конце списка.

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