PHP
#bitrix#sale#order#php#d7#status#save

D7: Изменить статус заказа и сохранить

Изменение статуса заказа через setField() и сохранение через save() с обработкой результата и ошибок.

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

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

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

use Bitrix\Main\Loader;
use Bitrix\Sale\Order;
use Bitrix\Main\Error;

/**
 * Изменить статус заказа
 * @param int $orderId ID заказа
 * @param string $newStatusId Новый статус (например, 'F', 'P', 'N')
 * @return array ['success' => bool, 'error' => string]
 */
function changeOrderStatus($orderId, $newStatusId) {
    if (!Loader::includeModule('sale')) {
        return ['success' => false, 'error' => 'Модуль sale не подключен'];
    }
    
    // Проверяем существование статуса
    $status = \CSaleStatus::GetByID($newStatusId);
    if (!$status) {
        return ['success' => false, 'error' => 'Статус не найден'];
    }
    
    $order = Order::load($orderId);
    if (!$order) {
        return ['success' => false, 'error' => 'Заказ не найден'];
    }
    
    // Получаем текущий статус
    $currentStatus = $order->getField('STATUS_ID');
    
    // Устанавливаем новый статус
    $result = $order->setField('STATUS_ID', $newStatusId);
    
    if (!$result->isSuccess()) {
        $errors = $result->getErrorMessages();
        return ['success' => false, 'error' => implode(', ', $errors)];
    }
    
    // Сохраняем заказ
    $saveResult = $order->save();
    
    if (!$saveResult->isSuccess()) {
        $errors = $saveResult->getErrorMessages();
        return ['success' => false, 'error' => implode(', ', $errors)];
    }
    
    return [
        'success' => true,
        'error' => '',
        'old_status' => $currentStatus,
        'new_status' => $newStatusId
    ];
}

Usage:

// В обработчике платежа или агенте
$result = changeOrderStatus(12345, 'P'); // P - оплачен

if ($result['success']) {
    echo 'Статус изменён с ' . $result['old_status'] . ' на ' . $result['new_status'];
} else {
    echo 'Ошибка: ' . $result['error'];
}

// Изменить на статус "Выполнен"
changeOrderStatus(12345, 'F');

Notes:

⚠️ После setField() обязательно вызывайте save() для применения изменений. Метод save() возвращает Result объект с методами isSuccess() и getErrorMessages(). Статусы заказа должны существовать в системе (обычно: N - новый, P - оплачен, F - выполнен, C - отменён). Изменение статуса может вызвать события OnSaleOrderSaved.