Главная » API Битрикс » Прочее » CIBlockProperty — работа со свойствами элементов в Битрикс

CIBlockProperty — работа со свойствами элементов в Битрикс

Схема чтения и записи свойств элемента инфоблока через CIBlockProperty в Битрикс

Свойства элементов инфоблока — один из самых частых источников путаницы в API Битрикса: формат значения меняется в зависимости от типа свойства и множественности. Разберём CIBlockProperty, чтение и запись значений через PROPERTY_VALUES и типичные грабли с форматом данных.

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

<?php

$result = CIBlockProperty::GetList(
    ['SORT' => 'ASC'],
    ['IBLOCK_ID' => $iblockId]
);

while ($property = $result->GetNext()) {
    echo $property['CODE'] . ' (' . $property['PROPERTY_TYPE'] . ')' . PHP_EOL;
}

PROPERTY_TYPE определяет формат значения: S — строка, N — число, L — список (со ссылкой на таблицу вариантов), F — файл, E — привязка к элементу, G — привязка к разделу.

Чтение значения одиночного свойства

<?php

$element = CIBlockElement::GetList(
    [],
    ['ID' => $elementId],
    false,
    false,
    ['ID', 'PROPERTY_COLOR']
)->GetNext();

echo $element['PROPERTY_COLOR_VALUE'];

При выборке через GetList значение свойства попадает в поле с суффиксом _VALUE, а не просто PROPERTY_COLOR — эта деталь регулярно вызывает путаницу у тех, кто переходит от чтения документации сразу к коду.

Нужна помощь с Битрикс?





    Множественные свойства

    <?php
    
    $element = CIBlockElement::GetList(
        [], ['ID' => $elementId], false, false, ['ID', 'PROPERTY_SIZE']
    )->GetNext();
    
    // для множественного свойства _VALUE — массив, а не скаляр
    foreach ($element['PROPERTY_SIZE_VALUE'] as $size) {
        echo $size . ', ';
    }

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

    Запись значения через Update

    <?php
    
    $el = new CIBlockElement;
    
    $el->Update($elementId, [
        'PROPERTY_VALUES' => [
            'COLOR' => 'Красный',
            'SIZE' => ['S', 'M', 'L'], // множественное свойство — просто массив
        ],
    ]);

    Для обычной записи достаточно передать значение как строку (одиночное свойство) или массив строк (множественное). Более сложный формат с явными ключами понадобится только при работе с существующими значениями по их внутреннему ID.

    Обновление конкретного значения по ID записи свойства

    <?php
    
    $el->Update($elementId, [
        'PROPERTY_VALUES' => [
            'SIZE' => [
                ['VALUE' => 'M', 'ID' => 145], // заменить существующую запись 145
                ['VALUE' => 'XL'],              // добавить новую
            ],
        ],
    ]);

    Формат с массивом ['VALUE' => ..., 'ID' => ...] нужен, когда важно не просто заменить весь набор значений, а точечно изменить конкретную существующую запись, сохранив её внутренний идентификатор (например, если на него ссылаются извне).

    Свойства типа "Список" и их варианты

    <?php
    
    $enumResult = CIBlockPropertyEnum::GetList(
        ['SORT' => 'ASC'],
        ['IBLOCK_ID' => $iblockId, 'CODE' => 'COLOR']
    );
    
    while ($enumValue = $enumResult->GetNext()) {
        echo $enumValue['XML_ID'] . ' — ' . $enumValue['VALUE'] . PHP_EOL;
    }

    Для свойств типа "Список" сохранённое значение в PROPERTY_VALUES при записи — это ID конкретного варианта из CIBlockPropertyEnum, а не сам текст. При чтении через GetList с _VALUE Битрикс уже подставляет читаемый текст варианта, но при прямой записи важно передать именно ID нужного варианта, а не строку с его названием.

    Частые ошибки

    • Не учтена множественность свойства. Код ожидает строку там, где приходит массив, или наоборот.
    • Забыт суффикс _VALUE при чтении через GetList. Обращение к PROPERTY_CODE вместо PROPERTY_CODE_VALUE возвращает пусто.
    • Для списка передана строка вместо ID варианта. Значение не сохраняется или создаётся новый вариант с тем же текстом.
    • Замена всего набора вместо точечного обновления. Теряются ID существующих записей множественного свойства, на которые могли ссылаться извне.

    Итог

    Работа со свойствами инфоблока требует точного понимания трёх вещей: типа свойства (PROPERTY_TYPE), его множественности и формата значения при записи. Для списков значением при записи всегда выступает ID варианта из CIBlockPropertyEnum, а не текст, который видит пользователь на сайте.

    Нужна помощь с Битрикс?

    Исправим ошибку, доработаем сайт, ускорим Битрикс или поможем разобраться с проблемой.

    Услуги
    Инструменты
    База знаний