Инфоблок D7 в Битрикс: GetList, Add, Update, Delete — полное руководство

Старое API инфоблоков (CIBlockElement) до сих пор встречается в большинстве проектов, но с выходом Битрикс D7 появился современный способ работы через ORM. Рассказываем как перейти и не сломать сайт.

Подключение D7 инфоблока

Прежде всего убедитесь что модуль подключён:

Bitrix\Main\Loader::includeModule('iblock');

GetList — выборка элементов

Старый способ через CIBlockElement::GetList работает, но D7 даёт типизацию и удобную цепочку фильтров:

use Bitrix\Iblock\Elements\ElementNewsTable; // автогенерируемый класс

$result = ElementNewsTable::getList([
    'select' => ['ID', 'NAME', 'PREVIEW_TEXT', 'DATE_ACTIVE_FROM'],
    'filter' => [
        'ACTIVE'      => 'Y',
        'IBLOCK_ID'   => 10,
        '>=DATE_ACTIVE_FROM' => new \Bitrix\Main\Type\DateTime('2024-01-01'),
    ],
    'order'  => ['DATE_ACTIVE_FROM' => 'DESC'],
    'limit'  => 20,
    'offset' => 0,
]);

foreach ($result as $item) {
    echo $item['NAME'] . PHP_EOL;
}

Важно: класс ElementNewsTable генерируется автоматически по символьному коду инфоблока. Если код инфоблока news, класс будет ElementNewsTable.

Add — добавление элемента

use Bitrix\Iblock\Elements\ElementNewsTable;

$result = ElementNewsTable::add([
    'NAME'          => 'Новая статья',
    'ACTIVE'        => 'Y',
    'IBLOCK_ID'     => 10,
    'PREVIEW_TEXT'  => 'Краткое описание',
    'DETAIL_TEXT'   => '

Полный текст статьи

', 'DATE_ACTIVE_FROM' => new \Bitrix\Main\Type\DateTime(), ]); if ($result->isSuccess()) { $newId = $result->getId(); echo 'Создан элемент ID: ' . $newId; } else { print_r($result->getErrors()); }

Update — обновление элемента

$result = ElementNewsTable::update(123, [
    'NAME'   => 'Обновлённый заголовок',
    'ACTIVE' => 'Y',
]);

if (!$result->isSuccess()) {
    print_r($result->getErrors());
}

Delete — удаление элемента

$result = ElementNewsTable::delete(123);

if (!$result->isSuccess()) {
    print_r($result->getErrors());
}

Работа со свойствами элементов

Свойства в D7 выбираются отдельно или через WITH:

$result = ElementNewsTable::getList([
    'select' => [
        'ID',
        'NAME',
        'PROPERTY_TAGS',     // одиночное свойство
        'PROPERTY_GALLERY',  // множественное
    ],
    'filter' => ['ACTIVE' => 'Y'],
]);

foreach ($result as $item) {
    echo $item['PROPERTY_TAGS_VALUE'];
}

Отличия от старого API

Старое API D7
CIBlockElement::GetList() ElementXxxTable::getList()
$el->Add() ElementXxxTable::add()
$el->Update() ElementXxxTable::update()
$el->Delete() ElementXxxTable::delete()
Нет типизации Полная типизация
Нет транзакций Поддержка транзакций

Когда использовать старое API

Старый CIBlockElement всё ещё нужен для:

  • Работы со свойствами типа «Привязка к разделу» и «Файл»
  • Получения SEO-свойств элементов
  • Сложных выборок с join по нескольким инфоблокам

Итог

D7 API для инфоблоков — это читаемый код с типизацией и нормальной обработкой ошибок. Для новых проектов используйте D7, для legacy — постепенно переводите модуль за модулем.