Безопасное обновление свойства элемента инфоблока
Обновление свойства элемента через CIBlockElement::SetPropertyValuesEx с проверкой существования элемента и обработкой ошибок.
Как использовать
- Скопируйте нужный фрагмент кода.
- Вставьте в свой проект и при необходимости измените под задачу.
- Проверьте зависимости и окружение (версии, переменные).
Безопасное обновление свойств элемента инфоблока без полной перезаписи всех свойств. Используйте в обработчиках форм, агентах, 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(). Множественные свойства требуют передачи массива значений.