Модуль iblock — сердце контента и каталога в 1С-Битрикс. Его API позволяет программно читать и изменять элементы, свойства и разделы инфоблоков. Разберём классический API CIBlockElement и современный D7-подход, а также типичные ошибки производительности.
Обзор API iblock
Работать с инфоблоками можно двумя способами.
- Классические классы:
CIBlockElement,CIBlockSection,CIBlock,CIBlockProperty. Покрывают все возможности, включая свойства, и используются повсеместно. - D7 ORM:
\Bitrix\Iblock\ElementTable,\Bitrix\Iblock\SectionTableи компилированные сущности инфоблока. Удобны для выборок и связей, но работа со свойствами через ORM сложнее.
CIBlockElement — API проще и полностью покрывает свойства.Выборка элементов: GetList
Основной метод чтения — CIBlockElement::GetList(). Сигнатура: GetList($order, $filter, $groupBy, $navParams, $select).
$res = CIBlockElement::GetList(
['SORT' => 'ASC'],
['IBLOCK_ID' => 5, 'ACTIVE' => 'Y'],
false,
['nTopCount' => 20],
['ID', 'NAME', 'PROPERTY_ARTNUMBER']
);
while ($el = $res->GetNextElement()) {
$fields = $el->GetFields();
$props = $el->GetProperties();
}
Метод GetNextElement() удобен, когда нужны и поля, и свойства. Если свойства не нужны, быстрее перебирать через Fetch(), явно перечислив нужные поля в $select.
Добавление и обновление
Создание и изменение элементов делают через объект CIBlockElement.
$el = new CIBlockElement;
$id = $el->Add([
'IBLOCK_ID' => 5,
'NAME' => 'Новый товар',
'ACTIVE' => 'Y',
'PROPERTY_VALUES' => ['ARTNUMBER' => 'A-100'],
]);
if (!$id) {
echo $el->LAST_ERROR;
}
Обновление — метод Update($id, $fields). Важно: в Update не передавайте IBLOCK_ID в массиве полей — он не нужен и может привести к путанице. Свойства при обновлении лучше менять отдельно.
Работа со свойствами
Свойства — отдельная подсистема. Для их обновления без переписывания всего элемента используют специальные методы.
| Метод | Назначение |
|---|---|
CIBlockElement::SetPropertyValues($id, $iblock, $val, $code) | Записать значение свойства по коду/ID |
CIBlockElement::SetPropertyValuesEx($id, false, $arProps) | Массово записать значения по кодам |
CIBlockElement::GetProperty() / $el->GetProperties() | Прочитать значения свойств |
Разделы инфоблока
Разделы (категории) обслуживает класс CIBlockSection. API симметричен элементам:
CIBlockSection::GetList($order, $filter, $countElements, $select)— выборка разделов, третий параметр включает подсчёт элементов;$sec = new CIBlockSection; $sec->Add($fields)— добавление;$sec->Update($id, $fields)— обновление;CIBlockSection::Delete($id)— удаление (каскадно удаляет вложенные разделы).
Дерево разделов хранится по модели вложенных множеств (nested sets): поля LEFT_MARGIN, RIGHT_MARGIN, DEPTH_LEVEL. Не правьте их напрямую в БД — только через API.
D7 ORM для инфоблоков
Современный способ выборки — ORM. Базовые сущности всегда доступны:
use Bitrix\Iblock\ElementTable;
$rows = ElementTable::getList([
'filter' => ['IBLOCK_ID' => 5, 'ACTIVE' => 'Y'],
'select' => ['ID', 'NAME', 'CODE'],
'limit' => 20,
])->fetchAll();
Для работы со свойствами через ORM инфоблок компилируют в отдельную сущность методом \Bitrix\Iblock\Iblock::wakeUp() либо через API «инфоблоки 2.0» (\Bitrix\Iblock\Elements\Element...Table, доступное при включённой соответствующей опции). Это удобно для сложных выборок со связями, но требует понимания генерации сущностей.
Производительность выборок
- Всегда указывайте
IBLOCK_IDв фильтре — без него выборка идёт по всем инфоблокам и работает медленно. - Перечисляйте только нужные поля в
$select; выборка свойствPROPERTY_*добавляет join и утяжеляет запрос. - Не вызывайте
GetListв цикле — это классическая проблема N+1. Соберите ID и сделайте один запрос с фильтром по массиву. - Для больших каталогов включайте кэширование выборок и используйте постраничную навигацию через
$navParams.
Итог
API модуля iblock закрывает весь спектр работы с контентом и каталогом: CIBlockElement и CIBlockSection для элементов, разделов и свойств, а D7 ORM — для быстрых типизированных выборок. Ключ к стабильности — всегда фильтровать по инфоблоку, выбирать только нужные поля и не плодить запросы в циклах.
Мы разрабатываем импорт, синхронизацию и сложную логику каталога на 1С-Битрикс с учётом производительности на десятках тысяч товаров. Если нужен надёжный обмен данными или доработка каталога — поможем спроектировать и реализовать.
Частые вопросы
Каким методом выбирать элементы инфоблока?
Основной метод — CIBlockElement::GetList с параметрами order, filter, groupBy, navParams, select. Для чтения полей и свойств вместе используйте GetNextElement, для скорости без свойств — Fetch.
Как обновить одно свойство, не трогая остальные поля?
Используйте CIBlockElement::SetPropertyValues или SetPropertyValuesEx. Они меняют только свойства, не переписывая весь элемент через Update.
Почему выборка элементов медленная?
Чаще всего не указан IBLOCK_ID в фильтре, выбирается много свойств PROPERTY_*, либо GetList вызывается в цикле. Уберите эти причины и добавьте кэширование.
Как добавить значение к множественному свойству?
Сначала прочитайте текущие значения свойства, добавьте новое в массив и запишите весь массив через SetPropertyValues. Иначе новое значение заменит все существующие.
Можно ли править nested sets разделов напрямую в БД?
Нет. Поля LEFT_MARGIN, RIGHT_MARGIN, DEPTH_LEVEL пересчитываются ядром. Меняйте дерево только через методы CIBlockSection.
Чем отличается ORM ElementTable от CIBlockElement?
ElementTable даёт быстрые типизированные выборки в стиле D7, но работа со свойствами через него сложнее. CIBlockElement полностью покрывает свойства и удобнее для записи.
Нужно ли передавать IBLOCK_ID в Update?
Нет, в CIBlockElement::Update массив полей не должен содержать IBLOCK_ID. Достаточно ID элемента и изменяемых полей.
Поможем с настройкой и поддержкой Для разработчиков
Поможем с настройкой, доработкой и поддержкой Для разработчиков.