Налаштування автоматичної обробки повернень 1С-Битрикс
Автоматизація повернень потрібна там, де обсяг понад 20–30 заявок на день і менеджер витрачає суттєвий час на рутинні операції: перевірити оплату замовлення, створити повернення в 1С, провести повернення грошей, відправити листа покупцю. Кожну з цих дій можна запустити автоматично при зміні статусу заявки — через обробники подій модуля sale та агенти Бітрикс.
Наша команда за 8 років роботи з платформою реалізувала понад 40 автоматизацій повернень для інтернет-магазинів різного масштабу. Ми забезпечуємо повну інтеграцію з 1С та платіжними шлюзами, що скорочує середній час обробки однієї заявки з 15 хвилин до 2 хвилин. Економія для магазину з потоком 50 повернень на день становить близько 10 годин роботи менеджера на тиждень — це вивільняє ресурси на більш важливі завдання. Також автоматизація виключає людські помилки при поверненні грошових коштів та роботі з 1С.
Подійна модель повернень
Модуль sale генерує події при роботі з поверненнями. Ключові точки для автоматизації:
-
OnSaleOrderReturnSaved— створення або оновлення заявки -
OnSaleOrderReturnStatusChange— зміна статусу -
OnSalePaymentCollectionReturnAdd— додавання повернення платежу
Реєструємо обробники в /local/php_interface/init.php:
$eventManager = \Bitrix\Main\EventManager::getInstance(); $eventManager->addEventHandler('sale', 'OnSaleOrderReturnSaved', [\Local\Returns\AutoProcessor::class, 'onReturnSaved']); $eventManager->addEventHandler('sale', 'OnSaleOrderReturnStatusChange', [\Local\Returns\AutoProcessor::class, 'onStatusChange']); Автоматичні дії при створенні заявки
namespace Local\Returns; class AutoProcessor { public static function onReturnSaved(\Bitrix\Main\Event $event): void { $return = $event->getParameter('ENTITY'); if (!$return instanceof \Bitrix\Sale\OrderReturn) return; // Тільки при створенні (не при оновленні) if (!$event->getParameter('IS_NEW')) return; $returnId = $return->getId(); // 1. Призначаємо відповідального за ротацією self::assignResponsible($returnId); // 2. Відправляємо підтвердження покупцю Notifications::sendToCustomer($returnId, 'RETURN_CREATED'); // 3. Сповіщаємо менеджера Notifications::sendToManager($returnId, 'NEW_RETURN'); // 4. Якщо сума повернення невелика — автосхвалюємо self::tryAutoApprove($return); } public static function onStatusChange(\Bitrix\Main\Event $event): void { $returnId = $event->getParameter('RETURN_ID'); $newStatus = $event->getParameter('NEW_STATUS_ID'); $oldStatus = $event->getParameter('OLD_STATUS_ID'); $handler = new self(); $handler->handleStatusTransition($returnId, $oldStatus, $newStatus); } private function handleStatusTransition(int $returnId, string $from, string $to): void { match ($to) { 'APPROVED' => $this->onApproved($returnId), 'RECEIVED' => $this->onReceived($returnId), 'REJECTED' => $this->onRejected($returnId), 'REFUND' => $this->onRefunded($returnId), default => null, }; } } Автосхвалення дрібних повернень
Повернення до певної суми (конфігурований поріг) не потребують ручної перевірки:
private static function tryAutoApprove(\Bitrix\Sale\OrderReturn $return): void { $autoApproveLimit = (float)\Bitrix\Main\Config\Option::get( 'local.returns', 'auto_approve_limit', 500 ); $returnAmount = (float)$return->getField('REFUND_AMOUNT'); if ($returnAmount <= 0 || $returnAmount > $autoApproveLimit) { return; } // Перевіряємо: покупець без історії спірних повернень $userId = $return->getOrder()->getUserId(); if (self::hasDisputeHistory($userId)) { return; } // Автоматично змінюємо статус на APPROVED $return->setField('STATUS_ID', 'APPROVED'); $return->setField('MANAGER_COMMENT', 'Автосхвалено: сума до ' . $autoApproveLimit . ' руб.'); $result = $return->save(); if ($result->isSuccess()) { \CEventLog::Add([ 'SEVERITY' => 'INFO', 'AUDIT_TYPE_ID' => 'RETURN_AUTO_APPROVED', 'MODULE_ID' => 'local.returns', 'DESCRIPTION' => "Return #{$return->getId()} auto-approved, amount: {$returnAmount}", ]); } } private static function hasDisputeHistory(int $userId): bool { // Рахуємо відхилені повернення за останні 6 місяців $dateFrom = new \Bitrix\Main\Type\Date(); $dateFrom->add('-180 days'); $result = \Bitrix\Sale\OrderReturnTable::getList([ 'filter' => [ '=ORDER.USER_ID' => $userId, 'STATUS_ID' => 'REJECTED', '>=DATE_INSERT' => $dateFrom, ], 'select' => ['ID'], ]); return (bool)$result->fetch(); } Автоматичне повернення грошей при схваленні
При переході в статус «Схвалено» — автоматично ініціюємо повернення через API платіжної системи:
private function onApproved(int $returnId): void { $return = \Bitrix\Sale\OrderReturn::loadById($returnId); if (!$return) return; $order = $return->getOrder(); $payments = $order->getPaymentCollection(); foreach ($payments as $payment) { if (!$payment->isPaid()) continue; $psHandler = \Bitrix\Sale\PaySystem\Manager::getObjectById( $payment->getPaymentSystemId() ); if (!$psHandler) continue; $supportsRefund = method_exists($psHandler, 'refund'); if (!$supportsRefund) { // Платіжна система не підтримує автоматичне повернення — ставимо в чергу для ручної обробки $this->flagForManualRefund($returnId, 'PS does not support auto refund'); continue; } $refundAmount = (float)$return->getField('REFUND_AMOUNT'); $result = $psHandler->refund($payment, $refundAmount); if ($result->isSuccess()) { $return->setField('STATUS_ID', 'REFUND'); $return->setField('REFUND_DATE', new \Bitrix\Main\Type\DateTime()); $return->save(); Notifications::sendToCustomer($returnId, 'RETURN_REFUNDED'); } else { $this->flagForManualRefund($returnId, implode('; ', $result->getErrorMessages())); } } } Автоматична перевірка отримання товару через трекінг
Якщо покупець відправляє товар назад за трекінг-номером, можна автоматично відстежувати доставку:
class TrackingWatcher { // Агент, що запускається кожні 2 години public static function checkPendingReturns(): string { $returns = \Bitrix\Sale\OrderReturnTable::getList([ 'filter' => [ 'STATUS_ID' => 'APPROVED', 'UF_TRACKING' => ['!=', '', false], // заявки з трекінг-номером ], 'select' => ['ID', 'UF_TRACKING', 'UF_CARRIER'], ]); $checker = new \Local\Delivery\TrackingChecker(); while ($row = $returns->fetch()) { $status = $checker->getStatus($row['UF_TRACKING'], $row['UF_CARRIER'] ?? 'pochta'); if ($status === 'delivered') { $return = \Bitrix\Sale\OrderReturn::loadById($row['ID']); $return->setField('STATUS_ID', 'RECEIVED'); $return->save(); } } return 'checkPendingReturns();'; // перезапуск агента } } Ескалація прострочених заявок
Агент для контролю SLA за поверненнями:
class SlaWatcher { private const SLA_HOURS = [ 'WAIT' => 24, // розглянути протягом 24 годин 'REVIEW' => 48, // прийняти рішення протягом 48 годин ]; public static function checkOverdue(): string { foreach (self::SLA_HOURS as $statusId => $maxHours) { $deadline = new \Bitrix\Main\Type\DateTime(); $deadline->add('-' . $maxHours . ' hours'); $overdueReturns = \Bitrix\Sale\OrderReturnTable::getList([ 'filter' => [ 'STATUS_ID' => $statusId, '<=DATE_STATUS' => $deadline, ], 'select' => ['ID', 'RESPONSIBLE_ID', 'ORDER_ID'], ]); while ($row = $overdueReturns->fetch()) { Notifications::escalate($row['ID'], $row['RESPONSIBLE_ID'], $statusId, $maxHours); } } return 'checkOverdue();'; } } Що входить в роботу
- Обробники подій:
OnSaleOrderReturnSaved,OnSaleOrderReturnStatusChange - Логіка автосхвалення за сумою та історією покупця
- Автоповернення грошей через API платіжних систем (ЮKassa, Тинькофф тощо)
- Агент трекінгу вхідних посилок (Укрпошта, Нова Пошта, Інтайм)
- Агент SLA-моніторингу з ескалацією прострочених заявок
- Email-автоматика: шаблони під кожен статус
Процес оцінки та роботи
- Збір даних — аналізуємо поточну конфігурацію магазину, обсяги повернень, інтеграції з 1С та платіжними системами.
- Аудит — вивчаємо налаштування модуля
sale, статуси заявок, наявні обробники та агенти. - Проєктування — розробляємо архітектуру автоматизації: точки інтеграції, логіку переходів, обробку винятків.
- Оцінка — на основі аудиту визначаємо точну вартість та строки.
- Розробка — реалізуємо обробники, агенти, шаблони листів, інтеграцію з платіжними шлюзами.
- Тестування — проводимо на staging-стенді з повною копією production-даних.
- Запуск — викочуємо зміни в бойове середовище, контролюємо перші дні роботи.
Орієнтири за термінами
- Базова автоматизація (сповіщення + автоповернення грошей) — 2–3 тижні.
- Повний стек з SLA-моніторингом та трекінгом — 4–6 тижнів.
Точні строки визначаються після аудиту вашої конфігурації. Стоимость проекта зависит от сложности и объёма работ.
Якщо ваша компанія стикнулася з описаною проблемою, зв'яжіться з нами для безкоштовної консультації. Проведемо аналіз вашої системи та запропонуємо оптимальне рішення.







