Настройка полного возврата средств на 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Настройка полного возврата средств на 1С-Битрикс
Простая
~1 рабочий день
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1177
  • 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С Предприятие для компании МИРСАНБЕЛ
    747
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Настройка полного возврата средств на 1С-Битрикс

Полный возврат технически проще частичного, но имеет свои подводные камни: временные ограничения банков на возврат, обязательный чек возврата при фискализации, корректное обновление статусов заказа. Разберём реализацию для основных платёжных систем.

Временные ограничения на возврат

Разные эквайеры имеют разные сроки, в которые возврат технически возможен:

Эквайер Срок возврата Метод после срока
Тинькофф До 365 дней Ручной возврат через банк
ЮКасса До 365 дней Через поддержку ЮКасса
Сбербанк До 3 лет Через личный кабинет
CloudPayments До 365 дней Запрос в поддержку

Если срок прошёл — возврат делается банковским переводом вручную, платёжная система здесь не участвует.

Реализация полного возврата

Тинькофф:

// Для одностадийных платежей (уже захваченных)
$params = [
    'TerminalKey' => TINKOFF_TERMINAL,
    'PaymentId'   => $externalPaymentId,
    // Amount не передаём — возврат полной суммы
];
$params['Token'] = tinkoffSign($params, TINKOFF_SECRET);
$result = tinkoffPost('/v2/Cancel', $params);

if ($result['Status'] === 'REFUNDED') {
    setPaymentRefunded($bitrixPaymentId);
}

ЮКасса:

$refund = $client->createRefund([
    'payment_id' => $externalPaymentId,
    'amount'     => [
        'value'    => number_format($payment->getSum(), 2, '.', ''),
        'currency' => 'RUB',
    ],
    'receipt'    => buildRefundReceipt($order), // при подключённой кассе
], uniqid('', true));

if ($refund->getStatus() === 'succeeded') {
    setPaymentRefunded($bitrixPaymentId);
}

Сбербанк (через REST API):

$params = [
    'userName' => SBER_LOGIN,
    'password' => SBER_PASSWORD,
    'orderId'  => $externalOrderId, // orderId в системе Сбербанка
    'amount'   => (int)($refundAmount * 100), // копейки
];

$response = file_get_contents(
    'https://securepayments.sberbank.ru/payment/rest/refund.do?' . http_build_query($params)
);
$result = json_decode($response, true);

if ($result['errorCode'] === '0') {
    setPaymentRefunded($bitrixPaymentId);
}

Обновление статуса заказа в Битрикс

function setPaymentRefunded(int $paymentId): void
{
    $payment = Bitrix\Sale\Payment::loadById($paymentId);
    if (!$payment) return;

    $payment->setPaid('N');
    $payment->setField('PS_STATUS', 'Y');
    $payment->setField('PS_STATUS_CODE', 'refunded');
    $payment->setField('PS_STATUS_MESSAGE', 'Возврат от ' . date('d.m.Y H:i'));
    $payment->save();

    $order = $payment->getCollection()->getOrder();

    // Опционально: переводим заказ в статус "Возврат"
    $order->setField('STATUS_ID', 'RF'); // код статуса возврата
    $order->save();

    // Уведомляем покупателя
    sendRefundNotification($order, $payment->getSum());
}

Чек возврата при 54-ФЗ

Если касса подключена — без чека возврата API ЮКасса/АТОЛ отклонит запрос. Чек зеркально повторяет оригинальный:

function buildRefundReceipt(Bitrix\Sale\Order $order): array
{
    $receipt = ['customer' => ['email' => getBuyerEmail($order)], 'items' => []];

    foreach ($order->getBasket() as $item) {
        $receipt['items'][] = [
            'description'     => $item->getField('NAME'),
            'quantity'        => $item->getQuantity(),
            'amount'          => [
                'value'    => number_format($item->getPrice(), 2, '.', ''),
                'currency' => 'RUB',
            ],
            'vat_code'        => getItemVatCode($item),
            'payment_subject' => 'commodity',
            'payment_mode'    => 'full_payment',
        ];
    }

    // Доставка как отдельная позиция
    $deliveryPrice = $order->getDeliveryPrice();
    if ($deliveryPrice > 0) {
        $receipt['items'][] = [
            'description'     => 'Доставка',
            'quantity'        => 1,
            'amount'          => ['value' => number_format($deliveryPrice, 2, '.', ''), 'currency' => 'RUB'],
            'vat_code'        => 1,
            'payment_subject' => 'service',
            'payment_mode'    => 'full_payment',
        ];
    }

    return $receipt;
}

Интерфейс для менеджера

Стандартный интерфейс Битрикс позволяет инициировать возврат через карточку заказа, если модуль платёжной системы это поддерживает. Если нет — добавляем кнопку «Вернуть оплату» через кастомное действие в административной части:

// Добавляем в шаблон детальной страницы заказа
// local/templates/admin/sale_order_detail/refund_button.php
if ($order->isPaid() && $order->getField('STATUS_ID') !== 'RF') {
    echo '<a href="/local/admin/refund.php?order_id=' . $order->getId() . '"
         class="adm-btn adm-btn-red">Вернуть оплату</a>';
}

Сроки

Задача Срок
Полный возврат без фискализации 0.5–1 день
Полный возврат + чек возврата (54-ФЗ) 1–3 дня
Интерфейс в административной панели 0.5–1 день