С появлением ядра D7 в 1С-Битрикс у разработчиков появился новый, объектно-ориентированный способ работы с базой данных — ORM (Object-Relational Mapping). Этот подход делает код более чистым, читаемым и зачастую более производительным по сравнению со старым API.
Для работы с элементами инфоблоков в D7 ORM используется класс \Bitrix\Iblock\ElementTable. Его основной метод для выборки данных — getList.
Подготовка к работе
Перед использованием ElementTable необходимо подключить модуль инфоблоков и импортировать класс:
use Bitrix\Main\Loader;
use Bitrix\Iblock\ElementTable;
// Проверяем, подключен ли модуль
if (!Loader::includeModule('iblock')) {
die('Модуль iblock не установлен');
}
Базовый синтаксис getList
Метод getList принимает один массив с параметрами, который очень похож по своей структуре на SQL-запрос.
$result = ElementTable::getList([
'select' => [...], // Какие поля выбрать
'filter' => [...], // Условия фильтрации (WHERE)
'order' => [...], // Сортировка (ORDER BY)
'limit' => 10, // Ограничение количества (LIMIT)
'offset' => 20 // Смещение (OFFSET)
]);
1. Выборка полей (select)
Параметр select определяет, какие поля будут в результате. Можно использовать псевдонимы (алиасы).
// Выбираем ID, название и символьный код элемента,
// при этом полю NAME даем псевдоним TITLE
$result = ElementTable::getList([
'select' => ['ID', 'TITLE' => 'NAME', 'CODE'],
'filter' => ['IBLOCK_ID' => 5, 'ACTIVE' => 'Y']
]);
Выборка свойств:
Для выборки свойств нужно использовать механизм «ссылок» (references). Для этого к названию поля свойства добавляется ->VALUE.
// Выбираем ID, название и свойство с кодом "ARTNUMBER"
$result = ElementTable::getList([
'select' => ['ID', 'NAME', 'ARTICLE' => 'ARTNUMBER.VALUE'],
'filter' => ['IBLOCK_ID' => 5]
]);
Важно: ARTNUMBER — это символьный код свойства. Для этого синтаксиса ORM сама построит JOIN к таблице свойств.
2. Фильтрация (filter)
Параметр filter полностью аналогичен $arFilter из старого API, но с более строгой и понятной логикой.
// Получаем активные элементы из инфоблока 5,
// у которых свойство "CITY" (с ID 12) равно "Москва"
$result = ElementTable::getList([
'select' => ['ID', 'NAME'],
'filter' => [
'=IBLOCK_ID' => 5,
'=ACTIVE' => 'Y',
'=PROPERTY_12' => 'Москва' // Фильтр по свойству через ID
]
]);
Можно использовать операторы сравнения прямо в ключе:
- = — равно (можно опустить)
- != — не равно
- > — больше
- >= — больше или равно
- % — LIKE
// Элементы, название которых содержит "статья"
'filter' => ['%NAME' => 'статья']
3. Сортировка (order)
Параметр order работает так же, как и в старом API.
$result = ElementTable::getList([
'select' => ['ID', 'NAME'],
'filter' => ['IBLOCK_ID' => 5],
'order' => ['SORT' => 'ASC', 'NAME' => 'DESC']
]);
4. Лимит и смещение (limit, offset)
Эти параметры идеально подходят для постраничной навигации.
// Получить 10 элементов, начиная с 21-го (третья страница)
$result = ElementTable::getList([
'select' => ['ID', 'NAME'],
'filter' => ['IBLOCK_ID' => 5],
'limit' => 10,
'offset' => 20 // (3-1) * 10
]);
5. Динамические поля (runtime)
ORM D7 позволяет создавать «виртуальные» поля во время выполнения запроса. Например, можно посчитать количество комментариев для новости.
// Пример с подсчетом
$result = ElementTable::getList([
'select' => ['ID', 'NAME', 'COMMENTS_CNT'],
'filter' => ['IBLOCK_ID' => 5],
'runtime' => [
new \Bitrix\Main\Entity\ExpressionField(
'COMMENTS_CNT',
'COUNT(%s)',
['IBLOCK_ELEMENT_ID'] // Поле из другой таблицы, связанной с ElementTable
)
]
]);
Обработка результата
Результат getList — это объект \Bitrix\Main\DB\Result. Для получения данных используется цикл while и метод fetch().
$result = ElementTable::getList([
'select' => ['ID', 'NAME'],
'filter' => ['IBLOCK_ID' => 5]
]);
while ($element = $result->fetch()) {
echo "Элемент: " . $element['NAME'] . " (ID: " . $element['ID'] . ")<br>";
}
CIBlockElement::GetList vs. ElementTable::getList
Критерий | CIBlockElement::GetList (старое API) | ElementTable::getList (D7 ORM) |
Синтаксис | Процедурный, массивы с «магическими» ключами | Объектно-ориентированный, более строгий |
Читаемость | Низкая, особенно при сложных фильтрах | Высокая, напоминает SQL |
Производительность | Высокая, но легко написать медленный запрос | Как правило, выше за счет оптимизации запросов |
Возможности | Ограничены | runtime поля, гибкие JOIN-ы, типизация |
Вывод: Для новых проектов всегда используйте D7 ORM. Это стандарт современной разработки на Битрикс, который делает ваш код надежнее, понятнее и быстрее.
Bitrix D7, ORM, ElementTable, getList, Bitrix ORM, современная разработка Битрикс, сущности D7, выборка данных, фильтр, select, order, limit, offset.