В практике автоматизации розничной торговли мы часто сталкиваемся с задачей возврата денежных средств покупателю. Стандартный сценарий кажется простым: покупатель оплатил картой, значит, и вернуть деньги мы должны на ту же карту. Это логично с точки зрения борьбы с незаконным обналичиванием (cashed-out) кредитных средств и соответствует требованиям многих банков.
Однако на практике, работая с торговым оборудованием и конфигурациями 1С, мы обнаруживаем интересную особенность: при инициировании возврата терминал часто принимает любую карту, которую приложит клиент, даже если она отличается от исходной. В этой статье мы подробно разберем, почему так происходит, как это работает на уровне протоколов взаимодействия с банком, и какие шаги необходимо предпринять, чтобы реализовать строгий контроль возврата на карту плательщика.
Рассмотрим ситуацию, описанную специалистами. В магазине совершена покупка, оплата прошла через банковский пин-пад. Спустя время клиент приходит делать возврат. Кассир запускает операцию возврата в 1С, терминал просит приложить карту. Если клиент прикладывает совершенно другую карту (например, дебетовую вместо кредитной, с которой была оплата), терминал успешно проводит операцию.
Это создает риски для бизнеса:
Чтобы понять, как решить задачу, давайте разделим понятия, которые часто путают пользователи и даже начинающие программисты 1С.
1. Отмена операции (Reversal / Void)
Эта операция выполняется, как правило, до закрытия банковской смены (сверки итогов) на терминале. Технически деньги еще не ушли из банка-эквайера в банк-эмитента, они просто "захолдированы" (заблокированы) на счете клиента.
Для отмены физическое присутствие карты часто вовсе не требуется. Достаточно передать в терминал номер ссылки (RRN) или номер чека терминала. Операция просто аннулируется. В 1С это часто реализуется кнопкой "Аннулировать чек" при открытой смене.
2. Возврат (Refund)
Это полноценная финансовая транзакция, которая может происходить через несколько дней после покупки. Для банковской системы это, по сути, "покупка со знаком минус". Именно здесь возникает возможность подставить другую карту, так как терминал инициирует новую цепочку обмена данными.
Разберем, как оборудование понимает, к какой продаже относится возврат. Ключевым элементом здесь является RRN (Retrieval Reference Number) — уникальный ссылочный номер транзакции. Также могут использоваться AuthCode (код авторизации) или внутренний номер чека терминала.
При оплате через онлайн-магазины (интернет-эквайринг) возврат всегда идет на ту же карту, потому что API банка требует указать TransactionID исходной покупки, и банк сам знает, к какой карте привязан этот ID. Физически карту прикладывать не нужно.
В оффлайн-рознице (Retail) все сложнее. Стандартные драйверы оборудования 1С и прошивки пин-падов часто настроены на "упрощенный" режим. При команде "Вернуть 1000 рублей" терминал просто ждет карту, чтобы отправить деньги на её реквизиты. Он не сверяет их с историей, если мы его об этом не попросим.
Если перед нами стоит задача жестко запретить возврат на другую карту, необходимо выполнить комплексную доработку на двух сторонах: в учетной системе 1С и на стороне банка-эквайера.
В момент пробития чека и успешной оплаты картой, драйвер оборудования возвращает в 1С структуру данных. Нам необходимо убедиться, что мы сохраняем следующие параметры в регистры сведений или реквизиты документа "Чек ККМ" (или "Эквайринговая операция"):
Рассмотрим пример того, как могут выглядеть данные, получаемые от драйвера:
// Пример получения данных от драйвера после успешной оплаты
ПараметрыОперации = Новый Структура;
ПараметрыОперации.Вставить("Amount", СуммаОплаты);
ПараметрыОперации.Вставить("RRN", ОтветТерминала.RRN); // Ссылочный номер
ПараметрыОперации.Вставить("AuthCode", ОтветТерминала.AuthCode);
ПараметрыОперации.Вставить("CardNumber", ОтветТерминала.CardNumber); // Обычно вида ************1234
Если ваша конфигурация типовая (например, 1С:Розница или 1С:УТ), эти данные, скорее всего, уже сохраняются в соответствующих регистрах сведений по эквайринговым операциям. Проверьте это.
При оформлении возврата мы должны найти исходную транзакцию и передать её идентификаторы в драйвер эквайрингового терминала. Многие современные драйверы (по стандарту 1С-Совместимо) имеют соответствующие входные параметры для метода ВернутьОплату.
Важный нюанс: даже если мы передадим RRN в терминал, это не гарантирует запрет на смену карты. Терминал может принять RRN для отчетности, но все равно позволить приложить другой пластик. Это зависит от настроек прошивки самого терминала ("конфигурации" на сленге банковских инженеров).
Это самый важный шаг, без которого доработки в 1С могут быть бесполезны. Нам необходимо связаться с технической поддержкой банка-эквайера и поставить задачу следующим образом:
"Просим настроить на наших терминалах запрет возврата на карту, отличную от карты покупки. Мы готовы передавать RRN исходной транзакции из кассового ПО."
Возможные варианты ответа банка:
Давайте проанализируем современную проблему. Если покупатель платил телефоном (NFC), то терминал видит не реальный номер карты, а виртуальный токен. При возврате, если клиент снова прикладывает телефон, генерируется тот же токен (или связанный с ним), и проверка проходит.
Однако, если клиент платил телефоном, а возврат хочет сделать, приложив физическую карту (того же счета), номера (PAN) будут отличаться. Жесткая проверка "номер в номер" здесь может дать сбой и запретить легитимную операцию. Именно поэтому банки часто оставляют настройку "разрешить любую карту" включенной по умолчанию.
Если вы используете оплату через QR-коды (СБП), ситуация упрощается. Архитектура СБП построена таким образом, что возврат технически возможен только на тот же счет, с которого пришли деньги. Здесь подмена невозможна на уровне банковского протокола. 1С отправляет команду "Вернуть по ID операции", и деньги уходят обратно отправителю без участия покупателя (ему не нужно ничего сканировать или прикладывать).
Часто возникает вопрос: а законно ли вообще требовать ту же карту? Ведь старая карта могла быть утеряна, заблокирована или у неё истек срок действия.
Разберем актуальные требования (с учетом отмены старого указания ЦБ № 3073-У и ввода нового № 5348-У):
Резюме по юридической части: Техническая блокировка "только на ту же карту" полезна для защиты от мошенничества, но у кассира должна быть возможность (через права доступа или администратора) обойти её, если карта клиента действительно утеряна.
Подведем итог в виде пошагового алгоритма реализации:
RRN (Reference Number) каждой оплаты картой.ПодключаемоеОборудование или модули РМК).RefundTransaction) получает параметр RRN из найденной исходной операции.
// Примерный псевдокод заполнения параметров для драйвера
ВходныеПараметры = Новый Массив;
ВходныеПараметры.Добавить(СуммаВозврата);
ВходныеПараметры.Добавить(ИсходныйRRN); // Важно передать это значение
ВходныеПараметры.Добавить(ИсходныйAuthCode);
// Вызов метода драйвера
Результат = ОбъектДрайвера.ВыполнитьКоманду("Refund", ВходныеПараметры, ...);
Внедрение такого контроля позволит существенно снизить риски ошибок персонала и потенциального мошенничества с бонусными программами банков.