При работе в интерфейсе кассира или оформлении чека оплаты может возникнуть критический сбой: в момент нажатия на кнопку оплаты банковской картой приложение 1cv8.exe моментально закрывается без выдачи стандартных диалоговых окон 1С. В журнале событий Windows (Event Viewer) фиксируется ошибка приложения с кодом исключения 0xc0000005 (Access Violation — нарушение прав доступа к памяти) в неизвестном модуле.
Разберем детально, почему возникает данная ошибка при взаимодействии с эквайринговыми терминалами, и рассмотрим практические способы ее устранения.
Код ошибки 0xc0000005 означает попытку процесса обратиться к невыделенному участку оперативной памяти или выполнить некорректный машинный код. В контексте работы с эквайрингом Сбербанка и обработками торгового оборудования выделим следующие основные факторы:
sbrfcom.dll (взятого из старого дистрибутива, рассчитанного на 3 параметра) при сохранении более свежих зависимых файлов (pilot_nt.dll, sbkernel.dll, sbrf.dll). В момент вызова метода происходит конфликт адресации функций, приводящий к мгновенному падению процесса 1cv8.exe.C:\sc552).sbrfcom.log, sbkernel.log или служебный файл p. Если у пользователя операционной системы нет прав на запись в целевую папку, работа внешней библиотеки прерывается сбоем.Вместо попыток внедрить устаревшую библиотеку с 3 параметрами правильнее использовать актуальный комплект файлов от банка и доработать внешнюю обработку обслуживания эквайрингового терминала (например, SberBankES_v2.epf).
Проанализируем сигнатуру вызова: современные версии компоненты sbrfcom.dll принимают 7 параметров вместо 3. Откроем конфигуратор и скорректируем модуль обработки торгового оборудования в процедурах выполнения оплаты и отмены операции.
Посмотрим на пример адаптации вызова метода проведения оплаты:
// Пример вызова метода с 7 параметрами для актуальной версии sbrfcom.dll
Результат = ОбъектДрайвера.ОплатитьПлатежнойКартой(
СуммаОплаты,
НомерЧека,
НомерСсылки,
КодАвторизации,
ТекстЧека,
ТекстОшибки,
ДополнительныеДанные
);
Если Результат <> 0 Тогда
ВызватьИсключение "Ошибка эквайринга: " + ТекстОшибки;
КонецЕсли;
Аналогичным образом необходимо проверить и обновить вызовы функций возврата и отмены транзакции в коде обработки.
Разберем по шагам правильную установку и регистрацию полного комплекта банковского программного обеспечения:
1cv8.exe.sbrfcom.dll, pilot_nt.dll и sbrf.dll из каталогов платформы C:\Program Files (x86)\1cv8\...\bin\ и системных каталогов Windows.C:\sc552\).C:\sc552\.
regsvr32 /u "C:\sc552\sbrfcom.dll"
C:\Windows\SysWOW64\regsvr32.exe "C:\sc552\sbrfcom.dll"
Если сбой памяти 0xc0000005 сохраняется при корректных библиотеках, настроим параметры безопасности Windows:
C:\Program Files (x86)\1cv8\<НомерВерсии>\bin\1cv8.exe.Для полного исключения влияния сторонних COM-библиотек на стабильность работы 1С можно отказаться от вызова sbrfcom.dll в пользу прямого вызова консольной утилиты банка pilot_nt.exe.
Рассмотрим логику реализации такого взаимодействия:
ЗапуститьПриложение() запускается утилита pilot_nt.exe в синхронном режиме с ожиданием завершения.Посмотрим на пример вызова утилиты из программного кода 1С:
КомандаЗапуска = "C:\sc552\pilot_nt.exe 1 " + Формат(Сумма * 100, "ЧГ=0");
КодВозврата = 0;
ЗапуститьПриложение(КомандаЗапуска, "C:\sc552", Истина, КодВозврата);
Если КодВозврата = 0 Тогда
// Чтение файла ответа и печать чека
ТекстОтвета = Новый ТекстовыйДокумент;
ТекстОтвета.Прочитать("C:\sc552\p");
Иначе
Предупреждение("Операция оплаты отклонена терминалом. Код: " + Строка(КодВозврата));
КонецЕсли;
Данный подход изолирует процесс 1С: даже при возникновении фатального сбоя внутри банковского модуля терминала платформа 1С продолжит штатную работу.