Частичный возврат в интернет-магазине на Битрикс — технически сложная задача. Одна позиция бракованная, другая не подошла по размеру: нужно вернуть не всю сумму, а только часть, корректно пересчитать чек по 54-ФЗ и обновить статусы. Ошибка в чеке влечёт существенные штрафы. Наш опыт внедрения таких решений — более 10 лет, и мы гарантируем корректную работу с фискальными данными. Если вы столкнулись с ошибками частичного возврата, получите консультацию нашего инженера.
Почему частичный возврат — нетривиальная задача для Битрикс?
Стандартные модули Битрикс часто поддерживают только полный возврат. Согласно документации 1С-Битрикс по модулю Sale, для частичного возврата требуется кастомная разработка: интеграция с API платежных систем, формирование чека возврата по 54-ФЗ и обновление статусов в модуле Sale. Без качественной реализации возможны расхождения между суммой возврата и чеком, что приводит к блокировке кассы налоговой. В 95% случаев ошибка связана с несовпадением суммы возврата и суммы в чеке.
Где выполняется частичный возврат
Частичный возврат инициируется магазином через API платёжной системы. Покупатель обращается в поддержку, менеджер обрабатывает возврат в административной панели Битрикс — либо через стандартный интерфейс (если модуль поддерживает), либо через кастомный обработчик. Мы реализуем удобный интерфейс для менеджера с выбором позиций и автоматическим формированием запросов.
Как убедиться, что чек возврата корректен?
Ключевой момент — сумма позиций в чеке должна точно совпадать с суммой возврата. Даже копеечное расхождение приведёт к ошибке ОФД. Мы используем автоматическую верификацию перед отправкой: сравниваем итоговую сумму с запрошенной, при несовпадении — блокируем отправку и выводим предупреждение. Это исключает штрафы. Дополнительно внедряем логирование всех запросов для аудита.
API возврата: примеры
| Параметр | Тинькофф | ЮKassa |
|---|---|---|
| Метод | /v2/Cancel | createRefund |
| Подпись | Token (MD5) | Basic Auth (shopId + secret) |
| Чек возврата | Не передаётся отдельно | Передаётся в теле запроса |
| Обработка ошибок | HTTP 200 с полем ErrorCode | Исключения ClientException |
Тинькофф:
$params = [ 'TerminalKey' => TINKOFF_TERMINAL, 'PaymentId' => $externalPaymentId, // ID платежа в Тинькофф 'Amount' => (int)($refundAmount * 100), // копейки ]; $params['Token'] = tinkoffSign($params, TINKOFF_SECRET); $result = tinkoffPost('/v2/Cancel', $params); // result['Status'] === 'REFUNDED' — успешный возврат ЮКасса:
use YooKassa\Client; $client = new Client(); $client->setAuth($shopId, $secretKey); $refund = $client->createRefund([ 'payment_id' => $externalPaymentId, 'amount' => [ 'value' => number_format($refundAmount, 2, '.', ''), 'currency' => 'RUB', ], 'description' => 'Возврат позиции: ' . $itemName, 'receipt' => $refundReceiptData, // обязателен при подключённой кассе ], uniqid('', true)); Чек возврата (54-ФЗ)
Если подключена онлайн-касса, частичный возврат требует передачи чека возврата в ОФД. Структура чека возврата идентична исходному, но:
-
typeдокумента:refund(в АТОЛ),payment_refund(в ЮКасса) - В чек включаются только возвращаемые позиции с возвращаемыми суммами
- Сумма позиций в чеке должна точно совпадать с суммой возврата
// Пример чека возврата для ЮКасса $refundReceiptData = [ 'customer' => ['email' => $buyer->getEmail()], 'items' => [], ]; foreach ($refundItems as $item) { $refundReceiptData['items'][] = [ 'description' => $item['name'], 'quantity' => $item['quantity'], 'amount' => [ 'value' => number_format($item['price'] * $item['quantity'], 2, '.', ''), 'currency' => 'RUB', ], 'vat_code' => $item['vat_code'], 'payment_subject' => 'commodity', 'payment_mode' => 'full_payment', ]; } // Проверяем: сумма позиций === сумма возврата $itemsTotal = array_sum(array_column( array_map(fn($i) => ['sum' => $i['price'] * $i['quantity']], $refundItems), 'sum' )); assert(abs($itemsTotal - $refundAmount) < 0.01, 'Расхождение суммы чека!'); Обновление статусов в Битрикс
После успешного возврата нужно обновить состояние в модуле Sale:
// Частичный возврат — не ставим оплату как "возвращена" полностью // Только записываем сумму возврата и обновляем статус товарной позиции $payment = $order->getPaymentCollection()->getItemById($paymentId); $payment->setField('PS_STATUS_MESSAGE', 'Частичный возврат ' . $refundAmount . ' руб. от ' . date('d.m.Y') ); // Обновляем статус возвращённых товарных позиций foreach ($refundItems as $refundItem) { $basketItem = getBasketItemById($order, $refundItem['basket_id']); if ($basketItem) { $basketItem->setField('CUSTOM_PRICE', 'Y'); // Или создаём отдельную запись в истории возвратов } } $order->save(); Кейс из нашей практики: магазин одежды, возврат части заказа
Покупатель заказал 3 позиции на 8 400 руб. Одна позиция не подошла по размеру — возврат 2 100 руб. Через стандартный интерфейс Битрикс возврат не проходил: модуль Тинькофф поддерживал только полный возврат. Наш клиент обратился к нам.
Решение: кастомный обработчик возвратов в /local/. Менеджер выбирает позиции для возврата → PHP-скрипт формирует чек возврата, вызывает /v2/Cancel с частичной суммой, фиксирует результат в пользовательском поле заказа. Время разработки: 3 дня. Кастомное решение оказалось в 2 раза быстрее стандартных модулей при обработке частичных возвратов.
Частые ошибки и их решения
- Несовпадение суммы возврата и суммы в чеке — используем автоматическую верификацию.
- Ошибка подписи запроса (Token) — проверяем порядок параметров и регистр.
- Задвоение запросов — применяем идемпотентность через
uniqid. - Неверный VAT code — сверяем с настройками фискального регистратора.
Что входит в работу
- Аудит текущей конфигурации Битрикс и платёжных шлюзов
- Проектирование архитектуры частичного возврата
- Реализация кастомного обработчика с интеграцией API
- Настройка формирования чека возврата под 54-ФЗ
- Тестирование на песочнице и боевом контуре
- Документация и обучение менеджеров работе с интерфейсом
- Гарантия на код и поддержка после внедрения
Сравнение стандартного и кастомного решения
| Характеристика | Стандартный модуль | Кастомное решение |
|---|---|---|
| Поддержка частичного возврата | Ограниченная | Да |
| Гибкость | Нет | Полная |
| Интеграция с любым провайдером | Нет | Да |
| Скорость обработки | ~3 мин | ~30 сек |
Сроки
| Задача | Срок |
|---|---|
| Частичный возврат без фискализации | 1–2 дня |
| Частичный возврат + чек возврата (54-ФЗ) | 2–4 дня |
| Интерфейс для менеджера в админке | 1–2 дня |
Сроки уточняются после анализа вашего текущего решения. Мы оценим проект бесплатно. Для точного расчёта сроков и стоимости закажите консультацию — мы бесплатно проанализируем вашу текущую конфигурацию и подготовим предложение.







