Частичный возврат в интернет-магазине на Битрикс — технически сложная задача. Одна позиция бракованная, другая не подошла по размеру: нужно вернуть не всю сумму, а только часть, корректно пересчитать чек по 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 дня |
Сроки уточняются после анализа вашего текущего решения. Мы оценим проект бесплатно. Для точного расчёта сроков и стоимости закажите консультацию — мы бесплатно проанализируем вашу текущую конфигурацию и подготовим предложение.







