При автоматизации розничной торговли на базе 1С:Управление торговлей 10.3 нередко возникает задача принимать безналичные платежи на разные расчетные счета двух юридических лиц или индивидуальных предпринимателей с одного рабочего места. Типовой функционал торгового оборудования в старых конфигурациях часто вызывает затруднения: в настройках обработки обслуживания эквайринговой системы Сбербанка доступно всего несколько полей, например, ширина слип-чека, а явных настроек выбора идентификатора терминала или клиента нет. Разберем детально, какими способами можно решить эту задачу, выясним технические ограничения платформы и пошагово реализуем интеграцию.
Для понимания сути проблемы проанализируем архитектуру работы с торговым оборудованием в обычных формах конфигурации «1С:Управление торговлей 10.3». В отличие от современной Библиотеки подключаемого оборудования (БПО), здесь применяется прямая работа через внешние компоненты:
sbrf.dll и sbrfcom.dll, регистрируемые в операционной системе через утилиту regsvr32. При создании экземпляра COM-объекта SBRFSRV.Server библиотека обращается к каталогу своей регистрации (по умолчанию это C:\sc552) и считывает параметры физического порта только из одного конфигурационного файла pinpad.ini. Попытка одновременно открыть два разных COM-порта из одного процесса Windows через стандартный COM-сервер приводит к конфликту.Исходя из этих ограничений, у нас есть два пути реализации: использование режима «мультимерчант» на одном физическом устройстве либо разделение двух независимых терминалов на уровне файловых каталогов и утилит.
Рассмотрим наиболее удобный с точки зрения рабочего места кассира вариант — использование одного физического пин-пада, в который банк прошивает два независимых идентификатора (TID). В терминологии эквайринга Сбербанка эти идентификаторы разносятся по отделам (Department).
Разберем процесс настройки по шагам:
sbrfcom.dll, поддерживающая работу с расширенным набором параметров (семипараметрический вызов).Department. Если передать значение 0 или 1, транзакция уйдет на соответствующую организацию без лишних вопросов. Если передать значение -1, терминал принудительно отобразит меню выбора организации на своем дисплее, где кассир сможет нажать кнопку вручную.Посмотрим на пример доработки функции инициализации оплаты в кодовой базе обработки обслуживания:
// Определяем номер отдела в зависимости от организации документа
НомерОтдела = 0;
Если ДокументОплаты.Организация = ВтораяОрганизация Тогда
НомерОтдела = 1;
КонецЕсли;
// Вызов метода терминала с передачей номера отдела
Результат = ОбъектДрайвера.ОплатитьПлатежнойКартой(Сумма, НомерКарты, НомерОтдела);
Обратим отдельное внимание на операцию закрытия смены (сверку итогов). При работе в режиме мультимерчанта сверку необходимо выполнять дважды — отдельно для каждого отдела, передавая сначала номер 0, а затем номер 1. В противном случае банковский отчет закроется только по одной организации.
Если специфика бизнеса требует наличия двух отдельных физических устройств (например, они привязаны к разным банкам или разным договорам эквайринга), подключить их через стандартный единый COM-объект невозможно. Разберем, как обойти это системное ограничение.
C:\sc552_1 и C:\sc552_2. В каждой папке настраиваем свой конфигурационный файл pinpad.ini, прописав в параметре ComPort соответствующий виртуальный номер порта первого и второго пин-пада.sb_pilot.exe из пакета UPOS. Мы можем вызывать утилиту напрямую из нужной папки, передавая аргументы операции через платформу 1С.Посмотрим на пример вызова утилиты через команду ЗапуститьПриложение():
// Формируем путь к рабочей папке требуемого терминала
Если ДокументОплаты.Организация = ПерваяОрганизация Тогда
КаталогТерминала = "C:\sc552_1\";
Иначе
КаталогТерминала = "C:\sc552_2\";
КонецЕсли;
// Параметры: 1 - код операции оплаты, далее сумма в копейках
КоманднаяСтрока = КаталогТерминала + "sb_pilot.exe 1 " + Формат(Сумма * 100, "ЧГ=0");
// Запуск процесса в синхронном режиме с ожиданием завершения
ЗапуститьПриложение(КоманднаяСтрока, КаталогТерминала, Истина);
// Анализ результата из выходных файлов p (текст чека) и e (код ошибки)
ФайлОшибки = КаталогТерминала + "e";
ФайлЧека = КаталогТерминала + "p";
Такой подход полностью изолирует потоки работы с портами, исключает блокировку библиотек и позволяет гибко маршрутизировать запросы на любое количество физических устройств.
Проанализируем технические моменты, с которыми можно столкнуться при развертывании схемы:
sbrfcom.dll и sbrf.dll являются 32-разрядными. Если конфигурация запускается под 64-битным клиентом «1С:Предприятие», попытка выполнить конструкцию Новый COMОбъект("SBRFSRV.Server") вызовет системную ошибку. В случае 64-битного клиента вызов консольной утилиты sb_pilot.exe является безальтернативным и самым надежным решением.Таким образом, для большинства задач оптимальным решением является включение мультимерчанта с передачей параметра Department. Если же физически требуется два устройства — переводите логику работы эквайринга на раздельные каталоги с утилитой sb_pilot.exe.