PHP
#bitrix#iblock#php#add#update#errors#validation

Создание и обновление элемента инфоблока с обработкой ошибок

Создание и обновление элементов через CIBlockElement::Add/Update с проверкой результата через LAST_ERROR и валидацией данных.

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

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

Создание и обновление элементов инфоблока с корректной обработкой ошибок через 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 остальные свойства не изменяются.