В процессе автоматизации розничной торговли разработчики нередко сталкиваются с коварной ошибкой: оплата по банковской карте через эквайринговый терминал проходит успешно, терминал выдает чек и код авторизации, но при попытке сохранить или провести документ (например, Чек ККМ) платформа 1С:Предприятие моментально аварийно закрывается без вывода понятных сообщений об ошибке. Перехват исключения через стандартную конструкцию языка Попытка ... Исключение не срабатывает, а закрытие объекта драйвера в коде не приносит результата.
Разберем природу этого сбоя, выясним, почему падение происходит именно на этапе записи данных в базу, и рассмотрим рабочие способы устранения проблемы.
Проанализируем механику взаимодействия платформы 1С с внешними компонентами эквайринга. При использовании устаревшей технологии интеграции вызов команд терминала осуществляется через COM-объект AddIn.SBRFCOMExtension (библиотеки sbrf.dll и sbrfcom.dll). Эти библиотеки представляют собой неуправляемый (unmanaged C/C++) код, который загружается непосредственно в адресное пространство процесса 1cv8.exe.
К аварийному завершению работы 1С приводят следующие факторы:
AuthorizeSales) устаревшие сборки библиотек некорректно работают с системным распределителем памяти C Runtime (CRT) или повреждают стек вызовов из-за несоответствия числа передаваемых параметров (в разных версиях sbrfcom.dll методы принимают 3 либо 7 параметров). Сама операция в терминале выполняется, но область памяти процесса 1С оказывается поврежденной.1Cv8.1CD) выполняются внутри одного и того же процесса 1cv8.exe. Когда в коде формы вызывается метод Записать(), платформа инициирует интенсивную работу с памятью: сериализует табличные части, строит индексы и управляет файловыми блокировками. Попадание на разрушенный ранее участок кучи вызывает фатальное системное исключение Access Violation (0xC0000005), приводя к мгновенному падению программы.Если конфигурация находится на поддержке с возможностью редактирования и используется платформа 8.3.10 или более поздняя, проблему можно решить возвратом режима совместимости к состоянию, при котором распределение памяти платформой сглаживает некорректное поведение COM-библиотеки.
Выполним следующие шаги:
РежимСовместимости.F7.После включения совместимости с версией 8.3.6 платформа возвращает внутренние алгоритмы работы с памятью к прежней модели, благодаря чему запись документов после отработки методов эквайринга перестает приводить к аварийному завершению.
Изменение режима совместимости часто является временной мерой, так как современные типовые конфигурации (например, 1С:Розница 2.2 или 1С:Розница 2.3) требуют отключения совместимости со старыми версиями для корректной работы нового функционала и драйверов ККТ по требованиям 54-ФЗ.
Наиболее надежный путь — полностью отказаться от прямого использования устаревшего COM-объекта AddIn.SBRFCOMExtension и настроить работу через механизмы Библиотеки подключаемого оборудования (БПО). Рассмотрим настройку:
sbrfcom.dll в реестре Windows, а путем прямого вызова системных библиотек банка (pilot_nt.dll) либо консольной утилиты sb_pilot.exe.C:\sc552).При таком подходе среда выполнения 1С надежно изолирована от сбоев в COM-библиотеках, а команды передаются по актуальным протоколам интеграции.
Разберем ситуацию, когда конфигурация не типовая, сильно доработана под работу с AddIn.SBRFCOMExtension, а изменять режим совместимости всей базы нельзя из-за ограничений другого функционала. В этом случае мы можем вынести проблемную DLL из памяти процесса 1С в системный процесс-контейнер Windows (dllhost.exe).
Для реализации изоляции настроим серверное приложение COM+:
dcomcnfg).SBRF_Isolation) и укажем тип активации Серверное приложение.AddIn.SBRFCOMExtension (предварительно библиотека должна быть зарегистрирована в системе через утилиту regsvr32).Теперь при вызове инициализации эквайринга в коде 1С:
Попытка
ОбъектДрайвера = Новый COMОбъект("AddIn.SBRFCOMExtension");
Исключение
Сообщить("Ошибка инициализации эквайринга: " + ОписаниеОшибки());
КонецПопытки;
Экземпляр COM-объекта будет создан не внутри 1cv8.exe, а в изолированном системном процессе dllhost.exe. Даже если банковская библиотека допустит повреждение кучи или утечку дескрипторов после выполнения функции AuthorizeSales, это затронет только процесс контейнера и не приведет к падению клиентского приложения 1С при последующей транзакции записи в файл базы данных.
Обратим внимание на еще один нюанс, который способен вызывать критический сбой библиотеки при завершении транзакции. При обработке чека компонента Сбербанка формирует служебные файлы ответов (файлы без расширения e, p, а также файлы чеков и журналов) в рабочем каталоге UPOS.
Если у учетной записи Windows, под которой запущен сеанс 1С, отсутствуют полные права на чтение, создание и изменение файлов в этой папке (например, C:\sc552), библиотека при попытке сбросить буфер ответов на диск падает с ошибкой ввода-вывода, что также влечет за собой аварийное завершение процесса 1С. Убедимся, что для группы пользователей Windows на каталог софта терминала предоставлен Полный доступ.