05.05.2025

Работа с элементами инфоблоков в Битрикс D7

Подключаем модуль iblock:

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

Для доступа к возможностям нового ядра у инфоблока нужно задать Символьный код API. По документации это строка от 1 до 50 символов, начинающаяся с буквы и состоящая из латинских букв и цифр.

В настройках ИБ указываем "Символьный код API"

Для работы с элементами используется класс \Bitrix\Iblock\Elements\ElementXXXXXTable, где XXXXX - Символьный код API. Для инфоблока на примере выше это будет класс

\Bitrix\Iblock\Elements\ElementCatalogTable

Получить название класса для инфоблока можно следующим методом:

var_dump(\Bitrix\Iblock\Iblock::wakeUp($iblockId)->getEntityDataClass());
// string(43) "\Bitrix\Iblock\Elements\ElementCatalogTable"

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

Аналог CIBlockElement::GetByID:

$element = \Bitrix\Iblock\Elements\ElementCatalogTable::getByPrimary($elementId, [
    'select' => ['ID', 'NAME', 'DETAIL_TEXT', 'DETAIL_PICTURE', 'ARTNUMBER_' => 'ARTNUMBER'],
])->fetch();
var_dump($element);
// Используем алиасы для нормального отображения 'ARTNUMBER_' => 'ARTNUMBER'

Аналогом CIBlockElement::GetList будет getList из D7:

$elements = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([
    'select' => ['ID', 'NAME', 'ARTNUMBER_' => 'ARTNUMBER'],
    'filter' => ['=ACTIVE' => 'Y'],
])->fetchAll();
foreach ($elements as $element) {
}

Работа с элементом как с объектом

Есть возможность работать с элементами инфоблока как с объектами. Для этого используем методы fetchObject для получения объекта (один элемент) и fetchCollection для получения коллекции объектов.

Пример для одного элемента:

$element = \Bitrix\Iblock\Elements\ElementCatalogTable::getByPrimary($elementId, array(
    'select' => array('ID', 'NAME', 'DETAIL_PICTURE')
))->fetchObject();

var_dump($element->get("ID"));
var_dump($element->get("NAME"));
var_dump($element->get("DETAIL_PICTURE"));

Пример для нескольких элементов:

$elements = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([
    'select' => ['ID', 'NAME', 'DETAIL_PICTURE'],
    'filter' => [
        'ID' => $elementId,
    ],
])->fetchCollection();

foreach ($elements as $element) {
    var_dump($element->getName());
}

Разделы элементов

Элементы могут быть привязаны к нескольким разделам, но GetList-ом можно было получить только один основной раздел инфоблока.

$elements = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([
    'select' => ['ID', 'IBLOCK_SECTION'],
    'filter' => [
        'ID' => $elementId,
    ],
])->fetchObject();

var_dump ($element->getIblockSection()->getName());

Для получения всех разделов элемента используем поле SECTIONS, так у нас появляется возможность получения коллекции разделов. Получить значения коллекции можно с помощью метода getAll():

$element = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([
    'select' => ['ID', 'SECTIONS'],
    'filter' => [
        'ID' => $elementId,
    ],
])->fetchObject();

foreach ($element->getSections()->getAll() as $section) {
    var_dump($section->getId());
    var_dump($section->getCode());
    var_dump($section->getName());
}

Свойства элементов

У свойств есть VALUE и DESCRIPTION, которые можно получить методами getValue и getDescription соответственно. Для некоторых типов добавляются дополнительные поля для доступа к дополнительной информации (ITEM - значение свойства типа список, ELEMENT - привязанный элемент, SECTION - привязанный раздел, FILE - файл).

$elementsRes = \Bitrix\Iblock\Elements\ElementConfigurationsTable::getList([
    'filter' => [
        'ID' => $elementId,
    ],
    'select' => [
        'ID',
        'IBLOCK_ID',
        'NAME',
        'IBLOCK_SECTION_ID',
        'CREATED_BY',
        'IBLOCK',
        'DATE_CREATE',
        'TYPE.ITEM',       // свойство тип Список
        'CUSTOMER.ELEMENT',// привязка к элементу
        'PLATFORM.ELEMENT',// множественное свойство (привязка)
        'ADVANTAGES.FILE', // множественное свойство тип Файл
        'USER_INFO',       // данные пользователя
    ],
    'count_total' => true,
    'runtime' => [
        'USER_INFO' => [
            'data_type' => \Bitrix\Main\UserTable::class,
            'reference' => [
                '=this.CREATED_BY' => 'ref.ID',
            ],
        ],
    ],
]);

$count = $elementsRes->getCount();//получаем количество записей
$elements = $elementsRes->fetchCollection();

$elArr = [];
foreach ($elements as $element) {
    $el = [
        'ID' => $element->get('ID'),
        'NAME' => $element->get('NAME'),
        'DATE_CREATE' => $element->get('DATE_CREATE'),
        'CODE' => $element->get('CODE'),
        'IBLOCK_ID' => $element->get('IBLOCK_ID'),
        'PREVIEW_PICTURE' => $element->get('PREVIEW_PICTURE'),
        'IBLOCK_SECTION_ID' => $element->get('IBLOCK_SECTION_ID'),
    ];

    // DETAIL_PAGE_URL
    $el['DETAIL_PAGE_URL'] = CIBlock::ReplaceDetailUrl(
        $element->get('IBLOCK')->get('DETAIL_PAGE_URL'),
        $el,
        false,
        'E'
    );

    // свойство TYPE (список)
    if ($type = $element->get('TYPE')) {
        if ($typeVal = $type->getItem()) {
            $el['PROPERTIES']['TYPE'][$typeVal->getId()] = [
                'VALUE' => $typeVal->getValue(),
                'XML_ID' => $typeVal->getXmlId(),
            ];
        }
    }

    // свойство CUSTOMER (привязка к элементу)
    if ($cus = $element->get('CUSTOMER')) {
        if ($cusEl = $cus->getElement()) {
            $el['PROPERTIES']['CUSTOMER'] = $cusEl->get('NAME');
        }
    }

    // свойство PLATFORM (множественная привязка)
    if ($platformsOb = $element->get('PLATFORM')) {
        foreach ($platformsOb->getAll() as $value) {
            if ($plEl = $value->getElement()) {
                $el['PROPERTIES']['PLATFORM'][] = $plEl->get('NAME');
            }
        }
    }

    // свойство ADVANTAGES (множественные файлы)
    if ($advOb = $element->get('ADVANTAGES')) {
        foreach ($advOb->getAll() as $value) {
            $el['PROPERTIES']['ADVANTAGES'][] = [
                'DESCRIPTION' => $value->getFile()->getDescription(),
                'PATH' => '/upload/'
                    . $value->getFile()->getSubdir()
                    . '/'
                    . $value->getFile()->getFileName(),
            ];
        }
    }

    // USER_INFO (пользователь)
    if ($crBy = $element->get('USER_INFO')) {
        if (($usName = $crBy->get('NAME'))
            && ($usLastName = $crBy->get('LAST_NAME'))) {
            $el['PROPERTIES']['USER_INFO'] = $usLastName . ' ' . $usName;
        }
    }

    $elArr[] = $el;
}

Кеширование

Кеширование результатов выборок ORM D7:

$element = \Bitrix\Iblock\Elements\ElementCatalogTable::getList([
    'select' => ['ID', 'NAME'],
    'filter' => [
        'ID' => $elementId,
    ],
    "cache" => ["ttl" => 3600],
])->fetchObject();

Возврат к списку