Практическое руководство по инфоблокам: как они устроены, как выбирать элементы через старое API и ORM D7 и как не убить базу выборками.
Инфоблоки — фундамент почти любого проекта на 1С-Битрикс. Новости, статьи, каталог товаров, баннеры, сотрудники, FAQ — всё это обычно инфоблоки. Эта статья, к слову, тоже хранится в инфоблоке и отдаётся компонентом.
Из чего состоит инфоблок
- Тип инфоблока — папка для группировки (например, «Контент», «Каталог»).
- Инфоблок — сама сущность со своими настройками, правами и шаблонами URL.
- Разделы — дерево категорий (необязательно).
- Элементы — записи: название, символьный код, анонс, детальный текст, картинки, даты активности.
- Свойства — произвольные поля: строка, число, список, файл, привязка к элементу, HTML, справочник и другие.
Инфоблоки 1.0 и 2.0
В версии 1.0 значения свойств всех инфоблоков лежат в одной общей таблице b_iblock_element_property. В версии 2.0 у каждого инфоблока своя таблица значений — выборки и фильтры по свойствам работают быстрее. Для каталогов и всего, где будет много элементов, используйте 2.0.
Выборка: старое API
use Bitrix\Main\Loader;
Loader::includeModule('iblock');
$res = CIBlockElement::GetList(
['SORT' => 'ASC'],
['IBLOCK_ID' => 5, 'ACTIVE' => 'Y', 'PROPERTY_CLUSTER' => 'Интеграции'],
false,
['nPageSize' => 20],
['ID', 'IBLOCK_ID', 'NAME', 'CODE', 'PROPERTY_CLUSTER']
);
while ($row = $res->Fetch()) {
// ...
}
Всегда передавайте arSelect и IBLOCK_ID в фильтре. Выборка без select тянет все поля и делает лишние джойны.
Выборка: ORM D7
Задайте инфоблоку «Символьный код API» (например, Articles) — после этого доступен ORM-класс:
use Bitrix\Iblock\Elements\ElementArticlesTable;
$items = ElementArticlesTable::getList([
'select' => ['ID', 'NAME', 'CODE', 'CLUSTER_' => 'CLUSTER'],
'filter' => ['=ACTIVE' => 'Y'],
'order' => ['SORT' => 'ASC'],
'limit' => 20,
'cache' => ['ttl' => 3600],
])->fetchAll();
Плюсы D7: типизация, джойны через runtime-поля, встроенный кэш запросов. Минус: множественные свойства в select размножают строки — их удобнее получать через fetchCollection().
SEO-поля элемента
Мета-теги задаются на вкладке SEO элемента или шаблонами на уровне инфоблока, например {=this.Name} — купить в Москве. В коде значения получаются так:
use Bitrix\Iblock\InheritedProperty\ElementValues;
$seo = (new ElementValues($iblockId, $elementId))->getValues();
$title = $seo['ELEMENT_META_TITLE'];
Производительность
- Выносите выборки в компоненты с кэшем, а не в шаблоны сайта. Как писать компонент — в статье «Свой компонент Битрикс».
- Используйте тегированный кэш: при изменении элемента кэш инфоблока сбросится сам.
- Не делайте GetList в цикле — сначала соберите ID, затем одна выборка.
- Для фильтрации по свойствам на больших каталогах включайте фасетный индекс.
- Не храните в инфоблоках логи и счётчики — для них нужны свои таблицы (ORM-сущности).
Когда инфоблок — не лучший выбор
Высокочастотная запись (логи, события, статистика), сложные связи многие-ко-многим, строгая схема с транзакциями — это задачи для собственных таблиц через ORM D7 или Highload-блоков. Инфоблоки хороши для контента, который редактируют люди.
Нужна помощь с архитектурой проекта на Битриксе или ускорением медленного каталога — обращайтесь.
Частые вопросы
Что такое инфоблок в Битрикс?
Инфоблок — универсальное хранилище однотипного контента: новостей, товаров, статей, сотрудников. У него есть разделы, элементы, стандартные поля и произвольные свойства.
Чем инфоблоки 2.0 отличаются от 1.0?
В инфоблоках 2.0 значения свойств хранятся в отдельной таблице на каждый инфоблок. Это ускоряет выборки и фильтрацию по свойствам на больших объёмах.
Как получить элементы инфоблока в D7?
Задайте инфоблоку символьный код API, после чего используйте класс \Bitrix\Iblock\Elements\Element<ApiCode>Table::getList() с выборкой свойств по коду.