Создание и обновление элемента инфоблока с обработкой ошибок
Создание и обновление элементов через CIBlockElement::Add/Update с проверкой результата через LAST_ERROR и валидацией данных.
Как использовать
- Скопируйте нужный фрагмент кода.
- Вставьте в свой проект и при необходимости измените под задачу.
- Проверьте зависимости и окружение (версии, переменные).
Создание и обновление элементов инфоблока с корректной обработкой ошибок через LAST_ERROR. Используйте в обработчиках форм, импортах, API для безопасной работы с данными.
use Bitrix\Main\Loader;
/**
* Создать элемент инфоблока
* @param int $iblockId ID инфоблока
* @param array $fields Поля элемента
* @param array $properties Свойства элемента ['CODE' => 'value']
* @return array ['success' => bool, 'id' => int, 'error' => string]
*/
function createElementWithErrors($iblockId, $fields, $properties = []) {
if (!Loader::includeModule('iblock')) {
return ['success' => false, 'id' => 0, 'error' => 'Модуль iblock не подключен'];
}
$el = new CIBlockElement;
// Обязательные поля
$fields['IBLOCK_ID'] = $iblockId;
if (empty($fields['NAME'])) {
return ['success' => false, 'id' => 0, 'error' => 'Не указано название'];
}
// Добавляем свойства
if (!empty($properties)) {
$fields['PROPERTY_VALUES'] = [];
foreach ($properties as $code => $value) {
$prop = CIBlockProperty::GetList([], ['IBLOCK_ID' => $iblockId, 'CODE' => $code])->Fetch();
if ($prop) {
$fields['PROPERTY_VALUES'][$prop['ID']] = $value;
}
}
}
$elementId = $el->Add($fields);
if ($elementId) {
return ['success' => true, 'id' => $elementId, 'error' => ''];
} else {
$error = $el->LAST_ERROR ?: 'Неизвестная ошибка';
return ['success' => false, 'id' => 0, 'error' => $error];
}
}
/**
* Обновить элемент инфоблока
* @param int $elementId ID элемента
* @param array $fields Поля для обновления
* @param array $properties Свойства для обновления
* @return array ['success' => bool, 'error' => string]
*/
function updateElementWithErrors($elementId, $fields = [], $properties = []) {
if (!Loader::includeModule('iblock')) {
return ['success' => false, 'error' => 'Модуль iblock не подключен'];
}
// Проверяем существование элемента
$element = CIBlockElement::GetByID($elementId)->Fetch();
if (!$element) {
return ['success' => false, 'error' => 'Элемент не найден'];
}
$el = new CIBlockElement;
// Добавляем свойства если есть
if (!empty($properties)) {
$fields['PROPERTY_VALUES'] = [];
foreach ($properties as $code => $value) {
$prop = CIBlockProperty::GetList([], ['IBLOCK_ID' => $element['IBLOCK_ID'], 'CODE' => $code])->Fetch();
if ($prop) {
$fields['PROPERTY_VALUES'][$prop['ID']] = $value;
}
}
}
$result = $el->Update($elementId, $fields);
if ($result) {
return ['success' => true, 'error' => ''];
} else {
$error = $el->LAST_ERROR ?: 'Неизвестная ошибка';
return ['success' => false, 'error' => $error];
}
}
Usage:
// Создание элемента
$result = createElementWithErrors(5, [
'NAME' => 'Новый элемент',
'PREVIEW_TEXT' => 'Описание'
], ['PRICE' => 1000]);
if ($result['success']) {
echo 'Создан элемент ID: ' . $result['id'];
} else {
echo 'Ошибка: ' . $result['error'];
}
// Обновление элемента
$result = updateElementWithErrors(123, ['NAME' => 'Обновлённое название']);
if (!$result['success']) {
echo 'Ошибка обновления: ' . $result['error'];
}
Notes:
⚠️ Всегда проверяйте LAST_ERROR после Add() или Update() — метод может вернуть false без установки ошибки. Для файловых свойств используйте CFile::SaveFile() и передавайте ID файла. При обновлении свойств через PROPERTY_VALUES остальные свойства не изменяются.