Частичный возврат на 1С-Битрикс: интеграция API и фискализация чека

Частичный возврат в интернет-магазине на Битрикс — технически сложная задача. Одна позиция бракованная, другая не подошла по размеру: нужно вернуть не всю сумму, а только часть, корректно пересчитать чек по 54-ФЗ и обновить статусы. Ошибка в чеке влечёт существенные штрафы. Наш опыт внедрения таких
Услуги, которые мы предлагаем
Показано 1 из 1Все 1626 услуг
Частичный возврат на 1С-Битрикс: интеграция API и фискализация чека
Простой
~1 день

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

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1415
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    995
  • 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
    734
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    863
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    773
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    1134

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

Частые ошибки и их решения
  1. Несовпадение суммы возврата и суммы в чеке — используем автоматическую верификацию.
  2. Ошибка подписи запроса (Token) — проверяем порядок параметров и регистр.
  3. Задвоение запросов — применяем идемпотентность через uniqid.
  4. Неверный VAT code — сверяем с настройками фискального регистратора.

Что входит в работу

  • Аудит текущей конфигурации Битрикс и платёжных шлюзов
  • Проектирование архитектуры частичного возврата
  • Реализация кастомного обработчика с интеграцией API
  • Настройка формирования чека возврата под 54-ФЗ
  • Тестирование на песочнице и боевом контуре
  • Документация и обучение менеджеров работе с интерфейсом
  • Гарантия на код и поддержка после внедрения

Сравнение стандартного и кастомного решения

Характеристика Стандартный модуль Кастомное решение
Поддержка частичного возврата Ограниченная Да
Гибкость Нет Полная
Интеграция с любым провайдером Нет Да
Скорость обработки ~3 мин ~30 сек

Сроки

Задача Срок
Частичный возврат без фискализации 1–2 дня
Частичный возврат + чек возврата (54-ФЗ) 2–4 дня
Интерфейс для менеджера в админке 1–2 дня

Сроки уточняются после анализа вашего текущего решения. Мы оценим проект бесплатно. Для точного расчёта сроков и стоимости закажите консультацию — мы бесплатно проанализируем вашу текущую конфигурацию и подготовим предложение.