Почему при записи любого документа аварийно завершается работа 1С после операции на эквайринговом терминале Сбербанка?

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

В процессе автоматизации розничной торговли разработчики нередко сталкиваются с коварной ошибкой: оплата по банковской карте через эквайринговый терминал проходит успешно, терминал выдает чек и код авторизации, но при попытке сохранить или провести документ (например, Чек ККМ) платформа 1С:Предприятие моментально аварийно закрывается без вывода понятных сообщений об ошибке. Перехват исключения через стандартную конструкцию языка Попытка ... Исключение не срабатывает, а закрытие объекта драйвера в коде не приносит результата.

Разберем природу этого сбоя, выясним, почему падение происходит именно на этапе записи данных в базу, и рассмотрим рабочие способы устранения проблемы.

В чем кроется техническая причина падения платформы?

Проанализируем механику взаимодействия платформы 1С с внешними компонентами эквайринга. При использовании устаревшей технологии интеграции вызов команд терминала осуществляется через COM-объект AddIn.SBRFCOMExtension (библиотеки sbrf.dll и sbrfcom.dll). Эти библиотеки представляют собой неуправляемый (unmanaged C/C++) код, который загружается непосредственно в адресное пространство процесса 1cv8.exe.

К аварийному завершению работы 1С приводят следующие факторы:

  1. Разрушение кучи памяти (Heap Corruption): при вызове команд авторизации (например, AuthorizeSales) устаревшие сборки библиотек некорректно работают с системным распределителем памяти C Runtime (CRT) или повреждают стек вызовов из-за несоответствия числа передаваемых параметров (в разных версиях sbrfcom.dll методы принимают 3 либо 7 параметров). Сама операция в терминале выполняется, но область памяти процесса 1С оказывается поврежденной.
  2. Специфика файлового режима работы: в файловой информационной базе клиентская логика и встроенный движок СУБД (работа с файлом 1Cv8.1CD) выполняются внутри одного и того же процесса 1cv8.exe. Когда в коде формы вызывается метод Записать(), платформа инициирует интенсивную работу с памятью: сериализует табличные части, строит индексы и управляет файловыми блокировками. Попадание на разрушенный ранее участок кучи вызывает фатальное системное исключение Access Violation (0xC0000005), приводя к мгновенному падению программы.
  3. Изменение системных механизмов в версиях платформы 8.3: начиная с релизов 8.3.7 и 8.3.8, разработчики платформы переработали внутренние распределители памяти и кэширование. Если конфигурация работает без режима совместимости с версией 8.3.6, новые механизмы платформы оказываются несовместимыми с нарушением структур памяти, допускаемым библиотекой Сбербанка.

Способ 1. Изменение режима совместимости конфигурации (быстрое решение)

Если конфигурация находится на поддержке с возможностью редактирования и используется платформа 8.3.10 или более поздняя, проблему можно решить возвратом режима совместимости к состоянию, при котором распределение памяти платформой сглаживает некорректное поведение COM-библиотеки.

Выполним следующие шаги:

  1. Запустим информационную базу в режиме Конфигуратор.
  2. Откроем палитру свойств корневого элемента дерева конфигурации.
  3. Найдем свойство РежимСовместимости.
  4. Установим значение Версия 8.3.6.
  5. Выполним обновление конфигурации базы данных клавишей F7.

После включения совместимости с версией 8.3.6 платформа возвращает внутренние алгоритмы работы с памятью к прежней модели, благодаря чему запись документов после отработки методов эквайринга перестает приводить к аварийному завершению.

Способ 2. Переход на сертифицированный драйвер БПО Native API (рекомендуемый способ)

Изменение режима совместимости часто является временной мерой, так как современные типовые конфигурации (например, 1С:Розница 2.2 или 1С:Розница 2.3) требуют отключения совместимости со старыми версиями для корректной работы нового функционала и драйверов ККТ по требованиям 54-ФЗ.

Наиболее надежный путь — полностью отказаться от прямого использования устаревшего COM-объекта AddIn.SBRFCOMExtension и настроить работу через механизмы Библиотеки подключаемого оборудования (БПО). Рассмотрим настройку:

  1. В пользовательском режиме перейдем в раздел Администрирование → Подключаемое оборудование.
  2. В списке драйверов оборудования выберем тип Эквайринговые терминалы и добавим драйвер 1С:Эквайринговые терминалы Сбербанк (версий 1.x или 2.x).
  3. Современный драйвер функционирует по технологии Native API и взаимодействует с софтом Сбербанка не через регистрацию sbrfcom.dll в реестре Windows, а путем прямого вызова системных библиотек банка (pilot_nt.dll) либо консольной утилиты sb_pilot.exe.
  4. В параметрах подключения терминала укажем рабочий каталог программного обеспечения эквайринга (по умолчанию C:\sc552).

При таком подходе среда выполнения 1С надежно изолирована от сбоев в COM-библиотеках, а команды передаются по актуальным протоколам интеграции.

Способ 3. Изоляция COM-объекта в отдельном системном процессе через COM+

Разберем ситуацию, когда конфигурация не типовая, сильно доработана под работу с AddIn.SBRFCOMExtension, а изменять режим совместимости всей базы нельзя из-за ограничений другого функционала. В этом случае мы можем вынести проблемную DLL из памяти процесса 1С в системный процесс-контейнер Windows (dllhost.exe).

Для реализации изоляции настроим серверное приложение COM+:

  1. Откроем Панель управления → Администрирование → Службы компонентов (или запустим команду dcomcnfg).
  2. Развернем ветку Службы компонентов → Компьютеры → Мой компьютер → Приложения COM+.
  3. Создадим новое приложение через контекстное меню: выберем Создать приложение вручную, присвоим имя (например, SBRF_Isolation) и укажем тип активации Серверное приложение.
  4. В свойствах удостоверения учетной записи укажем Текущий пользователь или локальную системную учетную запись.
  5. Внутри созданного приложения откроем папку Компоненты, выберем Создать → Импорт компонентов, которые уже зарегистрированы и найдем в списке компонент AddIn.SBRFCOMExtension (предварительно библиотека должна быть зарегистрирована в системе через утилиту regsvr32).

Теперь при вызове инициализации эквайринга в коде 1С:


Попытка
    ОбъектДрайвера = Новый COMОбъект("AddIn.SBRFCOMExtension");
Исключение
    Сообщить("Ошибка инициализации эквайринга: " + ОписаниеОшибки());
КонецПопытки;

Экземпляр COM-объекта будет создан не внутри 1cv8.exe, а в изолированном системном процессе dllhost.exe. Даже если банковская библиотека допустит повреждение кучи или утечку дескрипторов после выполнения функции AuthorizeSales, это затронет только процесс контейнера и не приведет к падению клиентского приложения 1С при последующей транзакции записи в файл базы данных.

Способ 4. Проверка прав доступа к рабочему каталогу терминала

Обратим внимание на еще один нюанс, который способен вызывать критический сбой библиотеки при завершении транзакции. При обработке чека компонента Сбербанка формирует служебные файлы ответов (файлы без расширения e, p, а также файлы чеков и журналов) в рабочем каталоге UPOS.

Если у учетной записи Windows, под которой запущен сеанс 1С, отсутствуют полные права на чтение, создание и изменение файлов в этой папке (например, C:\sc552), библиотека при попытке сбросить буфер ответов на диск падает с ошибкой ввода-вывода, что также влечет за собой аварийное завершение процесса 1С. Убедимся, что для группы пользователей Windows на каталог софта терминала предоставлен Полный доступ.

← На главную