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

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

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

Этапы разработки

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

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

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

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

Как настроить возврат товаров на 1С-Битрикс?

Типичная картина: менеджер открывает заказ в /bitrix/admin/sale_order_view.php, вручную меняет статус, звонит на склад, потом лезет в 1С формировать документ «Возврат товаров от покупателя». На один возврат — 20–30 минут. При 15 возвратах в день один человек занят только этим. Наш подход ускоряет цикл в 8 раз: от кнопки «Оформить возврат» в личном кабинете до проводки в 1С и чека возврата по 54-ФЗ.

Почему стандартный процесс возврата неэффективен?

В Битриксе из коробки нет отдельной сущности «возврат». Есть статусы заказа в b_sale_status, есть отмена через CSaleOrder::CancelOrder(), но полноценного workflow с частичными возвратами, обменами и обратной логистикой — нет. Приходится строить.

  • Частичный возврат — клиент хочет вернуть 2 из 5 позиций. Стандартный CancelOrder отменяет заказ целиком. Нужна кастомная логика через CSaleBasket и пересчёт CSaleOrder::Update.
  • Остатки разъезжаются — товар приехал на склад, но в b_catalog_store_product его нет, потому что менеджер забыл оприходовать. На сайте — «Нет в наличии», хотя коробка стоит на полке.
  • Возврат денег — ЮKassa, CloudPayments, Тинькофф — у каждого свой метод рефанда, свои таймауты, своя обработка ошибок. Ручной рефанд через личный кабинет платёжки — рутина.
  • 54-ФЗ — чек возврата с признаком расчёта ВОЗВРАТ ПРИХОДА должен уйти на ОФД. Без автоматизации менеджер формирует его вручную в кассовом ПО.

Что мы строим

Личный кабинет покупателя — self-service возврат

Кастомный раздел в /personal/returns/, интегрированный с sale.personal.order.list. Покупатель делает всё сам:

  • выбирает заказ из b_sale_order, видит список позиций из b_sale_basket;
  • отмечает конкретные товары, указывает причину из справочника (свойство инфоблока RETURN_REASONS) или пишет свободный текст;
  • загружает фото через CFile::SaveFile() — брак, повреждения при доставке;
  • выбирает способ возврата: курьер (СДЭК API), ПВЗ, Почта России;
  • указывает куда вернуть деньги: на карту (рефанд через платёжку), на внутренний счёт (CSaleUserAccount), обмен на другой товар;
  • видит статус заявки в реальном времени — через кастомные статусы в b_sale_status_lang.

Админка менеджера — без лишних кликов

Отдельный раздел на базе \Bitrix\Main\Engine\Controller:

  • очередь заявок с фильтрами: статус, сумма, причина, дата, менеджер. Грид на CAdminList или кастомный React-компонент;
  • вся информация по заявке на одном экране: заказ, клиент, история переписки, фото, документы;
  • действия в один клик: одобрить, отклонить, запросить фото, передать на согласование;
  • маршрутизация: возврат свыше порога (настраивается в b_option) уходит руководителю через бизнес-процесс модуля bizproc;
  • автогенерация акта возврата и возвратной накладной — PDF через mPDF или TCPDF.

Автоматизация — минимум ручных операций

  • Возврат до настраиваемого порога (например, 3000 ₽) — автоодобрение через обработчик события OnSaleOrderSaved.
  • Чек возврата 54-ФЗ: вызов \Bitrix\Sale\Cashbox\Manager::addChecks() с типом Check::RETURN_TYPE. Уходит на ОФД автоматически.
  • Цепочка уведомлений: email через CEvent::Send(), SMS через SMS-шлюз, push.
  • После приёмки на складе — автоматическое оприходование через CCatalogStoreDocsBarcode и обновление b_catalog_store_product.
  • Синхронизация с 1С: документ «Возврат товаров от покупателя» создаётся автоматически при обмене через \Bitrix\Sale\Exchange.
  • Бонусные баллы, начисленные за покупку — списание через CSaleUserAccount::UpdateAccount() с отрицательной суммой.
  • Агенты обрабатывают очередь заявок, эпилог шаблона подгружает статусы в личный кабинет в реальном времени.

Как настроить интеграцию с платежными системами без ошибок?

Каждая платёжка — свой API рефанда, свои ограничения по срокам, свои коды ошибок. Опыт сертифицированных разработчиков Битрикс позволяет обработать все сценарии:

  • ЮKassaPOST /v3/refunds, полный и частичный рефанд. Важно: рефанд возможен только в течение 365 дней после платежа. Автоматический чек возврата через receipt API.
  • CloudPayments — метод refund по TransactionId. Рефанд на карту за 1-5 рабочих дней. Если 3DS-платёж — рефанд может занять до 30 дней на стороне банка.
  • Тинькофф ЭквайрингCancel по PaymentId. Если оплата в рассрочку — рефанд пересчитывает график, и это отдельная логика в обработчике sale.paysystem.handler.
  • Apple Pay / Google Pay — рефанд идёт через тот же эквайринг, токен привязан к транзакции.
  • Наложенный платёж — рефанд невозможен через платёжку, нужны банковские реквизиты покупателя. Отдельная форма в ЛК.
  • Внутренний счётCSaleUserAccount::Pay() с зачислением суммы. Мотивируем повышенным коэффициентом (x1.1) — 10% бонус за выбор возврата на баланс вместо карты.

Гарантируем корректную обработку каждого кода ошибки через кастомные обработчики sale.paysystem.handler.

Соответствие законодательству — без вариантов

  • ЗоЗПП, ст. 26.1 — дистанционная продажа: отказ в любой момент до получения, 7 дней после. Система контролирует сроки автоматически и предупреждает менеджера о приближении дедлайна. Подробнее о законе — статья 26.1 ЗоЗПП.
  • 14 дней — возврат товара надлежащего качества. Проверка: date_insert заказа + дата доставки из трекинга + 14 дней. Если просрочено — заявка отклоняется с пояснением.
  • 54-ФЗ — чек возврата обязателен. Федеральный закон №54-ФЗ.
  • Документооборот — акт возврата, заявление покупателя, акт приёмки — шаблоны в системе, заполняются автоматически из данных заказа.

Аналитика возвратов — данные для принятия решений

Кастомный дашборд в админке, данные из b_sale_order + кастомная таблица возвратов:

  • процент возвратов по категориям, брендам, менеджерам, периодам;
  • топ причин возврата. Если «Не соответствует описанию» в топ-3 — проблема в карточках товара, а не в клиентах;
  • финансовый срез: сумма возвратов, средний чек возврата, соотношение рефанд/обмен/баланс;
  • алерты: если процент возвратов по конкретному SKU превысил 15% — уведомление категорийному менеджеру.

Обмен и замена — сохраняем продажу

Не каждый возврат — потерянная выручка. Обмен через CSaleOrder::Update с пересчётом корзины:

  • замена на тот же товар другого размера/цвета — новая позиция в b_sale_basket, старая — на возврат;
  • обмен на другой товар с доплатой — автоматический расчёт разницы, допплата через тот же платёжный метод;
  • генерация накладной на отправку обменного товара через API службы доставки.

Обратная логистика — интеграции

  • СДЭКPOST /v2/orders с type: 2 (возврат). Автоматическая заявка на забор, трекинг через webhook.
  • Boxberry — API парсельшопов для выбора ПВЗ возврата.
  • Почта России — формирование обратной накладной через API отправлений.
  • Трекинг обратной посылки в личном кабинете — статусы подтягиваются через агента на cron.

Как проходит настройка под ключ

  1. Аудит текущего процесса — анализируем бизнес-логику, фиксируем статусы и интеграции.
  2. Проектирование workflow — схема статусов, правила автоодобрения, маршрутизация.
  3. Разработка ЛК покупателя и админки — компоненты, гриды, формы, REST-контроллеры.
  4. Интеграция с платёжками и 1С — настройка каждого обработчика, тест рефандов.
  5. Автоматизация 54-ФЗ и уведомлений — подключение ОФД, шаблонов писем, SMS.
  6. Интеграция служб доставки — СДЭК, Boxberry, Почта России.
  7. Тестирование — полный цикл: заказ → возврат → рефанд → чек → 1С.
  8. Обучение сотрудников и передача документации.

Результаты внедрения

Блок Что получаете
Документация Техническое задание, описание workflow, схему интеграций
Код и конфигурация Готовые компоненты, настройки инфоблоков, HL-блоков, статусов, прав
Интеграция с платежками Подключение ЮKassa, CloudPayments, Тинькофф, Apple Pay/Google Pay
Обмен с 1С Настройка CommerceML, документ возврата в 1С
Автоматизация 54-ФЗ Чек возврата через ОФД, фискализация
Обучение Видеоинструкции для менеджеров и администраторов
Поддержка 1 месяц гарантийного сопровождения после внедрения

Чек-лист проверки перед запуском

  • Проверен рефанд через каждую платёжку (частичный и полный).
  • Тест 54-ФЗ: чек возврата корректен, уходит в ОФД.
  • Обмен с 1С: документ «Возврат товаров от покупателя» создаётся без ошибок.
  • ЛК покупателя: все поля, загрузка фото, выбор способа возврата.
  • Автоодобрение до порога срабатывает.
  • Уведомления (email/SMS/push) приходят.
  • Остатки после приёмки обновляются.
  • Аналитика считает метрики корректно.

Сроки внедрения

Компонент Сроки
ЛК покупателя (форма + статусы) 3-5 дней
Админка менеджера (грид + действия) 3-5 дней
Интеграция с платёжными системами 2-3 дня
Обмен с 1С (документ возврата) 3-5 дней
Автоматизация (54-ФЗ, уведомления, остатки) 2-3 дня
Обратная логистика (СДЭК, Boxberry) 2-3 дня
Итого 2-4 недели

Почему это окупается за месяц?

Сравните: ручная обработка возврата занимает 25 минут, после автоматизации — 3 минуты. Это в 8 раз быстрее. При 15 возвратах в день высвобождается целая ставка менеджера. Экономия на зарплате — до 1.2 млн рублей в год. Плюс рост повторных покупок: клиент, которому легко вернуть товар, приходит снова.

Закажите настройку возвратов под ключ в вашем Битриксе. Свяжитесь с нами — получите бесплатную оценку проекта и коммерческое предложение в течение дня.