Приветствуем вас! В практической работе автоматизаторов и администраторов 1С часто возникает классическая, но от этого не менее сложная задача: подключение двух физических эквайринговых терминалов Сбербанка к одному рабочему месту (компьютеру). Такая необходимость обычно продиктована бизнес-требованиями, когда на одной кассе одновременно ведутся продажи от двух юридических лиц (например, ООО и ИП), для каждого из которых открыто свое рабочее место кассира (РМК) и установлена отдельная ККТ.
В этой статье мы подробно разберем, почему возникает конфликт оборудования, когда при попытке оплаты на разных РМК реагирует только один и тот же терминал, выясним первопричину этой проблемы и рассмотрим пять эффективных способов ее решения — от классических "костылей" с реестром Windows до современных и архитектурно правильных подходов.
Рассмотрим подробнее физику процесса взаимодействия 1С и Сбербанка. Традиционный (устаревший, но все еще крайне распространенный) драйвер Сбербанка использует COM-технологию, базирующуюся на библиотеке sbrfcom.dll. При регистрации этой библиотеки в операционной системе Windows создается глобальная запись в реестре. Эта запись указывает на конкретную рабочую папку (обычно это C:\sberbank), из которой библиотека считывает конфигурационный файл настроек pinpad.ini.
Даже если мы физически подключим два терминала (например, Pax SP30) к разным USB-портам (которые эмулируют виртуальные COM-порты, допустим, COM3 и COM4) и создадим две разные папки C:\sberbank1 и C:\sberbank2, операционная система при вызове COM-объекта из 1С все равно будет обращаться к единственному зарегистрированному пути в реестре. В результате драйвер всегда будет считывать один и тот же pinpad.ini и отправлять сигнал на один и тот же COM-порт. Именно поэтому при оплате из любого окна РМК реагирует только один терминал.
Выяснив причину, давайте последовательно разберем все способы решения этой проблемы.
Проанализируем первый способ решения, который часто применяется на практике в конфигурациях прошлых поколений, таких как 1С:Управление торговлей 11.1. Суть метода заключается в том, чтобы перед каждым обращением к эквайринговому терминалу из кода 1С принудительно перезаписывать в реестре Windows путь к рабочей директории Сбербанка.
Для реализации этого метода выполним следующие шаги по подготовке:
C:\sberbank1 (для первого терминала, настроенного на первый COM-порт) и C:\sberbank2 (для второго терминала на другом COM-порте)..reg.Файл sber1.reg будет содержать информацию для переключения драйвера на первую папку:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\CLSID\{SBERBANK-COM-CLASS-ID}\InprocServer32]
@="C:\\sberbank1\\sbrfcom.dll"
[HKEY_CURRENT_USER\Software\Sberbank]
"Path"="C:\\sberbank1"
Соответственно, файл sber2.reg будет указывать на вторую папку:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\CLSID\{SBERBANK-COM-CLASS-ID}\InprocServer32]
@="C:\\sberbank2\\sbrfcom.dll"
[HKEY_CURRENT_USER\Software\Sberbank]
"Path"="C:\\sberbank2"
В коде 1С перед выполнением транзакции оплаты мы можем программно запускать импорт нужного .reg-файла с помощью встроенной функции:
ПутьКФайлуРеестра = "C:\sberbank1\sber1.reg";
ЗапуститьПриложение("regedit /s """ + ПутьКФайлуРеестра + """", , Истина);
Важное примечание: данный метод требует предоставления пользователю операционной системы повышенных прав на редактирование соответствующих веток реестра. Кроме того, если кассиры работают одновременно и транзакции могут отправляться в одну и ту же секунду, возможна коллизия, когда один поток перезапишет реестр прямо во время работы другого. Поэтому рассмотрим более надежные варианты.
Если мы хотим избежать потенциально опасного и нестабильного редактирования реестра, мы можем использовать встроенную возможность самого драйвера Сбербанка. Мало кто знает, но библиотека sbrfcom.dll поддерживает динамическое переопределение пути к служебной библиотеке gate.dll.
Давайте разберем этот изящный алгоритм по шагам:
sbrfcom.dll в системе стандартным способом (например, через regsvr32) всего один раз из любой директории.C:\Sberbank_1 и C:\Sberbank_2. В каждой папке должны находиться индивидуальный файл pinpad.ini и копия файла gate.dll.gate.dll для конкретного терминала:
// Пример программного переопределения рабочей папки драйвера Сбербанка в 1С
ПутьКПапкеТерминала = "C:\Sberbank_1"; // или C:\Sberbank_2 в зависимости от кассы
Попытка
Драйвер.ЗадатьИмяБиблиотеки(ПутьКПапкеТерминала + "\gate.dll");
Исключение
ЗаписьЖурналаРегистрации("Эквайринг", УровеньЖурналаРегистрации.Ошибка, , , "Ошибка инициализации gate.dll: " + ОписаниеОшибки());
КонецПопытки;
При таком подходе компонента Сбербанка автоматически перенаправит все последующие вызовы функций к файлам конфигурации, расположенным в указанной папке. Этот метод полностью безопасен, корректно работает в многопоточном режиме и не требует никаких прав администратора на изменение системного реестра Windows.
Если ваша конфигурация 1С (например, обновленная УТ 11, Розница или ERP) поддерживает современный сертифицированный драйвер Сбербанка версии 2.х, мы настоятельно рекомендуем полностью отказаться от устаревшей технологии COM (ActiveX) и перейти на работу через консольную утилиту sb_pilot.exe.
Этот способ является наиболее правильным с точки зрения современных стандартов разработки 1С. Рассмотрим, как его настроить:
C:\Sberbank_CLI_1 и C:\Sberbank_CLI_2.sb_pilot.exe, pilot_nt.dll и сопутствующие библиотеки).pinpad.ini в каждой папке на соответствующие COM-порты подключенных устройств PAX SP30.C:\Sberbank_CLI_1, для второго — C:\Sberbank_CLI_2.При проведении оплаты 1С будет самостоятельно запускать исполняемый файл sb_pilot.exe непосредственно из указанной директории. Поскольку утилиты работают изолированно друг от друга, они гарантированно будут считывать правильные файлы настроек и адресовать команды на нужные физические устройства без каких-либо конфликтов.
Давайте проанализируем бизнес-требование с практической точки зрения. Часто кассирам крайне неудобно держать на рабочем столе два громоздких физических терминала, путаться в проводах и постоянно ошибаться, передавая покупателю не тот пин-пад.
Эту проблему можно решить элегантно, настроив работу одного физического терминала на две разные организации. Данная технология называется "Мультимерчант" (Multi-merchant) или разделение по логическим отделам:
1, а для терминала ИП — значение 2.Теперь при пробитии чека 1С автоматически передаст на единственный терминал команду оплаты с указанием целевого отдела. Терминал сам направит транзакцию на нужный расчетный счет, а кассир и клиент будут пользоваться одним удобным устройством.
Иногда корни проблем кроются в нестабильной работе эмуляции COM-портов через USB-кабель. Из-за скачков напряжения, перезапуска операционной системы или смены USB-разъема виртуальные порты в диспетчере устройств Windows могут "слетать", меняться местами или зависать.
Чтобы раз и навсегда решить аппаратные проблемы связи, мы рекомендуем подключить терминалы по локальной сети:
192.168.1.150 для первого и 192.168.1.151 для второго). Это можно сделать через сервисное меню терминала или обратившись к технической поддержке банка.pinpad.ini отключите использование COM-порта и пропишите параметры сетевого подключения:
; Пример настройки pinpad.ini для сетевого подключения
; Параметр ComPort должен быть закомментирован или удален
PinpadIPAddr=192.168.1.150
PinpadIPPort=8888
Сетевой протокол TCP/IP работает несравнимо стабильнее, не зависит от драйверов виртуального COM-порта в Windows и позволяет легко разносить оборудование на любые расстояния. Это идеальное решение при работе в терминальных сессиях RDP (удаленный рабочий стол).
Мы подробно рассмотрели все возможные варианты настройки двух эквайринговых терминалов на одном компьютере. Если вы работаете на старой конфигурации без возможности обновления платформы и БСП, лучшим техническим выбором станет использование метода ЗадатьИмяБиблиотеки (Решение 2). Если же конфигурация современная — смело переходите на драйвер версии 2.х (Решение 3) или рассмотрите переход на удобную схему мультимерчанта (Решение 4), которая сэкономит место на рабочем столе и упростит жизнь вашим кассирам.