Сортировка по типу acs,nulls в D7 Битрикс

Сортировка по типу acs,nulls в D7 Битрикс

В предыдущих версиях Bitrix, с использованием старого ядра, разработчики могли легко применять сортировку "ASC, затем NULLS" с помощью функции `CIBlockElement::GetList`.


CIBlockElement::GetList(["CODE"=>"asc,nulls"], $arFilter, false, [], $arSelect);

Однако, переход на новое ядро D7 Bitrix вызвал ряд вопросов у разработчиков. Многие из них задаются вопросом: "Как же использовать этот функционал в новом ядре?"

В D7 Bitrix, для достижения аналогичного результата, вам нужно использовать ORM (Object-Relational Mapping). Это может показаться немного сложнее, но на самом деле это просто вопрос создания нового запроса и установки нужного порядка сортировки.

Вот пример того, как это можно сделать:


$query = new Bitrix\Main\ORM\Query\Query(ElementTable::class);
$query->addSelect('CODE');
$query->registerRuntimeField(
    new \Bitrix\Main\ORM\Fields\ExpressionField(
        'CODENULL',
        'length(%s)>0',
        ['CODE']
    )
);

$query->setOrder([
    'CODENULL' => 'desc',
    'CODE' => 'asc',
]);

$rows = $query->fetchAll();

# Создание запроса

Вначале создаем новый объект запроса, указывая класс таблицы, с которой мы хотим работать. В данном случае, это `ElementTable::class`.


$query = new Bitrix\Main\ORM\Query\Query(ElementTable::class);

# Выбор полей

Затем мы выбираем, какие поля мы хотим получить в результате запроса. В данном случае, мы выбираем поле `CODE` (Символьный код).


$query->addSelect('CODE');

# Регистрация временного поля

Далее, мы регистрируем временное поле `CODENULL`, которое будет содержать результат проверки на пустоту поля `CODE`.


$query->registerRuntimeField(
    new \Bitrix\Main\ORM\Fields\ExpressionField(
        'CODENULL',
        'length(%s)>0',
        ['CODE']
    )
);

# Установка порядка сортировки

После этого, мы устанавливаем порядок сортировки. Мы можем сортировать данные по полю `CODE` и по полю `CODENULL`, которое мы только что зарегистрировали. Данный пример аналогичен старой сортировки `asc,nulls`


$query->setOrder([
    'CODENULL' => 'desc',
    'CODE' => 'asc',
]);

Этот код сортирует данные по полю `CODE` в порядке возрастания, но сначала сортирует по полю `CODENULL` в порядке убывания, что означает, что сначала будут отображены записи, у которых поле `CODE` не пустое.

# Получение данных

Наконец, мы получаем все строки, соответствующие нашему запросу, в виду массива.


$rows = $query->fetchAll();

Таким образом, вы можете использовать сортировку "ASC, затем NULLS" в D7 1С-Битрикс. Это может потребовать немного больше кода, но это обеспечивает большую гибкость и контроль над вашими запросами.

# Все вариации сортировок


# asc,nulls
$query->setOrder([
    'CODENULL' => 'desc',
    'CODE' => 'asc',
]);

# desc,nulls
$query->setOrder([
    'CODENULL' => 'desc',
    'CODE' => 'desc',
]);

# nulls,asc
$query->setOrder([
    'CODENULL' => 'asc',
    'CODE' => 'asc',
]);

# nulls,desc
$query->setOrder([
    'CODENULL' => 'asc',
    'CODE' => 'desc',
]);

© 2026 MB

Desing by mb4design