Ситуация, когда программа 1С:Розница 2.3 аварийно завершает работу (ошибка 1cv8c.exe) в момент оплаты банковской картой, является критической для розничной точки. Покупатель видит списание средств, банковский терминал выдает слип-чек, но кассовый чек не печатается, а сама программа просто закрывается. При перезапуске кажется, что данных о продаже нет. В этой статье мы подробно разберем причины такого поведения системы, выясним, куда исчезают документы, и как стабилизировать работу связки 1С, эквайринга Сбербанка и касс Штрих-М.
Для начала проанализируем, как технически происходит процесс продажи в 1С. Важно понимать, что программа не «забывает» о чеке, она просто не успевает завершить транзакцию. Рассмотрим стандартный жизненный цикл документа ЧекККМ при оплате картой:
ЧекККМ в базу данных (в этот момент он еще не проведен и не имеет номера чека).Вылет программы происходит на этапе между пунктом 5 и 6. Программа уже получила подтверждение от банка, но из-за критической ошибки в памяти (Access Violation) процесс 1cv8c.exe прерывается. Поскольку транзакция проведения документа не завершена, в журнале регистраций мы не видим записи о проведении, а в списке пробитых чеков документ отсутствует.
Вопреки первому впечатлению, данные в базе сохраняются. Рассмотрим пошагово, как восстановить справедливость и пробить чек, по которому уже ушли деньги:
Перейдем в раздел Продажи — Чеки ККМ (не путать с формой РМК). По умолчанию там могут стоять фильтры по текущей смене или только по пробитым чекам. Нам необходимо:
Если чек найден, его можно попытаться пробить повторно. Однако, чтобы избежать двойного списания, перед этим следует убедиться, что в настройках драйвера 1С не стоит команда на повторную инициализацию оплаты при пробитии. Обычно, если данные об оплате уже заполнены в табличной части, 1С просто посылает команду на ККТ.
Одной из главных причин «падения» программы является версия платформы. Рассмотрим подробнее релизы 8.3.18.1483, 8.3.18.1520 и соседние. В данных версиях была замечена некорректная работа с динамической памятью при вызове внешних COM-компонент. Поскольку многие драйверы эквайринга (особенно старые версии sbrf.dll) работают именно через COM-интерфейс, возникает конфликт потоков.
Рекомендуется выполнить следующие действия:
Часто вылеты связаны с тем, что в системе зарегистрирована старая компонента через regsvr32 sbrfcom.dll. Рассмотрим, как современная 1С должна взаимодействовать с терминалом:
В последних релизах Розницы 2.3 реализована поддержка драйвера «Сбербанк: Эквайринговые терминалы 2.х» (Native API). Этот драйвер работает внутри процесса 1С гораздо стабильнее. Проанализируем процесс перехода:
C:\sc552) файлы pilot_nt.dll и другие библиотеки актуальны.Иногда причина кроется не в коде 1С, а в аппаратной части. Разберем ситуацию с микро-разрывами связи. При оплате картой терминал потребляет больше энергии, чем в режиме ожидания. Если в Windows включен режим экономии энергии, порт может кратковременно «моргнуть», что приведет к разрыву связи между драйвером и 1С именно в момент получения ответа. Программа, не получив ожидаемых данных в нужный поток, закрывается с ошибкой.
Выполним следующие настройки в ОС Windows:
Если вышеописанные методы не помогают, рассмотрим, как выяснить точную причину вылета с помощью Технологического журнала (ТЖ). Это позволит нам увидеть, какой именно модуль вызывает Access Violation.
Создадим в папке с установленной платформой (обычно C:\Program Files\1cv8\conf) файл logcfg.xml со следующим содержанием:
<config xmlns="http://v8.1c.ru/7.4/config/logcfg">
<dump location="C:\dumps" create="true" type="0"/>
<log location="C:\logs" history="24">
<event>
<eq property="Name" value="EXCP"/>
</event>
<event>
<eq property="Name" value="PROC"/>
</event>
</log>
</config>
После очередного вылета в папке C:\logs мы сможем найти файл, где будет зафиксировано событие EXCP. Если в описании ошибки фигурирует библиотека pilot-nt.dll или SberBankES_v2.dll, значит проблема локализована в банковском ПО. Если же ошибка указывает на backbas.dll или core83.dll, то это однозначный повод для обновления платформы.
Подведем итоги нашего исследования. Если 1С вылетает при пробитии чека по эквайрингу, придерживайтесь следующего алгоритма:
Применяя эти шаги системно, мы сможем добиться стабильной работы РМК и исключить потерю данных при работе с безналичной оплатой.