Интеграция эквайрингового терминала с кассовым узлом — важнейший шаг для любого торгового предприятия. Автоматизация этого процесса позволяет исключить пресловутый «человеческий фактор», когда кассиры ошибочно вводят неверную сумму вручную на автономном терминале, что приводит к недостачам и пересортице в учете. В рамках этой статьи мы подробно разберем, как решить задачу подключения эквайринга, если ваш клиент работает на уникальной, самописной конфигурации 1С («нетленке»), где нет готовых интеграционных механизмов «из коробки».
Перед тем как приступить к написанию кода, проанализируем архитектуру нашей самописной конфигурации. У нас есть два принципиально разных пути решения задачи:
Рассмотрим по шагам классический способ подключения терминала Сбербанка к кассовому модулю самописной 1С. Для этого нам понадобятся файлы интеграции, которые обычно предоставляет банк при установке ПО терминала. Как правило, банковские специалисты загружают весь необходимый софт в каталог C:\SC552 на локальном компьютере кассира.
Для настройки взаимодействия нам понадобятся две основные библиотеки:
sbrf.dll — базовая библиотека Сбербанка для связи с хостом.sbrfcom.dll — COM-обертка, которая позволяет среде 1С обращаться к функциям эквайринга.Выполним предварительную регистрацию этих библиотек в операционной системе. Для этого откроем командную строку от имени администратора и выполним регистрацию через утилиту regsvr32:
Важный нюанс: обращайте внимание на разрядность вашей платформы 1С. Если вы используете 32-разрядный клиент 1С, регистрировать библиотеки нужно в 32-битной среде. Для 64-разрядного клиента потребуется соответствующая версия библиотеки от банка.
После успешной регистрации в системе появится COM-объект с программным идентификатором AddIn.SBRFCOMObject. Теперь мы можем написать код инициализации устройства в нашей 1С.
Разберем пример кода для подключения внешней компоненты и вызова процедуры оплаты:
// Функция выполняет попытку подключения к терминалу и проведение оплаты
Функция ПровестиОплатуПоКарте(СуммаПараметр, НомерЧека) Экспорт
// Сумма должна передаваться в копейках (целым числом) или в формате с копейками
// В зависимости от версии библиотеки Сбербанка формат суммы может отличаться.
// Чаще всего сумма передается как целое число копеек.
СуммаВКопейках = Цел(СуммаПараметр * 100);
Попытка
ПодключитьВнешнююКомпоненту("AddIn.SBRFCOMObject");
Эквайринг = Новый("AddIn.SBRFCOMObject");
Исключение
Предупреждение("Не удалось загрузить внешнюю компоненту AddIn.SBRFCOMObject! Проверьте регистрацию sbrfcom.dll.");
Возврат Ложь;
КонецПопытки;
// Инициализируем терминал. Параметры часто настраиваются через файл pinpad.ini в каталоге SC552
// Нам нужно передать параметры авторизации операции.
// Обратите внимание: у Сбербанка исторически существует две версии методов:
// старая (принимает 3 параметра) и новая (принимает 7 параметров).
// Попробуем выполнить оплату по новой схеме (7 параметров)
// Параметры: Направление (1 - оплата), Сумма, КодВалюты (643), НомерСсылки, НомерЧека, КодАвторизации, ДопДанные
КодВалюты = "643"; // Рубли РФ
НомерСсылки = "";
КодАвторизации = "";
ДопДанные = "";
РезультатСделки = "";
ЧекЭквайринга = "";
Попытка
// Метод Оплатить (или в оригинале sbrfcom: "Clear")
// В зависимости от обертки вызов метода может выглядеть как ВыполнитьОперацию() или sberbank_payment()
// Ниже приведен классический пример вызова метода sbrfcom
ОтветКод = Эквайринг.Nfun(1, СуммаВКопейках, КодВалюты, НомерСсылки, НомерЧека, КодАвторизации, ДопДанные);
Исключение
Предупреждение("Ошибка при обращении к методам терминала: " + ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
Если ОтветКод = 0 Тогда
// Операция успешна. Банк заблокировал средства.
// Мы можем прочитать сформированный чек из текстового файла, который Сбербанк сохраняет в своей папке
// Обычно это файл p (слип-чек для клиента) и e (слип-чек для кассира)
Возврат Истина;
Иначе
Предупреждение("Ошибка проведения оплаты. Код ошибки банка: " + Строка(ОтветКод));
Возврат Ложь;
КонецПопытки;
КонецФункции
Зачастую прямая работа с COM-объектами в 1С вызывает сложности, связанные с блокировками потоков, зависаниями интерфейса или несовместимостью разрядности ОС и платформы 1С. Особенно остро эта проблема встает, если ваши кассиры работают в терминальном режиме (RDP) на удаленном сервере, куда пробросить локальный COM-порт терминала бывает крайне затруднительно.
Для решения этой проблемы мы можем использовать альтернативный, невероятно надежный способ — взаимодействие через консольное приложение sb_pilot.exe, которое поставляется Сбербанком. Этот метод не требует регистрации COM-компонент в системе.
Алгоритм взаимодействия выглядит следующим образом:
sb_pilot.exe с нужными ключами через стандартный метод платформы.e и p в рабочем каталоге).Посмотрим на пример реализации запуска утилиты sb_pilot.exe из кода 1С:
// Запуск операции оплаты через консольную утилиту sb_pilot.exe
Процедура ОплатаЧерезКонсоль(СуммаОперации, НомерКассы)
ПутьКПрограмме = "C:\SC552\sb_pilot.exe";
// Формируем параметры командной строки.
// Первый параметр: 1 - Оплата, 2 - Возврат, 3 - Отмена, 4 - Сверка итогов
// Второй параметр: Сумма в копейках
СуммаКопейки = Формат(СуммаОперации * 100, "ЧГ=0");
ПараметрыЗапуска = "1 " + СуммаКопейки;
// Запускаем приложение в синхронном режиме (1С будет ждать завершения работы sb_pilot)
КодВозврата = Неопределено;
ЗапуститьПриложение(ПутьКПрограмме + " " + ПараметрыЗапуска, "C:\SC552\", Истина, КодВозврата);
// Проверяем результат выполнения внешней программы
Если КодВозврата = 0 Тогда
// Программа завершилась корректно. Читаем файлы результатов для подтверждения транзакции
ОбработатьРезультатПлатежа();
Иначе
Предупреждение("Операция отменена пользователем или произошел сбой связи с банком!");
КонецЕсли;
КонецПроцедуры
Если в вашей «нетленке» планируется использовать терминалы разных банков (например, у одного клиента Сбербанк, у другого — ВТБ или Райффайзенбанк), писать под каждый банк свой уникальный обработчик крайне невыгодно. В такой ситуации идеальным решением станет использование промежуточного универсального драйвера, например, программы KKMServer.
KKMServer берет на себя всю низкоуровневую работу с драйверами банковских терминалов и фискальных регистраторов. Он предоставляет простой и документированный API (обычно на базе HTTP-запросов JSON или веб-сокетов). Ваша 1С просто отправляет JSON-запрос на локальный веб-сервер, а KKMServer самостоятельно общается с терминалом и возвращает структурированный ответ. Этот подход полностью решает проблемы с разрядностью библиотек, совместимостью операционных систем и работой по RDP.
Один из самых частых вопросов разработчиков: «Как тестировать эквайринг? Можно ли забрать терминал клиента домой или в офис для написания кода?»
Забирать «боевой» терминал клиента крайне не рекомендуется. Во-первых, это материальная ответственность. Во-вторых, терминал жестко привязан к каналу связи и банковским ключам безопасности клиента, и любые тестовые транзакции на нем будут списывать реальные деньги с ваших карт. Для безопасной разработки используйте следующие подходы:
Разберем три важнейших бизнес-процесса, о которых часто забывают начинающие разработчики при внедрении эквайринга в самописные конфигурации:
Резюмируя все вышесказанное: подключить терминал к самописной конфигурации 1С вполне реально и не слишком сложно, если четко понимать принципы взаимодействия с банковским софтом. Начните с настройки демо-режима Сбербанка, отладьте отправку команд и обработку ответов, и только после этого переходите к тестированию на реальном оборудовании.