При разработке функционала для работы с банковскими терминалами (эквайрингом) программисты 1С неизбежно сталкиваются с вопросом: какую операцию инициировать на терминале при оформлении возврата товара — отмену (Void) или возврат (Refund)? От правильного выбора зависит не только скорость поступления денег клиенту, но и сумма банковской комиссии, которую заплатит торговая точка. Рассмотрим подробно, как реализовать этот механизм, разберем технические нюансы и требования законодательства.
Для начала проанализируем ситуацию с точки зрения банковских процессов. Существует два принципиально разных типа операций, которые в пользовательском интерфейсе 1С часто объединяются под общим словом «Возврат»:
Разберем, как реализовать логику выбора в программе. Оставлять этот выбор на откуп кассиру — не самое удачное решение, так как это ведет к человеческим ошибкам и лишним затратам на комиссии. Проанализируем наиболее эффективную стратегию автоматизации:
Шаг 1: Проверка текущей смены. Программа должна проверить, был ли пробит чек продажи в текущей кассовой смене. Если смена еще не закрыта, приоритетной операцией должна быть «Отмена».
Шаг 2: Попытка выполнения отмены. Мы отправляем на терминал команду отмены. Важно помнить, что для этого терминалу почти всегда требуется уникальный идентификатор транзакции — RRN (Retrieval Reference Number) или номер чека из самого терминала. Эти данные должны быть сохранены в базе 1С в момент совершения продажи.
Шаг 3: Обработка отказа и переход к возврату. Если терминал возвращает ошибку (например, «Транзакция не найдена», что часто бывает, если сверка итогов уже прошла), программа должна автоматически или через подтверждение кассира переключиться в режим «Возврат».
Пример логической структуры кода для взаимодействия с терминалом (условно):
// Псевдокод логики возврата
Если ЭтоВозвратДеньВДень(ДокументПродажи) Тогда
Результат = Терминал.ВыполнитьОтмену(НомерЧекаТерминала, RRN);
Если Результат.Успех Тогда
СообщитьПользователю("Операция отмены успешно выполнена");
Иначе
// Если отмена не прошла, пробуем полноценный возврат
Результат = Терминал.ВыполнитьВозврат(Сумма, НомерКарты);
КонецЕсли;
Иначе
Результат = Терминал.ВыполнитьВозврат(Сумма, НомерКарты);
КонецЕсли;
Рассмотрим специфику самого популярного решения — библиотеку Pilot.exe от Сбербанка. В интегрированных решениях кассир не может вручную нажать кнопку на терминале, все команды идут из 1С. Для выполнения отмены вам обязательно потребуется передать правильные параметры в метод 1С-обработки, которая взаимодействует с драйвером. Если вы не сохранили RRN при продаже, сделать «Отмену» программно будет крайне сложно.
Также важно учитывать настройки самого терминала. Как отмечают специалисты на форумах, инженеры банка могут настроить терминал таким образом, что любая операция возврата в течение дня автоматически будет трансформироваться в отмену на стороне банковского сервера. Рекомендуем просить техподдержку банка включить именно такой режим — это упрощает разработку в 1С и снижает расходы бизнеса на комиссиях.
Выясним причину, по которой нельзя путать банковскую операцию и кассовый чек. С точки зрения налоговой и 54-ФЗ, как бы ни прошла операция по терминалу (как VOID или как REFUND), по кассовому аппарату (ККТ) всегда должен пройти документ с признаком расчета «Возврат прихода».
Ни в коем случае нельзя пытаться делать «аннулирование» чека или просто удалять его из базы. Фискальный накопитель должен зафиксировать обратный поток денежных средств. При этом способ оплаты в чеке возврата должен соответствовать способу оплаты в чеке продажи — «Безналичными».
Проанализируем ситуацию, упомянутую в обсуждении: покупатель платит телефоном, а при возврате прикладывает физическую карту. В современных реалиях (использование токенов) номер карты в телефоне не совпадает с номером на пластике. Если вы инициируете Отмену, терминал может выдать ошибку «Оригинальная операция не найдена», так как он ищет транзакцию по конкретному номеру (токену).
В таких случаях рекомендуется:
Посмотрим на ситуацию со стороны надежности системы. Самая опасная ошибка программиста — когда терминал успешно вернул деньги клиенту, а 1С «упала» или потеряла связь, не пробив фискальный чек. В итоге: у клиента деньги, у магазина — недостача по Z-отчету и нарушение кассовой дисциплины.
Правильная последовательность действий в коде должна быть следующей:
Использование штатных механизмов БПО (Библиотеки подключаемого оборудования) от 1С значительно упрощает эту задачу, так как там основные сценарии обработки ошибок уже предусмотрены. Однако при написании собственных обработок обслуживания всегда закладывайте логирование каждого шага взаимодействия с эквайринговым терминалом.