Налаштування автоматичної зміни статусів замовлення 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 робочих дні.







