Элементы инфоблока в Битрикс D7: ORM, свойства и выборки
Зачем переходить на ORM элементов
В D7 для инфоблоков появился полноценный ORM-слой: типизированные выборки, объекты вместо «сырых» массивов и предсказуемые имена полей. Это удобнее, чем бесконечные CIBlockElement::GetList с префиксами PROPERTY_*, особенно в сервисах и модулях.
Ниже — практический минимум на вымышленном инфоблоке «Статьи блога» (символьный код API: Articles). Подключите модуль iblock перед примерами.
Подготовка инфоблока
В настройках инфоблока задайте символьный код API — латиница, до 50 символов, с буквы. По нему генерируется класс Element{ApiCode}Table.
use Bitrix\Main\Loader;
Loader::includeModule('iblock');
$dataClass = \Bitrix\Iblock\Iblock::wakeUp($iblockId)->getEntityDataClass();
// \Bitrix\Iblock\Elements\ElementArticlesTableОдин элемент и список
Класс для нашего примера — ElementArticlesTable. Получение одной записи по ID:
use Bitrix\Iblock\Elements\ElementArticlesTable;
$row = ElementArticlesTable::getByPrimary($postId, [
'select' => [
'ID',
'NAME',
'DETAIL_TEXT',
'VENDOR_CODE_' => 'VENDOR_CODE',
],
])->fetch();
$sku = $row['VENDOR_CODE_VALUE'] ?? '';В select свойства пишутся без префикса PROPERTY_. Алиас с подчёркиванием (VENDOR_CODE_) даёт короткие ключи в массиве.
Выборка списка — тот же синтаксис, что у ORM в других модулях:
$query = ElementArticlesTable::getList([
'select' => ['ID', 'NAME', 'ACTIVE_FROM'],
'filter' => ['=ACTIVE' => 'Y'],
'order' => ['ACTIVE_FROM' => 'DESC'],
'limit' => 20,
]);
while ($post = $query->fetch()) {
// ...
}Объекты вместо массивов
fetchObject() и fetchCollection() возвращают объекты с геттерами в CamelCase: getName(), getDetailPicture() и т.д. Универсальный доступ — $post->get('NAME').
Разделы
Основной раздел — поле IBLOCK_SECTION. Все привязки — через SECTIONS и getSections()->getAll().
Свойства разных типов
Строка. Свойство VENDOR_CODE (внутренний артикул материала):
$code = $post->getVendorCode()->getValue();
$note = $post->getVendorCode()->getDescription();Множественное. Свойство AUTHORS — список авторов, обход через getAll():
foreach ($post->getAuthors()->getAll() as $author) {
echo $author->getValue();
}Файлы. Галерея SLIDES — в select добавляют суффикс .FILE, путь к файлу берут из объекта файла:
$posts = ElementArticlesTable::getList([
'select' => ['ID', 'SLIDES.FILE'],
'filter' => ['ID' => $postId],
])->fetchCollection();
foreach ($posts as $post) {
foreach ($post->getSlides()->getAll() as $slide) {
$url = '/upload/'
. $slide->getFile()->getSubdir() . '/'
. $slide->getFile()->getFileName();
}
}Список. Метка BADGE (новинка, хит) — расшифровка через BADGE.ITEM и методы getItem()->getXmlId(), getValue().
Привязка к элементам. Блок «Читайте также» — свойство SIMILAR, суффикс .ELEMENT в select, в цикле getElement()->getId() и getName().
Кеширование
Стабильную выборку можно кешировать параметром cache в getList() (TTL в секундах). После импорта данных сбросьте кеш сущности: ElementArticlesTable::getEntity()->cleanCache().
Когда оставить CIBlockElement
- Разовые правки в админке и миграции «на коленке».
- Компоненты ядра без ORM-обвязки.
- Нестандартные runtime-поля в фильтре — иногда проще старый API.
В новом коде модулей ORM элементов обычно выигрывает: меньше путаницы с кодами свойств и проще рефакторинг.
Итог
Задайте символьный код API, получите класс через Iblock::wakeUp(), используйте getList / fetchObject и суффиксы .FILE, .ITEM, .ELEMENT для «тяжёлых» типов свойств. Короткие фрагменты держите в абзацах с <code>, крупные примеры — в отдельных блоках pre.
Не хотите копаться сами?
Починю за 1-3 дня. Без предоплаты — оплата по результату.
15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии