Настройка управления возвратами товаров на 1С-Битрикс
Возвраты — отдельный бизнес-процесс, который в большинстве интернет-магазинов на Битрикс организован плохо: покупатель звонит или пишет, менеджер вручную разбирается с заказом, статусы обновляются в лучшем случае через комментарии. 1С-Битрикс (модуль sale) имеет встроенную систему возвратов, но она требует настройки. В коробке — только базовый функционал: создание возврата, возврат денег через платёжную систему.
Архитектура возвратов в модуле sale
Ключевые сущности:
-
\Bitrix\Sale\PaymentCollectionReturn— возврат платежа -
\Bitrix\Sale\BasketItem— позиция заказа, для которой делается возврат - Таблица
b_sale_order_return— записи о возвратах - Таблица
b_sale_order_return_basket— позиции в возврате
Создание возврата через 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();
}
}
Настройка статусов возврата
В административной панели: Интернет-магазин → Статусы возвратов. Стандартный минимальный набор:
| Код | Название | Описание |
|---|---|---|
| WAIT | Ожидает рассмотрения | Новая заявка, не обработана |
| REVIEW | На рассмотрении | Менеджер изучает заявку |
| APPROVED | Одобрен | Возврат одобрен, ожидаем товар |
| RECEIVED | Товар получен | Склад принял возвращённый товар |
| REFUND | Деньги возвращены | Платёж проведён |
| REJECTED | Отклонён | Возврат отклонён с причиной |
| EXCHANGE | Обмен | Замена на другой товар |
Создание статуса через PHP:
\CSaleOrderReturnStatus::Add([
'ID' => 'WAIT',
'NAME' => 'Ожидает рассмотрения',
'SORT' => 100,
'COLOR' => '#f0ad4e',
]);
Интеграция с 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;
}
}
Права доступа к возвратам
В Битрикс права на работу с возвратами управляются через роли в модуле sale. Настройка: Интернет-магазин → Настройки → Права доступа.
Рекомендуемые роли:
- Менеджер возвратов: просмотр всех возвратов, смена статусов до «Одобрен»
- Старший менеджер: полные права на возвраты, включая возврат денег
- Покупатель: создание заявки на возврат через личный кабинет
Личный кабинет: компонент заявки на возврат
Стандартный компонент 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/',
]
);
Состав работ
- Настройка статусов возврата под бизнес-процесс
- Компонент создания заявки в личном кабинете
- Обработчики событий смены статуса (уведомления, синхронизация со складом)
- Интеграция возврата денег через API платёжных систем
- Административный интерфейс: список возвратов, фильтры, экспорт
- Настройка прав доступа для ролей сотрудников
Сроки: базовая настройка с личным кабинетом и статусами — 1–2 недели. Полная система с автоматическим возвратом денег и интеграцией 1С — 3–5 недель.







