Платежный возврат и чек возврата — связанные, но отдельные операции. Успешный возврат денег не гарантирует, что касса получила корректное задание.

Ниже — практический порядок проверки. Он помогает сначала локализовать источник сбоя, затем внести минимальное изменение и проверить результат на реальном сценарии.

Как проявляется проблема

Деньги возвращены клиенту, однако чек не появляется у оператора фискальных данных и не отправляется покупателю.

Что проверить в первую очередь

  • Зафиксируйте точное время ошибки, пользователя, объект или операцию, на которой она появилась.
  • Сравните успешный и проблемный сценарии: входные данные, права, окружение, версию приложения и последовательность действий.
  • Проверьте последние изменения в коде, настройках, интеграциях, инфраструктуре и фоновых заданиях.
  • Сохраните связанные логи и идентификаторы запроса до повторного запуска или очистки кеша.

Основные причины

Один и тот же внешний симптом может возникать на разных уровнях. Поэтому полезно проверять не только интерфейс, но и данные, права доступа, очередь событий и состояние внешнего сервиса.

  • Событие успешного возврата не запускает фискальное задание.
  • В позиции отсутствуют ставка НДС, способ или предмет расчета.
  • Очередь кассы зависла либо исчерпаны повторные попытки.
  • Частичный возврат передает исходные количества и полную сумму.

Пошаговая диагностика

  • Сопоставьте payment refund id, локальный refund id и fiscal job id.
  • Проверьте тело запроса к кассе без персональных данных.
  • Посмотрите ответ API кассы, очередь и dead-letter сообщения.
  • Сверьте сумму позиций, скидки, НДС и итог возврата.

Как исправить

Исправление лучше делать небольшими проверяемыми шагами. Перед изменением рабочих данных сделайте резервную копию или подготовьте обратную миграцию.

  • Создавайте фискальное задание только после подтвержденного возврата.
  • Формируйте позиции из фактически возвращаемых товаров.
  • Добавьте контролируемые retries и ручной безопасный перезапуск.
  • Храните статус чека отдельно от статуса денег и показывайте оператору расхождения.

Как проверить результат

  • Чек имеет корректный признак возврата и точную сумму.
  • Повторная доставка события не создает второй чек.
  • Повторите исходный проблемный сценарий и минимум один пограничный случай.
  • Проверьте логи после исправления: отсутствие ошибки в интерфейсе еще не гарантирует корректную обработку.
  • Убедитесь, что правка не нарушила соседние операции, права других ролей и повторную обработку события.

Чего не стоит делать

  • Не отключайте проверки безопасности и разграничение доступа только ради исчезновения ошибки.
  • Не меняйте массово рабочие данные без выборки, резервной копии и заранее подготовленного отката.
  • Не запускайте повторно платежи, рассылки, возвраты или фоновые задачи, пока не проверена идемпотентность.
  • Не оставляйте токены, пароли, персональные данные и полные тела запросов в открытых логах.

Как не допустить повторения

  • Настройте мониторинг платежей без фискального результата.
  • Тестируйте полный, частичный и смешанный возврат.

Что подготовить для разбора

  • Ссылку на проблемную страницу, метод API, задание, отчет или интеграцию.
  • Точное описание ожидаемого и фактического результата без секретных ключей и паролей.
  • Фрагмент лога за нужный период, идентификатор операции и пример входных данных.
  • Список последних изменений и информацию о рабочем окружении.

Частые вопросы

Можно ли исправить проблему без полной переделки?

Чаще всего да. Если сначала найти точку расхождения, достаточно локальной правки в проверке, транзакции, обработчике события, настройке или запросе к данным.

Почему ошибка появляется не у всех?

Обычно различаются роль, состояние данных, устройство, регион, способ входа, версия клиента или порядок событий. Поэтому важно получить конкретный воспроизводимый пример.

Итог

Автоматический чек возврата требует надежной связи платежной операции, состава заказа и очереди фискализации.

Если самостоятельно локализовать причину не получилось, я могу разобрать логи и код, воспроизвести ошибку, предложить безопасную правку и проверить ее на рабочем сценарии.