Настройка управления возвратами товаров на 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Настройка управления возвратами товаров на 1С-Битрикс
Простая
~1 рабочий день
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1173
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    811
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    745
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Настройка управления возвратами товаров на 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 недель.