Настройка автоматической смены статусов заказа 1С-Битрикс
Ручная смена статусов менеджером — узкое место. При объёме от 100 заказов в день на это уходит значимое время, растёт риск забытых заказов. Автоматизация закрывает типичные сценарии: «перевести в Подтверждён после оплаты», «отменить если предоплата не поступила за 24 часа», «перевести в Доставлен после подтверждения от транспортной компании».
Автосмена статуса при оплате
Событие OnSalePaymentPaid срабатывает когда платёжный модуль помечает оплату проведённой — и при ручном подтверждении менеджером, и при автоматическом IPN от платёжной системы:
AddEventHandler('sale', 'OnSalePaymentPaid', function(\Bitrix\Main\Event $event) {
$payment = $event->getParameter('ENTITY');
$order = $payment->getOrder();
if ($payment->isPaid() && $order->getField('STATUS_ID') === 'WAIT_PREPAY') {
$order->setField('STATUS_ID', 'F');
$order->save();
}
});
Автоотмена по истечению времени
Реализуется через агент Битрикс — он запускается по расписанию и проверяет заказы без оплаты:
// Регистрация агента (разово)
\CAgent::AddAgent(
'Local\Sale\OrderAgents::cancelUnpaidOrders();',
'local',
'N',
3600, // каждый час
'',
'Y',
\ConvertTimeStamp(time() + 3600, 'FULL'),
);
class OrderAgents
{
public static function cancelUnpaidOrders(): string
{
$deadline = new \Bitrix\Main\Type\DateTime();
$deadline->add('-24 hours');
$result = \Bitrix\Sale\Internals\OrderTable::getList([
'filter' => [
'STATUS_ID' => 'WAIT_PREPAY',
'<DATE_INSERT' => $deadline,
],
'select' => ['ID'],
'limit' => 50,
]);
while ($row = $result->fetch()) {
$order = \Bitrix\Sale\Order::load($row['ID']);
if ($order) {
$order->setField('STATUS_ID', 'CANCEL');
$order->save();
}
}
return 'Local\Sale\OrderAgents::cancelUnpaidOrders();';
}
}
Лимит 50 заказов за итерацию защищает от таймаута при большом накопленном объёме.
Автоматизация через бизнес-процессы
Для сложных цепочек с условиями и задержками — бизнес-процессы Sale (Интернет-магазин → Бизнес-процессы заказов). Доступные триггеры:
- По статусу — запуск при переходе в определённый статус
- По оплате — при подтверждении или возврате платежа
- По времени — через N часов/дней после создания или смены статуса
Пример: «Через 2 часа после перехода в Передан курьеру — отправить SMS с запросом оценки». Реализуется без кода через конструктор BP.
Интеграция со статусами транспортных компаний
// Webhook от ТК — POST /bitrix/tools/delivery_webhook.php
$trackNumber = $_POST['track'];
$deliveryStatus = $_POST['status'];
$shipmentResult = \Bitrix\Sale\Internals\ShipmentTable::getList([
'filter' => ['TRACKING_NUMBER' => $trackNumber],
'select' => ['ORDER_ID'],
]);
if ($shipment = $shipmentResult->fetch()) {
$order = \Bitrix\Sale\Order::load($shipment['ORDER_ID']);
$statusMap = ['delivered' => 'D', 'returned' => 'RETURN_INIT', 'lost' => 'PROBLEM'];
$newStatus = $statusMap[$deliveryStatus] ?? null;
if ($newStatus && $order) {
$order->setField('STATUS_ID', $newStatus);
$order->save();
}
}
Автозавершение доставленных заказов
Перевод в «Закрыт» через 14 дней после доставки без претензий:
public static function completeDeliveredOrders(): string
{
$deadline = new \Bitrix\Main\Type\DateTime();
$deadline->add('-14 days');
$result = \Bitrix\Sale\Internals\OrderTable::getList([
'filter' => ['STATUS_ID' => 'D', '<DATE_STATUS' => $deadline],
'select' => ['ID'],
'limit' => 100,
]);
while ($row = $result->fetch()) {
$order = \Bitrix\Sale\Order::load($row['ID']);
if ($order) {
$order->setField('STATUS_ID', 'CLOSED');
$order->save();
}
}
return 'Local\Sale\OrderAgents::completeDeliveredOrders();';
}
Сроки выполнения
Автосмена при оплате и один агент автоотмены — 3–5 часов. Полная автоматизация с интеграцией ТК, бизнес-процессами и несколькими агентами — 1–3 рабочих дня.







