При автоматизации розничной торговли часто возникает ситуация, когда на одной кассовой точке (одном ПК) работают две организации. Для экономии места и средств устанавливается один эквайринговый терминал Сбербанка, который программно разделен на два отдела (две секции), привязанных к разным юридическим лицам. Однако пользователи часто сталкиваются с критической ошибкой: если оплата по обеим организациям проходит корректно, то возврат денежных средств всегда списывается со счета первой организации, независимо от того, по какой компании был пробит чек.
В этой статье мы подробно проанализируем причины такого поведения системы и рассмотрим несколько способов решения проблемы, начиная от настройки конфигурационных файлов драйвера Сбербанка и заканчивая техническими манипуляциями с оборудованием в 1С.
Разберем ситуацию с технической стороны. Взаимодействие 1С с терминалом Сбербанка происходит через библиотеку SBRF.dll или современные компоненты sb_pilot. Когда кассир проводит оплату, 1С передает драйверу параметр Department (номер отдела), который соответствует конкретной организации. Терминал получает этот номер и направляет транзакцию на нужный Merchant ID.
Однако при выполнении операции «Возврат» (Refund) или «Отмена» (Void) в типовых конфигурациях 1С (особенно в старых релизах вроде УТ 11.4.3) или в устаревших версиях драйверов этот параметр может игнорироваться или вовсе не передаваться. В результате терминал «не понимает», по какой организации нужно сделать возврат, и по умолчанию использует настройки первого отдела (основной организации). Это приводит к тому, что деньги уходят со счета не того юрлица, а в учете 1С и банка возникает перекос.
Рассмотрим самый надежный способ, который позволяет обмануть систему и заставить 1С видеть один терминал как два абсолютно независимых устройства. Сотрудники банка часто говорят, что это невозможно, но на практике это реализуется следующим образом:
C: две разные папки для драйверов, например: C:\sber_org1 и C:\sber_org2.sc552).pinpad.ini.pinpad.ini укажем параметры первого отдела. Во второй папке — параметры второго отдела. Ключевым моментом здесь является то, что для каждой папки будет свой MerchantID и TerminalID.SBRF.dll или sb_pilot.dll).Таким образом, когда 1С будет инициировать возврат для Организации №2, она обратится ко второму экземпляру оборудования, который «жестко» настроен на работу со своим отделом через собственный pinpad.ini. Это исключит вероятность путаницы отделов на программном уровне драйвера.
Проанализируем содержимое файла pinpad.ini, который находится в папке с драйвером терминала. Иногда для корректной работы возвратов по отделам требуются специфические флаги, которые заставляют терминал запрашивать отдел при любой операции. Проверьте наличие или добавьте следующие строки в секцию [Common] или аналогичную:
ShowDepartments=1
CheckDepartment=1
Эти параметры активируют режим, при котором терминал будет более строго относится к передаваемым номерам отделов. Если инженер банка при установке ПО «Пилот» не настроил таблицу отделов должным образом, возврат может «сваливаться» на первый индекс. В этом случае необходимо вызвать сотрудника банка и попросить его проверить настройки в административном меню самого терминала, чтобы функция возврата была доступна для всех созданных отделов.
Если вы используете сильно кастомизированную конфигурацию или очень старый релиз 1С, выясним причину в коде. Проблема часто кроется в функции, отвечающей за вызов эквайринговой операции. Рассмотрим пример кода, который может использоваться в обработке обслуживания терминала:
// Пример вызова операции оплаты
Результат = ОбъектДрайвера.ОплатитьПлатежнойКартой(Сумма, НомерОтдела, ...);
// Пример некорректного вызова возврата (где забыли передать отдел)
Результат = ОбъектДрайвера.ВозвратОплатыПлатежнойКартой(Сумма, НомерЧека, ...);
В современных версиях Библиотеки Подключаемого Оборудования (БПО) для возврата используется структура ПараметрыОперации. Нам нужно убедиться, что поле НомерОтдела заполняется правильно. Если вы программист, проверьте модуль МенеджерОборудованияВызовСервера или соответствующие интеграционные компоненты. Нужно убедиться, что при вызове метода DoOperation драйвера Сбербанка в XML-пакет или в список параметров передается корректный индекс отдела.
Если метод «Двух папок» не срабатывает из-за особенностей регистрации DLL в реестре Windows, можно применить способ с подменой портов. Рассмотрим его подробнее:
pinpad.ini перед вызовом операции. Это требует написания небольшого скрипта или доработки в 1С в процедуре ПередПечатьюЧека, которая будет копировать нужный конфиг в рабочую директорию драйвера в зависимости от организации.Важно понимать разницу между операциями «Отмена» (Void) и «Возврат» (Refund). Отмена возможна только до закрытия смены (сверки итогов) на терминале. Она обычно требует ввода RRN или номера чека. Возврат делается после закрытия смены. 1С:УТ 11 может по-разному обрабатывать эти команды. Посмотрите, в какой момент вы пытаетесь сделать возврат. Если это происходит в рамках одной смены, 1С пытается сделать «Отмену». Убедитесь, что терминал позволяет делать отмену по второму отделу. Иногда ограничения стоят на стороне банковского ПО, и отмена разрешена только для «главного» Merchant ID.
Если проблему нужно решить «здесь и сейчас», а программиста или инженера банка нет рядом, используйте ручной режим управления терминалом:
Резюмируем: Основной способ исправления — это создание двух разных профилей оборудования в 1С с указанием разных путей к папкам драйвера, где файлы pinpad.ini настроены на разные отделы. Это гарантированно разделяет потоки данных и устраняет ошибку списания средств не с той организации.