При пробитии чека из конфигураций 1С (в частности, в 1С:Предприятии 7.7 «Торговля и Склад») при работе с фискальными регистраторами АТОЛ (например, АТОЛ 30Ф, АТОЛ FPrint-22ПТК) нередко возникает критический сбой: Access violation at address ... in module 'FprnM1C82_54FZ.dll'. Read of address 00000000. При этом тест связи с кассовым аппаратом в настройках торгового оборудования проходит успешно, однако при попытке фискализации чека операция аварийно прерывается.
Разберем детально причины возникновения данной неполадки, проанализируем структуру передаваемого XML-пакета и рассмотрим пошаговые способы устранения сбоя.
Выясним причину сбоя. Сообщение Access violation (нарушение прав доступа к памяти) сигнализирует о том, что внешняя компонента драйвера пытается обратиться по несуществующему или нулевому адресу в оперативной памяти (Read of address 00000000). При интеграции 1С с драйверами АТОЛ ДТО 8 через стандартную компоненту FprnM1C82_54FZ.dll это чаще всего вызвано следующими факторами:
FprnM1C82_54FZ.dll, не совпадающей по версии с базовыми библиотеками установленного пакета ДТО (например, версия надстройки 8.12 при дистрибутиве 8.14).CheckPackage требует строго UTF-8 и экранирования всех спецсимволов.Проанализируем структуру XML-пакета CheckPackage. Как правило, в модуль печати передается следующий сформированный XML:
<?xml version="1.0" encoding="UTF-8"?>
<CheckPackage>
<Parameters TaxVariant="1" PaymentType="1"/>
<Positions>
<FiscalString Tax="none" Amount="1" Price="1" Quantity="1" Name="Оплата услуг"/>
</Positions>
<Payments CashLessType3="0" CashLessType2="0" CashLessType1="0" Cash="1"/>
</CheckPackage>
Несмотря на то, что формально в формате фискальных данных параметр отдела (секции) может не являться строго обязательным, парсер библиотеки FprnM1C82_54FZ.dll аварийно завершает работу, если не находит этот атрибут в блоке FiscalString.
Для устранения ошибки достаточно явно передать номер секции, добавив параметр Department="1":
<Positions>
<FiscalString Department="1" Tax="none" Amount="1" Price="1" Quantity="1" Name="Оплата услуг"/>
</Positions>
После включения атрибута Department парсер корректно выделяет область памяти для обработки товарной позиции, и чек успешно отправляется на печать.
Рассмотрим ситуацию, которая часто возникает после добавления атрибута Department. Если на кассе пробивается чек с новым значением отдела, драйвер может вернуть ошибку: не поддерживается в данном режиме устройства.
Разберем по шагам, почему это происходит и как это исправить:
Department="0").Department="1" во всех формируемых позициях.Посмотрим на поведение компоненты при установке налога. Разные версии FprnM1C82_54FZ.dll по-разному парсят ставку Tax:
Tax="none" вызывало исключение "none is not valid integer", так как модуль ожидал числовой код (например, Tax="0"). Однако указание нуля нередко приводило к тому, что в чеке печаталась ставка «НДС 0%» вместо «Без НДС», что является грубой бухгалтерской ошибкой для организаций на спецрежимах.Tax="none" (без налога), Tax="vat0" (НДС 0%), Tax="vat10" (НДС 10%), Tax="vat20" или Tax="vat18".Если касса ругается на тип данных, необходимо обновить файл FprnM1C82_54FZ.dll из актуального дистрибутива драйвера торгового оборудования или типового обновления конфигурации, зарегистрировав библиотеку в операционной системе командной строкой:
regsvr32 "C:\ПутьКФайлу\FprnM1C82_54FZ.dll"
Проанализируем дополнительные нюансы платформы 1С 7.7, влияющие на работу с внешними компонентами:
Name тега FiscalString не должна превышать предельно допустимую длину (в зависимости от прошивки ККТ — от 64 до 128 символов). Слишком длинное текстовое поле может приводить к переполнению буфера внутри библиотеки.", &, <, >) на их XML-сущности (", & и т.д.).AddIn.FprnM45, вызывая нативные методы OpenCheck(), Registration(), Payment() и CloseCheck().