Ситуация, когда программа 1С аварийно завершает работу («вылетает») в момент совершения банковской операции, является критической для любого ритейла. Особенно неприятно, если при успешной оплате чек в 1С не создается, а программа просто закрывается без ошибок. Проанализируем типичную ситуацию: оплата по карте проходит штатно, если карта считана верно, но при любой ошибке (неправильно вставлена карта, отказ клиента, обрыв связи) 1С «схлопывается».
Рассмотрим причины возникновения этой проблемы и разберем пошагово методы ее решения, основываясь на практическом опыте специалистов и особенностях взаимодействия 1С с программным обеспечением Sberbank UPOS.
Это самая распространенная причина вылетов в конфигурациях на обычных формах (например, Управление торговлей 10.3 или УПП) и некоторых ранних редакциях Розницы. Суть проблемы заключается в том, что разные версии конфигураций 1С ожидают разное количество аргументов при вызове функций из библиотеки sbrf.dll.
Выясним причину: по умолчанию специалисты банка часто регистрируют современную версию библиотеки, рассчитанную на 7 параметров. Однако многие учетные системы 1С продолжают работать по старому стандарту, ожидая только 3 параметра. Когда 1С передает 3 параметра функции, которая ждет 7, происходит критическая ошибка переполнения стека или доступа к памяти, что моментально закрывает основной процесс 1cv8.exe.
Для решения этой проблемы выполним следующие действия:
C:\sc552).1C. В ней, как правило, содержатся две директории: 3_par и 7_par.3_par. Нам необходимо скопировать все содержимое этой папки в корень каталога C:\sc552 с заменой существующих файлов.
regsvr32 C:\sc552\sbrf.dll
regsvr32 C:\sc552\sbrfcom.dll
Важный момент: если папки 1C внутри каталога эквайринга нет, следует запросить у службы поддержки банка файлы драйвера именно для «трехпараметрического» обмена.
Проанализируем ситуацию со стороны платформы. Существуют «неудачные» релизы, в которых работа с внешними компонентами через COM-соединение была нестабильной. Например, версия 8.3.8.2322 часто упоминается как проблемная именно в контексте работы с торговым оборудованием.
Если замена библиотек Сбербанка не помогла, рассмотрим вариант отката или обновления платформы. В некоторых случаях стабильную работу показывает замена на более старый, но проверенный релиз (например, 8.3.8.2197), либо обновление до актуальных версий ветки 8.3.15 и выше, где механизмы перехвата исключений от внешних драйверов работают корректно.
Система предотвращения выполнения данных (DEP) в Windows 7 и выше может расценивать действия библиотеки sbrf.dll как попытку атаки на память процесса 1С. В момент возникновения ошибки чтения карты драйвер пытается вызвать диалоговое окно или записать лог, что блокируется Windows, вызывая «тихий» вылет программы.
Попробуем настроить исключения DEP:
1cv8.exe).Драйвер Сбербанка в процессе работы активно записывает лог-файлы (S_SBRF.log) и файлы обмена (e, p, pin) в свою рабочую папку. Если у пользователя Windows, под которым запущена 1С, недостаточно прав на запись в папку C:\sc552, драйвер может вызвать исключение Access Violation.
Проверим права доступа: необходимо предоставить группе пользователей «Все» (или конкретному пользователю) полные права (Чтение, Запись, Изменение) на папку с банковским ПО. Это исключит вероятность вылета 1С из-за невозможности драйвера обновить файл параметров.
В современных конфигурациях 1С:Розница (начиная с редакций 2.2 и выше) разработчики добавили поддержку драйверов Native API. В отличие от старых COM-компонент, работа через Native API более стабильна, так как драйвер работает по правилам платформы 1С.
Разберем, как это проверить: в настройках подключаемого оборудования в 1С при создании экземпляра «Эквайринговый терминал» обратим внимание на поле «Драйвер оборудования». Если там выбран «Сбербанк:Эквайринговые терминалы», попробуем переключить его на «Сбербанк:Эквайринговые терминалы (NativeApi)». Это избавит систему от зависимости от регистрации sbrfcom.dll в реестре Windows.
Если проблема сохраняется, проанализируем файл S_SBRF.log в папке драйвера. Перед тестом рекомендуем очистить старый лог. Если после вылета 1С последняя запись в логе связана с функциями ShowDialog или GetPin, значит, проблема в отрисовке графических окон драйвера. В этом случае в файле настроек pinpad.ini можно попробовать установить параметры отображения интерфейса в значение 0, чтобы 1С сама управляла сообщениями пользователю, а драйвер не пытался создавать собственные окна поверх интерфейса программы.