PHP
#bitrix#iblock#php#properties#update#ciBlockElement

Безопасное обновление свойства элемента инфоблока

Обновление свойства элемента через CIBlockElement::SetPropertyValuesEx с проверкой существования элемента и обработкой ошибок.

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

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

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

use Bitrix\Main\Loader;

/**
 * Безопасно обновить свойство элемента
 * @param int $elementId ID элемента
 * @param int $iblockId ID инфоблока
 * @param string $propertyCode Код свойства
 * @param mixed $value Новое значение (строка, массив для множественных)
 * @return bool Успешно ли обновлено
 */
function updateElementPropertySafe($elementId, $iblockId, $propertyCode, $value) {
    if (!Loader::includeModule('iblock')) {
        return false;
    }
    
    // Проверяем существование элемента
    $element = CIBlockElement::GetByID($elementId)->Fetch();
    if (!$element || $element['IBLOCK_ID'] != $iblockId) {
        return false;
    }
    
    // Получаем информацию о свойстве
    $property = CIBlockProperty::GetByID($propertyCode, $iblockId)->Fetch();
    if (!$property) {
        return false;
    }
    
    // Подготавливаем значение в зависимости от типа свойства
    $propertyId = $property['ID'];
    $propertyType = $property['PROPERTY_TYPE'];
    
    $propertyValue = [];
    if ($propertyType == 'L' && is_numeric($value)) {
        // Для списков передаём ID значения
        $propertyValue[$propertyId] = ['VALUE' => $value];
    } elseif ($propertyType == 'F' && is_numeric($value)) {
        // Для файлов передаём ID файла
        $propertyValue[$propertyId] = ['VALUE' => $value];
    } elseif ($property['MULTIPLE'] == 'Y') {
        // Множественное свойство
        $values = is_array($value) ? $value : [$value];
        $propertyValue[$propertyId] = [];
        foreach ($values as $val) {
            $propertyValue[$propertyId][] = ['VALUE' => $val];
        }
    } else {
        // Обычное свойство
        $propertyValue[$propertyId] = ['VALUE' => $value];
    }
    
    // Обновляем только указанное свойство
    $result = CIBlockElement::SetPropertyValuesEx(
        $elementId,
        $iblockId,
        $propertyValue
    );
    
    return ($result !== false);
}

Usage:

// В обработчике формы или агенте
if (updateElementPropertySafe(123, 5, 'PRICE', 1500)) {
    echo 'Свойство обновлено';
} else {
    echo 'Ошибка обновления';
}

// Для множественного свойства
updateElementPropertySafe(123, 5, 'TAGS', ['tag1', 'tag2', 'tag3']);

Notes:

⚠️ SetPropertyValuesEx обновляет только указанные свойства, остальные остаются без изменений (в отличие от SetPropertyValues, который перезаписывает все). Для файловых свойств передавайте ID файла из CFile::SaveFile(). Множественные свойства требуют передачи массива значений.