Как в каталоге сделать сортировку по названию и цене?

Вопрос задан: 24 мая 2026 в 03:05 | Задайте свой вопрос

Использованные MCP инструменты: searchDocs, liveApiFindFunction, liveApiGetFunctionCode, liveApiGetClassCode, liveApiListComponents, liveApiFindByReflection
Просмотров:

В компонентах каталога 1С-Битрикс (bitrix:catalog, bitrix:catalog.section, bitrix:catalog.top и др.) сортировка элементов управляется через группы параметров ELEMENT_SORT_*. Рассмотрим оба варианта.

1. Сортировка через настройки компонента (административный интерфейс)

При редактировании страницы или компонента в публичной части откройте параметры компонента и найдите вкладку Источник данных. Там есть следующие параметры:

  • ELEMENT_SORT_FIELD — поле для первой сортировки;
  • ELEMENT_SORT_ORDER — направление сортировки (ASC — по возрастанию, DESC — по убыванию);
  • ELEMENT_SORT_FIELD2 — поле для второй сортировки (при равенстве значений первого поля);
  • ELEMENT_SORT_ORDER2 — направление второй сортировки.

2. Допустимые значения для полей сортировки

В параметр ELEMENT_SORT_FIELD можно передавать:

  • name — сортировка по названию элемента (полю NAME инфоблока);
  • sort — сортировка по индексу сортировки (SORT);
  • id — сортировка по ID элемента;
  • active_from — по дате начала активности;
  • timestamp_x — по дате последнего изменения;
  • created — по дате создания;
  • CATALOG_PRICE_1 — сортировка по цене (где 1 — ID типа цены, например «Розничная цена»);
  • SCALED_PRICE_1 — сортировка по масштабированной цене (рекомендуется для типов цен с разным количеством знаков после запятой);
  • PROPERTY_XXX — сортировка по пользовательскому свойству с кодом XXX.

3. Примеры настройки

Сортировка по названию (по возрастанию, A→Я):

ELEMENT_SORT_FIELD = name
ELEMENT_SORT_ORDER = ASC

Сортировка по цене (сначала дешёвые):

ELEMENT_SORT_FIELD = CATALOG_PRICE_1
ELEMENT_SORT_ORDER = ASC

Сортировка по цене (сначала дорогие):

ELEMENT_SORT_FIELD = CATALOG_PRICE_1
ELEMENT_SORT_ORDER = DESC

Сначала по названию, при совпадении — по цене (от меньшей к большей):

ELEMENT_SORT_FIELD  = name
ELEMENT_SORT_ORDER  = ASC
ELEMENT_SORT_FIELD2 = CATALOG_PRICE_1
ELEMENT_SORT_ORDER2 = ASC

4. Интерактивная сортировка на странице каталога (пользовательская)

Если нужно дать возможность пользователю самому выбирать сортировку (по названию, цене, новизне), используется компонент bitrix:catalog.smart.filter в связке с сортировкой через $_REQUEST. В шаблоне компонента каталога добавляется форма переключения сортировки, а значения передаются через URL-параметры sort и order.

Типовой код переключателя сортировки в шаблоне каталога:

<?php
// Получаем текущие параметры сортировки из URL
$sortField = $_REQUEST['sort'] ?? 'sort';
$sortOrder = $_REQUEST['order'] ?? 'asc';
?>
<div class="catalog-sorter">
    <a href="?sort=name&order=asc">Название (А-Я)</a>
    <a href="?sort=name&order=desc">Название (Я-А)</a>
    <a href="?sort=CATALOG_PRICE_1&order=asc">Цена (по возрастанию)</a>
    <a href="?sort=CATALOG_PRICE_1&order=desc">Цена (по убыванию)</a>
</div>

Затем в файле result_modifier.php шаблона компонента нужно подменить параметры сортировки перед вызовом CIBlockElement::GetList:

<?php
if (isset($_REQUEST['sort']))
{
    $arParams['ELEMENT_SORT_FIELD'] = $_REQUEST['sort'];
    $arParams['ELEMENT_SORT_ORDER'] = ($_REQUEST['order'] ?? 'asc') === 'desc' ? 'DESC' : 'ASC';
}
?>

5. Программная сортировка через CIBlockElement::GetList

Если вы работаете напрямую с API (модуль iblock, класс CIBlockElement, файл /bitrix/modules/iblock/classes/mysql/iblockelement.php), сортировка задаётся первым параметром метода GetList:

<?php
$arSort = [
    'NAME'          => 'ASC',   // по названию (A→Я)
    'CATALOG_PRICE_1' => 'ASC', // затем по цене (сначала дешёвые)
];
$dbElements = CIBlockElement::GetList(
    $arSort,
    $arFilter,
    false,
    $arNavParams,
    $arSelect
);
?>

Важно: для сортировки по цене через CIBlockElement::GetList необходимо, чтобы модуль catalog был подключён (CModule::IncludeModule('catalog')).

6. Сортировка через D7 ORM (Bitrix\Iblock\ElementTable)

<?php
use Bitrix\Iblock\ElementTable;
$result = ElementTable::getList([
    'order' => [
        'NAME'            => 'ASC',
        'CATALOG_PRICE_1' => 'ASC',
    ],
    'filter' => ['IBLOCK_ID' => $iblockId],
    'select' => ['ID', 'NAME'],
]);
?>

Если у вас остались вопросы по конкретному компоненту или нестандартному кейсу — уточните, какой именно компонент вы используете и какую сортировку хотите реализовать.