Как настроить возврат товара по эквайрингу в 1С:Управление торговлей 10.3?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

В розничной торговле при оформлении возврата товара от покупателя день в день кассиры часто сталкиваются с ситуацией, когда фискальный регистратор печатает чек возврата, но подключенный банковский пинпад не реагирует и не инициирует транзакцию возврата денежных средств на карту покупателя. Разберем архитектурные причины такого поведения конфигурации 1С:Управление торговлей 10.3, разницу между банковскими операциями отмены и возврата, а также рассмотрим программные и штатные способы решения этой задачи.

Причины поведения типовой конфигурации

Проанализируем, почему типовая 1С:Управление торговлей 10.3 не отправляет команду на терминал в интерфейсе РМК:

  1. Типовая архитектура документа: Документ ЧекККМ с видом операции Чек на возврат изначально проектировался разработчиками «1С» исключительно для возврата наличных денежных средств непосредственно из операционной кассы в течение текущей смены.
  2. Отсутствие вызова процедур ТО: В типовом коде формы и модуля документа ЧекККМ в ветке проверки вида операции на возврат отсутствуют обращения к эквайринговой подсистеме торгового оборудования.
  3. Штатная логика безналичных возвратов: Методика разработчиков конфигурации предполагала, что возврат безналичных средств оформляется менеджером через документ Возврат товаров от покупателя с последующим созданием документа Оплата от покупателя платежной картой (вид операции Возврат денежных средств покупателю) либо кассир выполняет операцию вручную через меню управления эквайрингом.

Разница между отменой операции и возвратом средств

Перед реализацией программного вызова важно понимать различие двух банковских процедур:

  1. Отмена операции (Void): Выполняется в течение открытой банковской смены (до выполнения сверки итогов / Z-отчета). При отмене средства разблокируются на счете клиента моментально, а комиссия за эквайринг с торговой точки не удерживается. Для проведения операции терминал обычно требует передать номер ссылки RRN, номер чека или код авторизации. В ряде настроек банковского ПО отмена возможна без физического считывания карты.
  2. Возврат покупки (Refund): Проводится после закрытия банковской смены (после сверки итогов). В этом случае средства списываются с расчетного счета организации и возвращаются на банковский счет покупателя в срок от 1 до 30 дней. При возврате требуется обязательное физическое считывание банковской карты покупателя на пинпаде.
  3. Ограничение частичной отмены: Если в исходном чеке продажи было несколько позиций, а клиент возвращает только одну, банковский протокол при отмене (Void) не позволяет уменьшить сумму транзакции. В таких случаях кассиру необходимо либо делать полную отмену всей операции по карте с повторной продажей оставшихся товаров, либо проводить транзакцию как полноценный «Возврат» (Refund), если это разрешено конфигурацией терминала до сверки итогов.

Программная доработка документа ЧекККМ

Рассмотрим, как модифицировать код формы документа ЧекККМ, чтобы при закрытии чека на возврат автоматически вызывалась функция работы с эквайринговым терминалом.

Откроем форму документа ЧекККМ и найдем процедуру ЗакрытьЧек. Добавим проверку типа операции и вызов процедуры оплаты картой перед фискализацией чека:


Процедура ЗакрытьЧек(Печать = Ложь)
    Перем Ответ;
    Перем Паника;
    
    Если ТолькоПросмотр Тогда
        Закрыть();
    Иначе
        Если ВидОперации = Перечисления.ВидыОперацийЧекККМ.Продажа Тогда
            Если Не ЧекПробитНаККМ И Товары.Итог("Сумма") > 0 Тогда
                ФормаОплат = ПолучитьФорму("ФормаОплатЧека", ЭтаФорма);
                Результат = ФормаОплат.ОткрытьМодально();
            КонецЕсли;
        Иначе
            Результат = "Закрыть чек";
        КонецЕсли;

        Если Результат <> "Закрыть чек" Тогда
            Возврат;
        Иначе
            РучнойРежимПечати = Ложь;
            
            Если УстановленЕНВДОрганизации И КассаККМ.ФормироватьНефискальныеЧеки Тогда
                Если КассаККМ.РучнойРежимФормирования Тогда
                    Если (мФР = Неопределено И Не Печать) Или (мФР <> Неопределено) Тогда
                        Ответ = Вопрос("Напечатать чек на " + ?(мФР = Неопределено, "принтере", "принтере документов для ЕНВД") + "?", РежимДиалогаВопрос.ДаНетОтмена, , КодВозвратаДиалога.Нет);
                        Если Ответ = КодВозвратаДиалога.Отмена Тогда
                            Возврат;
                        Иначе
                            Если мФР = Неопределено Тогда
                                Печать = (Ответ = КодВозвратаДиалога.Да);
                            Иначе
                                РучнойРежимПечати = (Ответ = КодВозвратаДиалога.Да);
                            КонецЕсли;
                        КонецЕсли;
                    КонецЕсли;
                ИначеЕсли Не Печать Тогда
                    Печать = (мФР = Неопределено);
                КонецЕсли;
            КонецЕсли;

            // Обработка возврата денег по платежной карте
            Если ВидОперации <> Перечисления.ВидыОперацийЧекККМ.Продажа Тогда
                Если ЭтотОбъект.Оплата.Количество() > 0 И ЭтотОбъект.Оплата[0].ВидОплаты.Наименование <> "Наличные" Тогда
                    СуммаВозврата = Товары.Итог("Сумма");
                    ОплатитьКартой(СуммаВозврата);
                КонецЕсли;
            КонецЕсли;

            СоздатьНовыйЧек = Истина;
            Если Не ПровестиИРаспечататьЧек(Ответ, Паника, ЭтаФорма, РучнойРежимПечати) Тогда
                ОбщегоНазначения.СообщитьОбОшибке(Ответ);
                Если Паника Тогда
                    Предупреждение("Возможны расхождения ИБ и ленты ФР!", , "Внимание! Критическая ошибка!!!");
                    Возврат;
                КонецЕсли;
            КонецЕсли;

            Если ЧекПробитНаККМ Или (УстановленЕНВДОрганизации И КассаККМ.ФормироватьНефискальныеЧеки) Тогда
                Если Печать Тогда
                    Печать("Чек");
                КонецЕсли;
                ДокументОбъект = Документы.ЧекККМ.СоздатьДокумент();
                ДокументОбъект.Дата = РабочаяДата;
                ПриОткрытии();
                Обновить();
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Важные правила при доработке эквайринга

При реализации собственного алгоритма взаимодействия с банковскими терминалами обратим внимание на следующие технические правила:

  1. Последовательность операций: Вызов эквайринговой транзакции на терминале всегда должен выполняться строго до отправки команды фискализации в фискальный регистратор. Если сначала напечатать фискальный чек, а терминал вернет ошибку (недостаточно средств, сбой связи с процессингом банка, отказ клиента), в кассе возникнет расхождение между фискальными данными и банковским отчетом.
  2. Обработка статуса возврата: Необходимо проверять результат выполнения функции ОплатитьКартой(). Если транзакция не завершилась успехом, процедуру закрытия чека следует прерывать оператором Возврат.
  3. Хранение реквизитов платежа: Для корректной отмены операций рекомендуется сохранять данные исходного слип-чека продажи (номер ссылки RRN, код авторизации) в реквизитах документа или специализированном регистре сведений, чтобы передавать их в драйвер терминала при отмене.

Альтернативные способы решения проблемы

Если внесение изменений в конфигурацию нежелательно, рассмотрим альтернативные варианты:

  1. Автономный режим терминала: Отключение физической интеграции терминала с программой (перевод в автономный режим). В этом случае кассир вручную выбирает на терминале пункт «Отмена» или «Возврат», вводит сумму чека, а в программе закрывает документ ЧекККМ с безналичным типом оплаты без прямого обращения к оборудованию.
  2. Штатное окно управления эквайрингом: Использование встроенной обработки через пункт меню Сервис -> Торговое оборудование -> Управление эквайринговой системой, где кассир может инициировать отмену по номеру чека перед пробитием документа в РМК.
← На главную