Почему 1С аварийно завершает работу при оплате через эквайринговый терминал Газпромбанка и как это исправить?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

Рассмотрим распространенную и крайне неприятную проблему: при попытке проведения оплаты платежной картой через банковский терминал Газпромбанка из документа Розничные продажи (Чек) платформа 1С:Предприятие мгновенно завершает работу с аварийной ошибкой процесса 1CV8C.exe.

При этом регулярная диагностика терминала через драйвер проходит успешно, связь с сервером авторизации банка есть, однако при клике на кнопку оплаты происходит критический сбой. Разберем по шагам, почему возникает эта ошибка и как её ликвидировать.

Анализ причины аварийного сбоя

Проанализируем технологическую цепочку вызова процедур при интеграции Библиотеки подключаемого оборудования (БПО) с внешним драйвером эквайринга:

  1. 1С вызывает обработку оповещения в общем модуле МенеджерОборудованияКлиента, в процедуре НачатьВыполнениеКоманды_ВыполнитьКомандуЗавершение.
  2. Далее исполняется метод драйвера: ОбъектДрайвера.ОплатитьПлатежнойКартой(...).
  3. Вызов передается во внешнюю нативную библиотеку GPBEMVGateNativeAPI1C.dll (компонента NativeAPI на C++), которая обращается к библиотека авторизационного модуля emvgatessl.dll.

Причина падения платформы заключается в особенности работы нативных компонент C++ (NativeAPI). В отличие от встроенного языка 1С, имеющего мягкую динамическую типизацию, скомпилированная внешняя библиотека ожидает на вход строго определенные типы данных. Если параметр НомерЧека передается как числовой тип (например, 123) или значение Неопределено вместо типа Строка, в C++ коде драйвера происходит обращение по невалидному указателю памяти (Access Violation). Поскольку внешняя компонента выполняется в едином адресном пространстве процесса 1С, конструкция Попытка ... Исключение не может перехватить эту ошибку, и платформа 1С аварийно падает.

Шаг 1. Явное приведение типов параметров

Проанализируем параметры, передаваемые в функцию оплаты. Метод драйвера принимает следующий набор значений:


Ответ = ОбъектДрайвера.ОплатитьПлатежнойКартой(
    ПараметрыПодключения.ИДУстройства, 
    НомерКарты, 
    Сумма, 
    НомерЧека, 
    КодRRN, 
    КодАвторизации, 
    СлипЧек
);

Убедимся, что параметр НомерЧека явно преобразован в строковый тип. Если номер чека формируется как число или ссылка на документ, обязательно преобразуем его с помощью функции Строка() или форматирования:


// Приводим номер чека к явному строковому типу
НомерЧекаСтрокой = Формат(НомерЧека, "ЧГ=0"); // исключаем разделители триад
// Или используем простое приведение:
// НомерЧекаСтрокой = Строка(НомерЧека);

Ответ = ОбъектДрайвера.ОплатитьПлатежнойКартой(
    ПараметрыПодключения.ИДУстройства, 
    НомерКарты, 
    Сумма, 
    НомерЧекаСтрокой, 
    КодRRN, 
    КодАвторизации, 
    СлипЧек
);

Также проверим, что остальные необязательные текстовые параметры (например, КодRRN, КодАвторизации, СлипЧек) при вызове не равны Неопределено, а передаются как пустые строки "".

Шаг 2. Проверка и очистка локального кэша внешних компонент

Часто после смены USB-портов терминала или переустановки эмулятора виртуального COM-порта в локальном кэше пользователя 1С остаются устаревшие версии библиотеки. 1С распаковывает внешние компоненты из базы данных во временную папку пользователя.

Посмотрим, как правильно очистить кэш компонент:

  1. Полностью закроем все сеансы 1С:Предприятия.
  2. Перейдем в каталог кэша внешних компонент пользователя Windows:

    %LOCALAPPDATA%\1C\1cv8\ExtCompT

    и

    %APPDATA%\1C\1cv8\ExtCompT

  3. Удалим содержимое этих каталогов. При следующем подключении оборудования 1С заново распакует корректный бинарный файл компоненты GPBEMVGateNativeAPI1C.dll.

Шаг 3. Проверка разрядности платформы и драйвера

Выясним еще один важный технический момент: разрядность клиентов. Если внешняя компонента эквайринга банка поставляется только в 32-битной сборке (x86), запуск 64-битного тонкого клиента 1С (1CV8C.exe) приведет к невозможности корректной работы библиотеки или сбою при вызове функций C++.

Для работы с 32-битными библиотеками эквайринга Газпромбанка следует использовать 32-разрядный клиент 1С:Предприятия.

← На главную