Сортировка элементов инфоблоков по свойствам-спискам — важная задача при создании каталогов, фильтров и систем управления контентом в Битрикс. В отличие от простых свойств, работа со списками требует особого подхода, так как порядок элементов должен соответствовать не алфавиту или ID, а строгой последовательности, заданной администратором.
В этом руководстве вы найдете:
-
Правильный синтаксис для сортировки в компонентах и D7
-
Как Битрикс обрабатывает такие запросы "под капотом"
-
3 частые ошибки и способы их исправления
-
Оптимизацию для проектов с 10 000+ элементов
Материал особенно полезен для:
-
Разработчиков интернет-магазинов
-
Администраторов корпоративных сайтов
-
Специалистов по интеграции Битрикс
Пример из практики: при сортировке статусов заказов ("Новый", "В обработке", "Выполнен") важно сохранить именно эту последовательность, а не алфавитный порядок.
1. Основной способ сортировки
Для корректной сортировки по свойству типа "Список" используйте префикс propertysort_:
// В настройках компонента
"SHOW_ALL_WO_SECTION" => "Y",
"SORT_BY1" => "propertysort_STATUS", // STATUS — символьный код свойства
"SORT_ORDER1" => "ASC" // Порядок: ASC (по возрастанию) или DESC (по убыванию)Как это работает:
-
Битрикс использует таблицу
b_iblock_property_enum -
Сортировка происходит по полю
SORT, которое соответствует порядку значений в админке -
Результат не зависит от алфавитного порядка или ID значений
2. Настройка порядка сортировки
Порядок определяется в административном интерфейсе:
-
Перейдите: Инфоблоки → Свойства → Нужное свойство → Список
-
Измените порядок значений с помощью стрелок
-
Сохраните изменения
Рис. 1: Пример настройки порядка значений списка в админке Битрикс
3. Техническая реализация
Генерируемый SQL-запрос
SELECT
be.*,
bps.VALUE as PROPERTY_STATUS,
bps_enum.SORT as STATUS_SORT
FROM
b_iblock_element be
LEFT JOIN
b_iblock_element_property bps ON (be.ID = bps.IBLOCK_ELEMENT_ID)
LEFT JOIN
b_iblock_property_enum bps_enum ON (bps.VALUE = bps_enum.ID)
WHERE
be.IBLOCK_ID = [ID_инфоблока]
ORDER BY
bps_enum.SORT ASC -- Сортировка по заданному порядкуОсобенности для разных компонентов
| Компонент | Синтаксис |
|---|---|
| news.list |
"SORT_BY1" => "propertysort_"
|
| catalog.section |
"ELEMENT_SORT_FIELD" => "propertysort_"
|
| D7 |
'order' => ['propertysort_' => 'ASC']
|
4. Решение проблем
Частые ошибки
Неправильный синтаксис
"PROPERTY_STATUS" => "ASC" // Не работает для списков!
Пустые значения
Используйте параметр для их исключения:
"STRICT_SORT_CHECK" => "Y"
Смешанные типы данных
Убедитесь, что все значения в списке одного типа.
Оптимизация
Для ускорения добавьте индекс:
ALTER TABLE b_iblock_property_enum
ADD INDEX ix_sort (IBLOCK_PROPERTY_ID, SORT);5. Продвинутые техники
Динамическое изменение сортировки
AddEventHandler("iblock", "OnBeforeIBlockElementGetList", function(&$arOrder) {
if ($_GET['sort'] == 'custom') {
$arOrder['propertysort_STATUS'] = 'DESC';
}
});Совместная сортировка
"SORT_BY1" => "propertysort_PRIORITY",
"SORT_ORDER1" => "DESC",
"SORT_BY2" => "NAME",
"SORT_ORDER2" => "ASC"Заключение
Для правильной сортировки по свойствам-спискам:
-
Всегда используйте префикс
propertysort_ -
Настраивайте порядок значений в админке
-
Проверяйте SQL-запросы через EXPLAIN
-
Для сложных случаев применяйте обработчики событий
Дополнительные материалы: