Интеграция банковских терминалов с 1С:Предприятие 7.7 — задача, которая часто сопровождается трудностями, особенно при работе в терминальном режиме (RDP). Одна из самых неприятных проблем — это внезапное закрытие (вылет) программы без каких-либо сообщений об ошибке при вызове функции оплаты. В этой статье мы подробно разберем, почему это происходит и как пошагово диагностировать и устранить неисправность на примере интеграции с терминалом Сбербанка.
Основная проблема заключается в том, что 1С 7.7 аварийно завершает работу при вызове метода ОплатитьПлатежнойКартой(). При этом локально, на машине кассира, все может работать исправно, а трудности начинаются именно при запуске 1С через подключение к удаленному рабочему столу.
Когда программа просто "вылетает", первым делом нужно сузить круг поиска. Проблема может быть связана с версией библиотеки (DLL), неправильными параметрами вызова метода или ошибками на уровне операционной системы и связи с оборудованием. Проанализируем основные гипотезы.
Версии библиотек и количество параметров
Сбербанк поставляет разные версии драйверов для своих терминалов. Ключевым компонентом для интеграции является файл sbrfcom.dll. Разные версии этой библиотеки могут требовать разное количество параметров для одного и того же метода.
ОплатитьПлатежнойКартой(Сумма, КодRRN, КодАвторизации).Если в вашем коде 1С вызывается метод с тремя параметрами, а зарегистрированная в системе DLL ожидает семь (или наоборот), это почти гарантированно приведет к аварийному завершению работы 1С 7.7 без вывода ошибок. Программа пытается обратиться к области памяти, которая не была подготовлена, и происходит сбой.
Что делать:
C:\sc552\ или подобная).1C\3_par (для 3-х параметров) и другие.Анализ лог-файлов
Программное обеспечение терминала почти всегда умеет вести логи. Включите логирование в файле конфигурации pinpad.ini (обычно параметр LogLevel). Изучив лог, можно увидеть, на каком этапе происходит сбой. Например, если в логе есть запись "Вызвана функция ОплатитьПлатежнойКартой", но нет записи о выходе из нее, это подтверждает, что проблема именно внутри компоненты.
Чтобы понять, связана ли проблема с 1С или с настройкой связи на уровне системы, нужно проверить работу терминала с помощью его "родной" утилиты. Для терминалов Сбербанка это, как правило, loadparm.exe.
Важнейшее правило диагностики: если loadparm.exe не может подключиться к терминалу, то и 1С тоже не сможет. Тестировать нужно в тех же условиях, в которых работает 1С, то есть запускать loadparm.exe нужно на сервере внутри RDP-сессии.
Если при запуске loadparm.exe в RDP-сессии утилита не запускается, зависает или выдает ошибку, значит, проблема не в 1С, а в том, что программа на сервере не может "достучаться" до устройства, физически подключенного к компьютеру кассира. Чаще всего это связано с неправильной настройкой проброса COM-портов.
Банковский терминал, даже если он подключен по USB, обычно работает через эмуляцию COM-порта. Чтобы программа, запущенная на удаленном сервере, могла работать с этим портом, его нужно "пробросить" с локальной машины на сервер.
Разберем по шагам, как это сделать правильно:
Перед подключением к удаленному рабочему столу откройте параметры подключения (ярлык RDP), перейдите на вкладку "Локальные ресурсы". В разделе "Локальные устройства и ресурсы" нажмите кнопку "Подробнее..." и установите флажок "Порты (COM и LPT)". Без этого шага проброс портов работать не будет.
После подключения к серверу откройте командную строку (cmd) и выполните команду:
change port
Эта команда покажет список всех доступных COM-портов в вашем сеансе, включая проброшенные. Вывод может выглядеть примерно так:
AUX = \DosDevices\COM1
COM6 = \Device\RdpDrPort\COM6;e171bbf5
COM8 = \Device\RdpDrPort\COM8;e171bbf5
Здесь COM6 и COM8 — это порты, проброшенные с клиентской машины. Важно: номер порта на сервере может не совпадать с номером на локальной машине. Вам нужен именно тот номер, который отображается на сервере.
pinpad.ini на сервере.
Найдите на сервере в папке с драйверами терминала (например, C:\sc552) файл pinpad.ini. Откройте его в текстовом редакторе и найдите параметр ComPort. Укажите в нем номер порта, который вы определили на предыдущем шаге. Например:
ComPort=8
Сохраните файл и снова попробуйте запустить loadparm.exe на сервере. Если порт настроен правильно, утилита должна успешно запуститься и попытаться установить связь с терминалом.
Если после настройки портов loadparm все еще не работает, снова смотрим в логи. В ходе решения проблемы в теме форума был получен следующий лог:
11.09 13:13:03 SBKRNL: Open com 3 (9600)
11.09 13:13:03 SBKRNL: COM read err 38
...
11.09 13:13:13 SBKRNL: Result = 99
Проанализируем эти ошибки:
Open com 3: Программа пытается открыть COM-порт №3. Это сразу должно насторожить, если вы настроили другой порт (например, COM5 или COM8). Это означает, что либо настройка в pinpad.ini не сработала, либо есть еще один конфигурационный файл, который переопределяет этот параметр.COM read err 38: Системная ошибка, означающая "Достигнут конец файла". В контексте COM-порта это говорит о том, что программа попыталась прочитать данные из порта, но не получила ответа. Связи с устройством нет.Result = 99: Это код ошибки самого терминала, который означает "Разрыв связи с терминалом" или "Нет связи с пин-падом". Это прямое следствие неудачных попыток чтения из порта.Такой лог однозначно указывает на проблему в цепочке "ПО на сервере -> проброшенный COM-порт -> физическое устройство".
В разобранной ситуации, даже после всех манипуляций с портами и библиотеками, стабильной работы добиться не удалось. Решение пришло со стороны банка.
Специалисты Сбербанка приехали и установили "свой старый софт". После этого все заработало.
Это очень важный вывод: не всегда самые свежие драйверы являются самыми лучшими, особенно для устаревших систем, как 1С 7.7. Старые, проверенные временем версии ПО могут быть гораздо стабильнее и не содержать ошибок, которые появляются в новых релизах. Они также могут быть лучше совместимы с особенностями работы в терминальных сессиях.
Итоговый алгоритм решения проблемы:
sbrfcom.dll соответствует количеству параметров в вызове метода ОплатитьПлатежнойКартой в коде 1С.change port на сервере определите номер проброшенного порта.pinpad.ini на сервере.loadparm.exe, запущенной в RDP-сессии.В процессе эксплуатации могут возникнуть и другие сложности:
Не отображается окно "Вставьте карту" в 1С
Если все операции отображаются только на экране пин-пада, а на мониторе компьютера ничего не происходит, проверьте параметр ShowScreens в файле pinpad.ini. Если он установлен в ShowScreens=0, окна на компьютере отображаться не будут. Также причиной могут быть конфликты с графическими компонентами, такими как FormEx или 1C++.
Слип-чек печатается на неверный фискальный регистратор (ФР)
Если на сервере настроено несколько логических устройств (ЛУ) для разных ФР, библиотека терминала может по умолчанию отправлять печать на первое доступное устройство. Для решения этой проблемы нужно искать в документации к драйверам или в pinpad.ini параметры, отвечающие за печать и указание конкретного ЛУ. Если таких настроек нет, возможно, придется программно в 1С перехватывать данные для слип-чека и отправлять их на нужный ФР стандартными методами драйвера ФР.