Почему вылетает 1С 7.7 при оплате картой через терминал Сбербанка в RDP-сессии?

Программист 1С v7.7 Торговля и дистрибуция
← На главную

Интеграция банковских терминалов с 1С:Предприятие 7.7 — задача, которая часто сопровождается трудностями, особенно при работе в терминальном режиме (RDP). Одна из самых неприятных проблем — это внезапное закрытие (вылет) программы без каких-либо сообщений об ошибке при вызове функции оплаты. В этой статье мы подробно разберем, почему это происходит и как пошагово диагностировать и устранить неисправность на примере интеграции с терминалом Сбербанка.

Основная проблема заключается в том, что 1С 7.7 аварийно завершает работу при вызове метода ОплатитьПлатежнойКартой(). При этом локально, на машине кассира, все может работать исправно, а трудности начинаются именно при запуске 1С через подключение к удаленному рабочему столу.

Шаг 1. Первичная диагностика: определяем причину вылета

Когда программа просто "вылетает", первым делом нужно сузить круг поиска. Проблема может быть связана с версией библиотеки (DLL), неправильными параметрами вызова метода или ошибками на уровне операционной системы и связи с оборудованием. Проанализируем основные гипотезы.

Версии библиотек и количество параметров

Сбербанк поставляет разные версии драйверов для своих терминалов. Ключевым компонентом для интеграции является файл sbrfcom.dll. Разные версии этой библиотеки могут требовать разное количество параметров для одного и того же метода.

Если в вашем коде 1С вызывается метод с тремя параметрами, а зарегистрированная в системе DLL ожидает семь (или наоборот), это почти гарантированно приведет к аварийному завершению работы 1С 7.7 без вывода ошибок. Программа пытается обратиться к области памяти, которая не была подготовлена, и происходит сбой.

Что делать:

  1. Найдите папку с установленными драйверами терминала (часто это C:\sc552\ или подобная).
  2. Проверьте, есть ли в ней подпапки, указывающие на разные версии, например, 1C\3_par (для 3-х параметров) и другие.
  3. Попробуйте зарегистрировать DLL из другой папки и изменить вызов метода в коде 1С, указав соответствующее количество параметров. В рассматриваемом случае, переход на DLL версии 33.4.7.0 и вызов метода с 7-ю параметрами прекратил вылеты и вместо них стала появляться осмысленная ошибка "99", что уже является прогрессом.

Анализ лог-файлов

Программное обеспечение терминала почти всегда умеет вести логи. Включите логирование в файле конфигурации pinpad.ini (обычно параметр LogLevel). Изучив лог, можно увидеть, на каком этапе происходит сбой. Например, если в логе есть запись "Вызвана функция ОплатитьПлатежнойКартой", но нет записи о выходе из нее, это подтверждает, что проблема именно внутри компоненты.

Шаг 2. Изолируем проблему от 1С: используем утилиту `loadparm`

Чтобы понять, связана ли проблема с 1С или с настройкой связи на уровне системы, нужно проверить работу терминала с помощью его "родной" утилиты. Для терминалов Сбербанка это, как правило, loadparm.exe.

Важнейшее правило диагностики: если loadparm.exe не может подключиться к терминалу, то и 1С тоже не сможет. Тестировать нужно в тех же условиях, в которых работает 1С, то есть запускать loadparm.exe нужно на сервере внутри RDP-сессии.

Если при запуске loadparm.exe в RDP-сессии утилита не запускается, зависает или выдает ошибку, значит, проблема не в 1С, а в том, что программа на сервере не может "достучаться" до устройства, физически подключенного к компьютеру кассира. Чаще всего это связано с неправильной настройкой проброса COM-портов.

Шаг 3. Настройка проброса COM-порта для RDP

Банковский терминал, даже если он подключен по USB, обычно работает через эмуляцию COM-порта. Чтобы программа, запущенная на удаленном сервере, могла работать с этим портом, его нужно "пробросить" с локальной машины на сервер.

Разберем по шагам, как это сделать правильно:

  1. Настройка на клиентской машине.

    Перед подключением к удаленному рабочему столу откройте параметры подключения (ярлык RDP), перейдите на вкладку "Локальные ресурсы". В разделе "Локальные устройства и ресурсы" нажмите кнопку "Подробнее..." и установите флажок "Порты (COM и LPT)". Без этого шага проброс портов работать не будет.

  2. Проверка порта на сервере.

    После подключения к серверу откройте командную строку (cmd) и выполните команду:

    change port

    Эта команда покажет список всех доступных COM-портов в вашем сеансе, включая проброшенные. Вывод может выглядеть примерно так:

    
    AUX = \DosDevices\COM1
    COM6 = \Device\RdpDrPort\COM6;e171bbf5
    COM8 = \Device\RdpDrPort\COM8;e171bbf5
    

    Здесь COM6 и COM8 — это порты, проброшенные с клиентской машины. Важно: номер порта на сервере может не совпадать с номером на локальной машине. Вам нужен именно тот номер, который отображается на сервере.

  3. Настройка pinpad.ini на сервере.

    Найдите на сервере в папке с драйверами терминала (например, C:\sc552) файл pinpad.ini. Откройте его в текстовом редакторе и найдите параметр ComPort. Укажите в нем номер порта, который вы определили на предыдущем шаге. Например:

    ComPort=8

    Сохраните файл и снова попробуйте запустить loadparm.exe на сервере. Если порт настроен правильно, утилита должна успешно запуститься и попытаться установить связь с терминалом.

Шаг 4. Анализ логов и распространенные ошибки связи

Если после настройки портов 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

Проанализируем эти ошибки:

Такой лог однозначно указывает на проблему в цепочке "ПО на сервере -> проброшенный COM-порт -> физическое устройство".

Шаг 5. Итоговое решение: когда ничего не помогает

В разобранной ситуации, даже после всех манипуляций с портами и библиотеками, стабильной работы добиться не удалось. Решение пришло со стороны банка.

Специалисты Сбербанка приехали и установили "свой старый софт". После этого все заработало.

Это очень важный вывод: не всегда самые свежие драйверы являются самыми лучшими, особенно для устаревших систем, как 1С 7.7. Старые, проверенные временем версии ПО могут быть гораздо стабильнее и не содержать ошибок, которые появляются в новых релизах. Они также могут быть лучше совместимы с особенностями работы в терминальных сессиях.

Итоговый алгоритм решения проблемы:

  1. Убедитесь, что версия sbrfcom.dll соответствует количеству параметров в вызове метода ОплатитьПлатежнойКартой в коде 1С.
  2. Настройте проброс COM-портов в RDP-клиенте.
  3. С помощью команды change port на сервере определите номер проброшенного порта.
  4. Пропишите этот номер в файле pinpad.ini на сервере.
  5. Проверьте соединение с помощью утилиты loadparm.exe, запущенной в RDP-сессии.
  6. Если ничего из вышеперечисленного не помогает, настаивайте на том, чтобы техническая поддержка банка предоставила и установила версию ПО, которая гарантированно совместима с 1С 7.7 и работой в терминальном режиме.

Дополнительные проблемы и их решения

В процессе эксплуатации могут возникнуть и другие сложности:

Не отображается окно "Вставьте карту" в 1С

Если все операции отображаются только на экране пин-пада, а на мониторе компьютера ничего не происходит, проверьте параметр ShowScreens в файле pinpad.ini. Если он установлен в ShowScreens=0, окна на компьютере отображаться не будут. Также причиной могут быть конфликты с графическими компонентами, такими как FormEx или 1C++.

Слип-чек печатается на неверный фискальный регистратор (ФР)

Если на сервере настроено несколько логических устройств (ЛУ) для разных ФР, библиотека терминала может по умолчанию отправлять печать на первое доступное устройство. Для решения этой проблемы нужно искать в документации к драйверам или в pinpad.ini параметры, отвечающие за печать и указание конкретного ЛУ. Если таких настроек нет, возможно, придется программно в 1С перехватывать данные для слип-чека и отправлять их на нужный ФР стандартными методами драйвера ФР.

← На главную