Ручная обработка возвратов — узкое место интернет-магазина на 1С-Битрикс с 100+ заказами в день. Менеджеры путают статусы, ошибаются в суммах, заявки теряются. Из нашей практики: один клиент с оборотом 500 заказов в день тратил на возврат до 10 дней, а процент ошибок достигал 30%. После внедрения нашей системы время обработки сократилось до 1 дня, а операционные расходы уменьшились на 1,5 млн рублей в год. Автоматизация под ключ решает эти проблемы: покупатель получает деньги за 1-2 дня, менеджеры тратят на возврат не более 5 минут. Система обрабатывает возврат в 10 раз быстрее ручной обработки. Чтобы узнать точный план для вашего магазина, закажите консультацию.
Проблемы, которые решаем
Беспорядок в статусах — основная боль. Стандартные статусы продажи не подходят для возврата, нужна отдельная цепочка с понятными этапами. Ручной возврат денег через личный кабинет платёжного шлюза ведёт к ошибкам в суммах и задержкам. Отсутствие интеграции со складом после возврата: остатки не обновляются, или данные дублируются при обмене с 1С. Каждая из этих проблем в отдельности снижает лояльность покупателей и загружает менеджеров рутиной. В нашей практике отладка возврата одного заказа занимала несколько часов, пока мы не автоматизировали весь цикл.
Как мы это делаем: стек и реальный кейс
Используем стандартный модуль sale и инфоблоки v2.0. Основная сущность — \Bitrix\Sale\OrderReturn. Она связывает возврат с заказом, хранит тип (деньги/обмен/кредит) и список позиций. На её основе мы строим процесс. Ниже — пример создания возврата через 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 дней.
Настройка жизненного цикла возврата
Статусы возврата: стандартный набор
В административной панели создаём статусы, перекрывающие каждый этап бизнес-процесса. Минимальный набор: WAIT, REVIEW, APPROVED, RECEIVED, REFUND, REJECTED, EXCHANGE. Каждый статус логично перекрывает этап.
| Код | Название | Описание |
|---|---|---|
| WAIT | Ожидает рассмотрения | Новая заявка, не обработана |
| REVIEW | На рассмотрении | Менеджер изучает заявку |
| APPROVED | Одобрен | Возврат одобрен, ожидаем товар |
| RECEIVED | Товар получен | Склад принял возвращённый товар |
| REFUND | Деньги возвращены | Платёж проведён |
| REJECTED | Отклонён | Возврат отклонён с причиной |
| EXCHANGE | Обмен | Замена на другой товар |
Событие OnSaleOrderReturnStatusChange — штатный механизм для синхронизации статусов возврата с внешними системами, как описано в документации 1С-Битрикс.
Почему важна правильная настройка статусов?
Ошибки в статусах приводят к рассинхрону с 1С и неправильному расчёту остатков. Например, если склад получил товар, но статус не сменился на RECEIVED — 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-возврат. В Битрикс это реализуется через обработчик платёжной системы:
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; } } Автоматический возврат через API ускоряет процесс в 5-10 раз по сравнению с ручным — деньги приходят покупателю в тот же день.
Личный кабинет и права доступа
Стандартный компонент 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 месяцев сопровождения после внедрения. Все решения проходят код-ревью и нагрузочное тестирование.
Свяжитесь с нами для бесплатной консультации — расскажем, сколько времени и ресурсов сэкономит автоматизация. Закажите аудит текущего процесса возвратов, чтобы получить точный план работ.







