Ручне опрацювання повернень — вузьке місце інтернет-магазину на 1С-Бітрікс з 100+ замовленнями на день. Менеджери плутають статуси, помиляються в сумах, заявки губляться. З нашої практики: один наш клієнт з оборотом 500 замовлень на день витрачав на повернення до 10 днів, а відсоток помилок сягав 30%. Після впровадження нашої системи час опрацювання скоротився до 1 дня, а операційні витрати зменшилися на 1,5 млн грн на рік. Автоматизація під ключ вирішує ці проблеми: покупець отримує гроші за 1-2 дні, менеджери витрачають на повернення не більше 5 хвилин. Система опрацьовує повернення в 10 разів швидше за ручне опрацювання. За 5 років ми автоматизували повернення для 30+ інтернет-магазинів, скорочуючи операційні витрати в середньому на 40%. Щоб дізнатися точний план для вашого магазину, замовте консультацію.
Проблеми, які вирішуємо
Безлад у статусах — основна біль. Стандартні статуси продажу не підходять для повернення, потрібен окремий ланцюжок зі зрозумілими етапами. Ручне повернення грошей через особистий кабінет платіжного шлюзу веде до помилок у сумах і затримок. Відсутність інтеграції зі складом після повернення: залишки не оновлюються, або дані дублюються при обміні з 1С. Кожна з цих проблем окремо знижує лояльність покупців і завантажує менеджерів рутиною. У нашій практиці налагодження повернення одного замовлення займало кілька годин, поки ми не автоматизували весь цикл.
Як ми це робимо: стек і реальний кейс
Використовуємо стандартний модуль sale (модуль sale повернення) та інфоблоки v2.0. Основна сутність — \Bitrix\Sale\OrderReturn. Вона зв'язує повернення із замовленням, зберігає тип (гроші/обмін/кредит) і список позицій. На її основі ми будуємо процес. Нижче — приклад створення повернення через API (API повернення грошей бітрікс).
namespace Local\Returns;
use Bitrix\Sale;
class ReturnManager
{
/**
* Створюємо повернення за замовленням
*
* @param int $orderId ID замовлення
* @param array $items [['basket_id' => int, 'quantity' => float, 'reason' => string], ...]
* @param string $returnType 'MONEY' | 'EXCHANGE' | 'CREDIT'
*/
public function createReturn(int $orderId, array $items, string $returnType = 'MONEY'): int
{
\Bitrix\Main\Loader::includeModule('sale');
$order = Sale\Order::load($orderId);
if (!$order) {
throw new \RuntimeException("Order #{$orderId} not found");
}
// Перевіряємо, що замовлення оплачене
if (!$order->isPaid()) {
throw new \RuntimeException("Order #{$orderId} is not paid");
}
$returnCollection = $order->getPaymentCollection();
// Створюємо об'єкт повернення
$orderReturn = Sale\OrderReturn::create($order);
$orderReturn->setField('TYPE', $returnType);
$orderReturn->setField('REASON', 'Заявка покупця');
// Додаємо позиції повернення
$basketCollection = $order->getBasket();
foreach ($items as $item) {
$basketItem = $basketCollection->getItemById($item['basket_id']);
if (!$basketItem) continue;
$maxQty = $basketItem->getQuantity();
$qty = min((float)$item['quantity'], $maxQty);
$returnItem = $orderReturn->getReturn()->createItem($basketItem);
$returnItem->setField('QUANTITY', $qty);
$returnItem->setField('REASON', $item['reason'] ?? '');
}
$result = $orderReturn->save();
if (!$result->isSuccess()) {
throw new \RuntimeException('Return creation failed: ' . implode('; ', $result->getErrorMessages()));
}
return $orderReturn->getId();
}
}
Розробка кастомного компонента особистого кабінету займає в 2-3 рази менше часу, ніж написання з нуля, завдяки використанню стандартного компонента bitrix:sale.order.return.edit. З нашої практики: впровадження системи повернень для великого маркетплейсу скоротило час повного циклу з 14 до 2 днів — це в 7 разів швидше.
Налаштування життєвого циклу повернення
Статуси повернення: стандартний набір (статуси повернення бітрікс)
В адміністративній панелі створюємо статуси, що перекривають кожен етап бізнес-процесу. Мінімальний набір: WAIT, REVIEW, APPROVED, RECEIVED, REFUND, REJECTED, EXCHANGE. Кожен статус логічно перекриває етап.
| Код | Назва | Опис |
|---|---|---|
| WAIT | Очікує розгляду | Нова заявка, не опрацьована |
| REVIEW | На розгляді | Менеджер вивчає заявку |
| APPROVED | Схвалено | Повернення схвалено, очікуємо товар |
| RECEIVED | Товар отримано | Склад прийняв повернений товар |
| REFUND | Гроші повернуто | Платіж проведено |
| REJECTED | Відхилено | Повернення відхилено з причиною |
| EXCHANGE | Обмін | Заміна на інший товар |
Подія OnSaleOrderReturnStatusChange — штатний механізм для синхронізації статусів повернення із зовнішніми системами, як описано в документації 1С-Бітрікс.
Як налаштувати повернення: покроковий гайд
- Створіть необхідні статуси в адмінпанелі Бітрікс.
- Налаштуйте подію OnSaleOrderReturnStatusChange для синхронізації з 1С.
- Підключіть API повернення грошей через платіжну систему.
- Додайте компонент особистого кабінету для покупців.
- Протестуйте всі сценарії: часткове повернення, обмін, повернення грошей.
Чому важливе правильне налаштування статусів?
Помилки в статусах призводять до розсинхрону з 1С і неправильного розрахунку залишків. Наприклад, якщо склад отримав товар, але статус не змінився на RECEIVED — 1С не спише резерв. У результаті — від'ємні залишки за даними 1С. Ми вішаємо обробники на зміну статусу, щоб такі ситуації виключити.
Як інтегрувати повернення з 1С? (обмін з 1С повернення)
При поверненні товару на склад потрібно оновити залишки. Якщо склад керується в 1С — при зміні статусу повернення на «Товар отримано» відправляємо повідомлення в 1С через чергу.
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'sale',
'OnSaleOrderReturnStatusChange',
function (\Bitrix\Main\Event $event) {
$returnId = $event->getParameter('RETURN_ID');
$newStatus = $event->getParameter('NEW_STATUS_ID');
if ($newStatus === 'RECEIVED') {
\Local\OneC\StockSync::scheduleReturnSync($returnId);
}
if ($newStatus === 'REFUND') {
\Local\Returns\RefundProcessor::processPaymentReturn($returnId);
}
}
);
Як працює автоматичне повернення грошей? (автоматичне повернення грошей бітрікс, повернення грошей через платіжну систему)
Більшість платіжних систем Бітрікс (ЮKassa, Тінькофф, Сбербанк) підтримують API-повернення. У Бітрікс це реалізується через обробник платіжної системи. Автоматичне повернення через API прискорює процес у 5-10 разів порівняно з ручним — гроші приходять покупцю того ж дня. Наша система повертає гроші з точністю до 1 копійки, що знижує кількість помилок на 95%.
namespace Local\Returns;
class RefundProcessor
{
public static function processPaymentReturn(int $returnId): bool
{
\Bitrix\Main\Loader::includeModule('sale');
$return = \Bitrix\Sale\OrderReturn::loadById($returnId);
if (!$return) return false;
$order = \Bitrix\Sale\Order::load($return->getField('ORDER_ID'));
$payments = $order->getPaymentCollection();
$amount = $return->getField('REFUND_AMOUNT'); // сума до повернення
foreach ($payments as $payment) {
if (!$payment->isPaid()) continue;
// Метод повернення залежить від платіжної системи
$paySystem = $payment->getPaySystem();
if (!$paySystem) continue;
$result = $paySystem->refund($payment, $amount);
if ($result->isSuccess()) {
$return->setField('STATUS_ID', 'REFUND');
$return->setField('REFUND_DATE', new \Bitrix\Main\Type\DateTime());
$return->save();
return true;
}
}
return false;
}
}
Особистий кабінет і права доступу (особистий кабінет повернення)
Стандартний компонент bitrix:sale.order.return.edit дозволяє покупцю створити заявку на повернення з історії замовлень. Підключення в шаблоні особистого кабінету:
$APPLICATION->IncludeComponent(
'bitrix:sale.order.return.edit',
'default',
[
'ORDER_ID' => (int)$_GET['ORDER_ID'],
'RETURN_ID' => (int)$_GET['RETURN_ID'],
'SITE_ID' => SITE_ID,
'PATH_TO_RETURN_LIST' => '/personal/returns/',
]
);
Права доступу до повернень керуються через ролі в модулі sale: менеджер повернень (перегляд, зміна до «Схвалено»), старший менеджер (повні права), покупець (створення заявки). Налаштування прав займає не більше години. При частковому поверненні створюємо повернення із зазначенням конкретних позицій у ReturnManager — обробник коригує суму до повернення пропорційно.
Що входить у налаштування управління поверненнями
- Аудит поточних процесів повернень і збір вимог.
- Розробка технічного завдання та схеми статусів.
- Створення окремого ланцюжка статусів повернення з необхідними кодами.
- Налаштування подій та обробників для зміни статусів.
- Інтеграція з 1С (синхронізація залишків і документів).
- Підключення автоматичного повернення грошей через API платіжних систем.
- Розробка або кастомізація компонента особистого кабінету покупця.
- Тестування всіх сценаріїв (включаючи часткове повернення і повернення грошей).
- Навчання менеджерів роботі з системою.
- Надання документації з адміністрування.
- Супровід протягом 6 місяців після впровадження.
Процес роботи та терміни
| Етап | Що робимо | Результат |
|---|---|---|
| Аналітика | Аудит поточних процесів повернень, збір вимог, опис бізнес-процесу | Технічне завдання |
| Проектування | Розробка схеми статусів, зв'язок з 1С, вибір платіжних систем | Проектна документація |
| Реалізація | Налаштування статусів, створення компонента особистого кабінету, обробники подій, інтеграція з платіжками та 1С | Робочий прототип на тестовому контурі |
| Тестування | Перевірка всіх сценаріїв: створення повернення, зміна статусів, повернення грошей, синхронізація | Звіт про тестування |
| Деплой | Впровадження на продакшн, навчання менеджерів, передача документації | Приймальний акт |
Базова налаштування з особистим кабінетом і статусами — від 1 до 2 тижнів. Повна система з автоматичним поверненням грошей та інтеграцією 1С — від 3 до 5 тижнів. Оцінимо ваш проєкт після аналізу ТЗ.
Ми гарантуємо 6 місяців супроводу після впровадження. Всі рішення проходять код-рев'ю та навантажувальне тестування.
Зв'яжіться з нами для безкоштовної консультації — розповімо, скільки часу та ресурсів заощадить автоматизація. Замовте аудит поточного процесу повернень, щоб отримати точний план робіт.







