Ручная обработка возвратов — узкое место интернет-магазина на 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 месяцев сопровождения после внедрения. Все решения проходят код-ревью и нагрузочное тестирование.
Свяжитесь с нами для бесплатной консультации — расскажем, сколько времени и ресурсов сэкономит автоматизация. Закажите аудит текущего процесса возвратов, чтобы получить точный план работ.







