Как подключить эквайринговый терминал к самописной конфигурации 1С

Программист 1С v8.3 (Обычные формы) Управленческий учет Торговля и дистрибуция
← На главную

Интеграция эквайрингового терминала с кассовым узлом — важнейший шаг для любого торгового предприятия. Автоматизация этого процесса позволяет исключить пресловутый «человеческий фактор», когда кассиры ошибочно вводят неверную сумму вручную на автономном терминале, что приводит к недостачам и пересортице в учете. В рамках этой статьи мы подробно разберем, как решить задачу подключения эквайринга, если ваш клиент работает на уникальной, самописной конфигурации 1С («нетленке»), где нет готовых интеграционных механизмов «из коробки».

Выбор архитектурного решения: БПО против прямой работы с драйвером

Перед тем как приступить к написанию кода, проанализируем архитектуру нашей самописной конфигурации. У нас есть два принципиально разных пути решения задачи:

  1. Внедрение БПО (Библиотека подключаемого оборудования). Если ваша самописная база построена на управляемых формах 1С v8.3 и использует современные стандарты разработки, наиболее правильным решением будет вырезать подсистему работы с эквайринговыми терминалами из типовой БПО и интегрировать её в свою конфигурацию. Это даст универсальность: система сможет работать практически с любым банком и терминалом, для которых есть сертифицированные драйверы 1С.
  2. Прямое взаимодействие с драйвером банка (через COM-объект или API). Если перед нами «теплая ламповая» конфигурация на обычных формах (например, глубоко модернизированный аналог старой УТ 10.3 или полностью самописная система), внедрение БПО может оказаться слишком трудозатратным процессом. В этом случае проще и быстрее написать прямой коннектор к библиотекам конкретного банка. Чаще всего в отечественной практике приходится сталкиваться со Сбербанком, поэтому этот кейс мы разберем максимально подробно.

Прямая интеграция терминала Сбербанка через COM-объект

Рассмотрим по шагам классический способ подключения терминала Сбербанка к кассовому модулю самописной 1С. Для этого нам понадобятся файлы интеграции, которые обычно предоставляет банк при установке ПО терминала. Как правило, банковские специалисты загружают весь необходимый софт в каталог C:\SC552 на локальном компьютере кассира.

Для настройки взаимодействия нам понадобятся две основные библиотеки:

Выполним предварительную регистрацию этих библиотек в операционной системе. Для этого откроем командную строку от имени администратора и выполним регистрацию через утилиту 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 (слип-чек для кассира)
        Возврат Истина;
    Иначе
        Предупреждение("Ошибка проведения оплаты. Код ошибки банка: " + Строка(ОтветКод));
        Возврат Ложь;
    КонецПопытки;

КонецФункции

Альтернативный вариант интеграции: Использование консольной утилиты sb_pilot.exe

Зачастую прямая работа с COM-объектами в 1С вызывает сложности, связанные с блокировками потоков, зависаниями интерфейса или несовместимостью разрядности ОС и платформы 1С. Особенно остро эта проблема встает, если ваши кассиры работают в терминальном режиме (RDP) на удаленном сервере, куда пробросить локальный COM-порт терминала бывает крайне затруднительно.

Для решения этой проблемы мы можем использовать альтернативный, невероятно надежный способ — взаимодействие через консольное приложение sb_pilot.exe, которое поставляется Сбербанком. Этот метод не требует регистрации COM-компонент в системе.

Алгоритм взаимодействия выглядит следующим образом:

  1. 1С формирует команду для проведения операции и запускает приложение sb_pilot.exe с нужными ключами через стандартный метод платформы.
  2. Утилита блокирует интерфейс кассира (или выполняется в фоне), передает команду на терминал и ждет ответа от покупателя и процессинга.
  3. Результат операции записывается утилитой в текстовые файлы ответов (обычно это файлы e и p в рабочем каталоге).
  4. 1С считывает эти файлы, парсит ответ и, если код авторизации успешный, закрывает чек на ККТ и печатает банковский слип-чек.

Посмотрим на пример реализации запуска утилиты 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.

KKMServer берет на себя всю низкоуровневую работу с драйверами банковских терминалов и фискальных регистраторов. Он предоставляет простой и документированный API (обычно на базе HTTP-запросов JSON или веб-сокетов). Ваша 1С просто отправляет JSON-запрос на локальный веб-сервер, а KKMServer самостоятельно общается с терминалом и возвращает структурированный ответ. Этот подход полностью решает проблемы с разрядностью библиотек, совместимостью операционных систем и работой по RDP.

Организация тестирования: Как отладить код без реальных денег?

Один из самых частых вопросов разработчиков: «Как тестировать эквайринг? Можно ли забрать терминал клиента домой или в офис для написания кода?»

Забирать «боевой» терминал клиента крайне не рекомендуется. Во-первых, это материальная ответственность. Во-вторых, терминал жестко привязан к каналу связи и банковским ключам безопасности клиента, и любые тестовые транзакции на нем будут списывать реальные деньги с ваших карт. Для безопасной разработки используйте следующие подходы:

Критически важные нюансы логики и безопасности

Разберем три важнейших бизнес-процесса, о которых часто забывают начинающие разработчики при внедрении эквайринга в самописные конфигурации:

  1. Сверка итогов (Reconciliation). Оплата по карте на терминале — это лишь подтверждение (холдирование) средств банком. Чтобы эти деньги реально поступили на расчетный счет вашей организации, терминал должен передать накопленные за день транзакции в процессинговый центр. Эта операция называется «Сверка итогов». Её необходимо в обязательном порядке вызывать из 1С в процессе закрытия кассовой смены (при снятии Z-отчета). Без сверки итогов транзакции не закроются, и деньги могут вернуться покупателям обратно на карты!
  2. Обработка аварийных ситуаций. Представьте ситуацию: клиент приложил карту, терминал пискнул, клиенту пришла СМС о списании денег, и в этот момент на кассовом компьютере отключается электричество или зависает 1С. База данных не успела записать факт успешной оплаты. Чтобы кассир не требовал с покупателя деньги повторно, в системе обязательно должен быть предусмотрен механизм аварийного завершения или ручного подтверждения транзакции. Разработчику необходимо предусмотреть кнопку «Аварийная отмена» или «Проверить статус последней операции» в интерфейсе кассира.
  3. Различие между «Отменой» и «Возвратом».
    • Отмена операции (Void) производится только до проведения процедуры сверки итогов (в рамках одной смены). Деньги разблокируются на карте мгновенно, комиссия банка с продавца за эту операцию не взимается.
    • Возврат (Refund) оформляется, если смена уже закрыта и сверка итогов выполнена. Это полноценная финансовая транзакция, которая может идти до нескольких рабочих дней, и за неё банк-эквайер может удержать комиссию.
    Ваш интерфейс в 1С должен четко разделять эти два механизма, чтобы кассир не совершал ошибок.

Резюмируя все вышесказанное: подключить терминал к самописной конфигурации 1С вполне реально и не слишком сложно, если четко понимать принципы взаимодействия с банковским софтом. Начните с настройки демо-режима Сбербанка, отладьте отправку команд и обработку ответов, и только после этого переходите к тестированию на реальном оборудовании.

← На главную