D7: Изменить статус заказа и сохранить
Изменение статуса заказа через setField() и сохранение через save() с обработкой результата и ошибок.
Как использовать
- Скопируйте нужный фрагмент кода.
- Вставьте в свой проект и при необходимости измените под задачу.
- Проверьте зависимости и окружение (версии, переменные).
Изменение статуса заказа через 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.