Налаштування часткового повернення коштів на 1С-Бітрікс

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Налаштування часткового повернення коштів на 1С-Бітрікс
Проста
~1 робочий день
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • 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
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

Налаштування часткового повернення коштів на 1С-Бітрікс

Часткове повернення потрібне, коли покупець відмовився від однієї позиції із замовлення, або частина товарів виявилась недоступною для відвантаження, або послуга надана не в повному обсязі. На відміну від повного повернення, часткове вимагає точного розрахунку суми і — при підключеному онлайн-касі — відправки чека корекції. Стандартний модуль sale 1С-Бітрікс підтримує повернення, але потребує додаткового налаштування для коректної роботи з еквайрингом.

Архітектура повернень у 1С-Бітрікс

Повернення в 1С-Бітрікс — це об'єкт \Bitrix\Sale\PaymentCollection::createRefund() або прямий виклик API еквайрингу. Два підходи:

Через модуль sale — створюємо повернення коштів через платіжний обробник. Плюс: автоматичне оновлення статусу замовлення, журналювання. Мінус: обробник повинен підтримувати метод refund.

Безпосередньо через API еквайрингу — викликаємо API повернення незалежно від 1С-Бітрікс, потім вручну оновлюємо статус. Плюс: більше контролю. Мінус: потрібно синхронізувати стан.

Реалізація методу повернення в обробнику

class MyGatewayHandler extends \Bitrix\Sale\PaySystem\ServiceHandler
    implements \Bitrix\Sale\PaySystem\IRefund
{
    public function refund(
        \Bitrix\Sale\Payment $payment,
        $refundableSum
    ): \Bitrix\Sale\PaySystem\ServiceResult {

        $result = new \Bitrix\Sale\PaySystem\ServiceResult();

        $externalId = $payment->getField('PS_INVOICE_ID');
        if (!$externalId) {
            $result->addError(new \Bitrix\Main\Error('Не знайдено зовнішній ID платежу'));
            return $result;
        }

        try {
            $refundResult = $this->gateway->createRefund([
                'payment_id'  => $externalId,
                'amount'      => [
                    'value'    => number_format($refundableSum, 2, '.', ''),
                    'currency' => $payment->getField('CURRENCY'),
                ],
                'description' => 'Часткове повернення за замовленням ' . $payment->getOrderId(),
            ]);

            $result->setOperationType(
                \Bitrix\Sale\PaySystem\ServiceResult::MONEY_LEAVING
            );
            $result->setData(['refund_id' => $refundResult['id']]);
        } catch (\Exception $e) {
            $result->addError(new \Bitrix\Main\Error($e->getMessage()));
        }

        return $result;
    }
}

Часткове повернення через ЮКасу

// Повернення конкретної суми з оплаченого платежу
$refund = $yookassaClient->createRefund([
    'payment_id'  => $psInvoiceId,
    'amount'      => [
        'value'    => number_format($refundAmount, 2, '.', ''),
        'currency' => 'RUB',
    ],
    'description' => 'Повернення товару: ' . $itemName,
    'receipt'     => $refundReceipt,  // обов'язково при підключеній касі
], uniqid('', true));

Чек повернення (фіскальне законодавство)

При підключеному онлайн-касі часткове повернення вимагає чека з типом refund. Позиції чека — лише ті товари/послуги, за якими здійснюється повернення:

$refundReceipt = [
    'customer' => ['email' => $buyer->getEmail()],
    'items'    => [],
];

foreach ($returnedItems as $item) {
    $refundReceipt['items'][] = [
        'description'     => $item['name'],
        'quantity'        => $item['quantity'],
        'amount'          => [
            'value'    => number_format($item['price'], 2, '.', ''),
            'currency' => 'RUB',
        ],
        'vat_code'        => $item['vat_code'],
        'payment_subject' => 'commodity',
        'payment_mode'    => 'full_refund',  // для чека повернення
    ];
}

Сума позицій у чеку повернення повинна точно збігатися з сумою amount у запиті повернення — це перевіряється платіжною системою.

Ініціація повернення з адміністративної частини

В адмінці 1С-Бітрікс кнопка «Повернення» на сторінці замовлення (/bitrix/admin/sale_order_detail.php) створює форму введення суми. При відправці викликається метод \Bitrix\Sale\PaymentCollection::createRefund():

$order = \Bitrix\Sale\Order::load($orderId);
$paymentCollection = $order->getPaymentCollection();

foreach ($paymentCollection as $payment) {
    if ($payment->isPaid() && $payment->getField('PS_INVOICE_ID') === $externalId) {
        $paymentService = \Bitrix\Sale\PaySystem\Manager::getObjectById(
            $payment->getPaymentSystemId()
        );
        $result = $paymentService->refund($payment, $refundAmount);
        break;
    }
}

Терміни

Завдання Термін
Реалізація методу refund в обробнику 1 день
Чек повернення для фіскального законодавства 1 день
UI в адміністративній частині 0.5 дня