При автоматизации кассового узла в конфигурации 1С:Торговля и Склад 7.7 часто возникает необходимость прямой интеграции с банковскими терминалами эквайринга (например, VeriFone vx820). Сбербанк предоставляет собственную внешнюю компоненту SBRFCOM.DLL, которая позволяет инициировать оплату картой и получать слип-чек непосредственно из кода 1С. Разберем по шагам, как правильно настроить компоненту, передать параметры в методы оплаты и обработать результат транзакции.
Платформа 1С 7.7 является строго 32-битным приложением, поэтому при настройке рабочего места на современных версиях Windows необходимо учитывать особенности разрядности:
C:\sc552\ или C:\pilot_nt\). В каталоге обязательно должны находиться базовые библиотеки драйвера: sbrf.dll, sb_kernel.dll, gate.dll (или pilot_nt.dll) и сама компонента SBRFCOM.DLL.regsvr32. Запустим командную строку от имени администратора и выполним команду: C:\Windows\SysWOW64\regsvr32.exe C:\sc552\SBRFCOM.DLL.Проанализируем частую проблему разработчиков: какие параметры передаются на терминал, а какие возвращаются обратно. В методе ОплатитьПлатежнойКартой входным параметром является только сумма операции (в копейках). Все остальные аргументы являются выходными: они передаются по ссылке и заполняются компонентой после проведения транзакции.
Существуют две версии библиотеки SBRFCOM.DLL:
ОплатитьПлатежнойКартой(Сумма, RRN, КодАвторизации).ОплатитьПлатежнойКартой(Сумма, RRN, КодАвторизации, Hash, IsOwn, CardName, CardNum).Перед вызовом метода переменные выходных параметров достаточно инициализировать пустыми значениями. Терминал самостоятельно считает номер карты, свяжется с процессингом и вернет в эти переменные сформированный код RRN, код авторизации и маскированный номер карты.
Рассмотрим типовой пример загрузки компоненты, выполнения оплаты и разбора сформированного слип-чека для вывода на фискальный регистратор или экран:
Процедура ПриОткрытии()
ПутьДоКомпоненты = "C:\sc552\SBRFCOM.DLL";
Если ЗагрузитьВнешнююКомпоненту(ПутьДоКомпоненты) = 1 Тогда
// Компонента успешно загружена
Иначе
Предупреждение("Внешняя компонента SBRFCOM.DLL не найдена или не зарегистрирована!");
КонецЕсли;
КонецПроцедуры
Процедура ВыполнитьОплатуКартой(СуммаРублей)
Перем Терм, рез, ОписКО, Слип, буф, НомерСтр;
Перем RRN, AuthCode, Hash, IsOwn, CardName, CardNum;
// Сумма передается целым числом в копейках (например, 150 руб. 50 коп. = 15050)
Amount = СуммаРублей * 100;
// Инициализируем выходные переменные
RRN = "";
AuthCode = "";
Hash = "";
IsOwn = 0;
CardName = "";
CardNum = "";
ОписКО = "";
Терм = СоздатьОбъект("AddIn.SBRFCOMExtension");
// Вызов метода оплаты
рез = Терм.ОплатитьПлатежнойКартой(Amount, RRN, AuthCode, Hash, IsOwn, CardName, CardNum);
Если рез = 1 Тогда
Слип = "";
буф = "";
// Получаем строки банковского слип-чека
Для НомерСтр = 1 По Терм.КоличествоСтрокСлипЧека Цикл
Терм.ПолучитьСтрокуСлипЧека(НомерСтр, буф);
Слип = Слип + буф + РазделительСтрок;
КонецЦикла;
Сообщить("Оплата успешно проведена. Код авторизации: " + AuthCode + ", RRN: " + RRN);
Сообщить("Слип-чек:");
Сообщить(Слип);
// Здесь можно передать текст слип-чека на фискальный регистратор
Иначе
Терм.ПолучитьОшибку(ОписКО);
Предупреждение("Ошибка при выполнении оплаты: " + ОписКО);
КонецЕсли;
Терм = 0;
КонецПроцедуры
Если в процессе работы через COM-объект возникают конфликты или сбои при работе в терминальных сессиях (RDP), рассмотрим альтернативный и крайне надежный способ — взаимодействие через консольную утилиту sb_pilot.exe (или pilot_nt.exe).
Разберем команды запуска утилиты:
sb_pilot.exe 1 [СуммаВКопейках]sb_pilot.exe 2 [СуммаВКопейках] [RRN]sb_pilot.exe 3 [СуммаВКопейках] [RRN]sb_pilot.exe 7Посмотрим на пример вызова утилиты из 1С 7.7 с получением слип-чека из результирующего текстового файла:
Процедура ОплатаЧерезКонсоль(СуммаРублей)
СуммаКопеек = СуммаРублей * 100;
КоманднаяСтрока = "C:\sc552\sb_pilot.exe 1 " + Строка(СуммаКопеек);
// Запуск утилиты с ожиданием завершения
WshShell = СоздатьОбъект("WScript.Shell");
КодВозврата = WshShell.Run(КоманднаяСтрока, 0, 1);
// Результат транзакции записывается в файл "e", а текст слипа — в файл "p"
ФайлОтвета = СоздатьОбъект("Текст");
ФайлОтвета.Открыть("C:\sc552\e");
Если ФайлОтвета.КоличествоСтрок() > 0 Тогда
КодОшибки = СокрЛП(ФайлОтвета.ПолучитьСтроку(1));
Если КодОшибки = "0" Тогда
ФайлСлипа = СоздатьОбъект("Текст");
ФайлСлипа.Открыть("C:\sc552\p");
Сообщить("Оплата выполнена успешно!");
Сообщить(ФайлСлипа.ПолучитьТекст());
Иначе
Предупреждение("Ошибка проведения оплаты. Код: " + КодОшибки);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
При работе пользователей в терминальном сервере важно учитывать нюансы подключения оборудования:
pinpad.ini.pinpad.ini установим параметр ShowScreens=0, чтобы избежать зависания окон драйвера внутри терминальной сессии.