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







