PHP
#bitrix#iblock#php#cache#performance#ciBlockElement

Получить элемент инфоблока по символьному коду с свойствами

Безопасное получение элемента инфоблока по символьному коду через CIBlockElement::GetList с выборкой свойств и кешированием результата.

Как использовать

  1. Скопируйте нужный фрагмент кода.
  2. Вставьте в свой проект и при необходимости измените под задачу.
  3. Проверьте зависимости и окружение (версии, переменные).

Получение элемента инфоблока по символьному коду с выборкой свойств и кешированием. Используйте в компонентах и шаблонах для быстрого доступа к данным элемента без лишних запросов к БД.

use Bitrix\Main\Loader;
use Bitrix\Main\Application;

/**
 * Получить элемент по символьному коду с свойствами
 * @param int $iblockId ID инфоблока
 * @param string $code Символьный код элемента
 * @param array $selectFields Поля для выборки (по умолчанию: ID, NAME, CODE, PREVIEW_TEXT)
 * @param array $propertyCodes Коды свойств для выборки
 * @return array|false Массив данных элемента или false
 */
function getElementByCode($iblockId, $code, $selectFields = [], $propertyCodes = []) {
    if (!Loader::includeModule('iblock')) {
        return false;
    }
    
    $cache = Application::getInstance()->getCache();
    $cacheId = 'element_code_' . $iblockId . '_' . md5($code);
    $cacheDir = '/iblock/element_by_code/';
    $cacheTtl = 3600; // 1 час
    
    if ($cache->initCache($cacheTtl, $cacheId, $cacheDir)) {
        $result = $cache->getVars();
    } elseif ($cache->startDataCache()) {
        $defaultSelect = ['ID', 'NAME', 'CODE', 'PREVIEW_TEXT', 'DETAIL_TEXT', 'ACTIVE'];
        $select = !empty($selectFields) ? $selectFields : $defaultSelect;
        
        // Добавляем свойства в выборку
        if (!empty($propertyCodes)) {
            $select[] = 'PROPERTY_' . implode(', PROPERTY_', $propertyCodes);
        }
        
        $res = CIBlockElement::GetList(
            [],
            [
                'IBLOCK_ID' => $iblockId,
                'CODE' => $code,
                'ACTIVE' => 'Y'
            ],
            false,
            ['nTopCount' => 1],
            $select
        );
        
        $element = $res->GetNextElement();
        if (!$element) {
            $cache->abortDataCache();
            return false;
        }
        
        $result = $element->GetFields();
        
        // Получаем свойства
        if (!empty($propertyCodes)) {
            $props = $element->GetProperties();
            foreach ($propertyCodes as $propCode) {
                if (isset($props[$propCode])) {
                    $result['PROPERTIES'][$propCode] = $props[$propCode];
                }
            }
        }
        
        $cache->endDataCache($result);
    } else {
        $result = false;
    }
    
    return $result;
}

Usage:

// В component.php или шаблоне
$element = getElementByCode(5, 'main-page-banner', ['ID', 'NAME', 'PREVIEW_PICTURE'], ['LINK', 'BUTTON_TEXT']);
if ($element) {
    echo $element['NAME'];
    echo $element['PROPERTIES']['LINK']['VALUE'];
}

Notes:

⚠️ Кеш очищается автоматически при изменении элемента через CIBlockElement::Update(). Для динамических данных используйте меньший TTL или отключите кеш. Символьный код должен быть уникальным в рамках инфоблока.