При интеграции кассового оборудования с самописными конфигурациями или при обновлении прошивок ККТ и драйверов разработчики часто сталкиваются с аппаратными отказами кассы. Одной из типичных проблем является ошибка «Ошибка ККТ (94: Неверная операция)», возникающая исключительно в момент попытки пробить фискальный чек, содержащий маркированную продукцию (воду, молочную продукцию, обувь, текстиль и др.). Рассмотрим подробнее, почему возникает эта ошибка и как сформировать корректный XML-пакет фискализации.
Проанализируем пример данных, передаваемых в драйвер торгового оборудования (механизм CheckPackage), который приводит к ошибке 94:
<?xml version="1.0" encoding="UTF-8"?>
<CheckPackage>
<Parameters CashierName="Иванов И. И." OperationType="1" TaxationSystem="0" SaleAddress="" SaleLocation="Касса" GroupingPositionsWhenPrinting="false" CustomerEmail="" CustomerPhone="" OperationOnline="false">
<CorrectionData Type="0"/>
<UserAttribute Name="mdlp" Value="sid00000000184903&"/>
<AgentData/>
<VendorData/>
<CustomerDetail/>
<OperationalAttribute/>
<IndustryAttribute/>
</Parameters>
<Positions>
<Barcode Type="EAN13" ValueBase64="NDAwMDAwMDAwMDA0NA=="/>
<FiscalString Name="СТЭЛМАС МИНЕРАЛ 3+ 0,6л пэт" Quantity="1" PriceWithDiscount="50" AmountWithDiscount="50" DiscountAmount="0" Department="1" VATRate="10" VATAmount="4.55" PaymentMethod="4" CalculationSubject="1" MarkingCode="MDEwNDYwNzgxMTA0MDQzODIxNVNnQnlqcVc4Riw/eh05M2M1bis=" MeasureOfQuantity="0">
<AgentData/>
<VendorData/>
<IndustryAttribute IdentifierFOIV="030" DocumentDate="21.11.2023" DocumentNumber="1944" AttributeValue="UUID=968558e6-1767-4bc9-bbcb-c8fe0f73d985&Time=1756877449577"/>
</FiscalString>
</Positions>
<Payments Cash="50" ElectronicPayment="0" PrePayment="0" PostPayment="0" Barter="0"/>
</CheckPackage>
Обратим внимание на атрибуты тега FiscalString. В пакете одновременно передаются:
MarkingCode (значение в Base64).IndustryAttribute в рамках разрешительного режима (Постановление № 1944).CalculationSubject="1".Выясним причину сбоя: значение CalculationSubject="1" соответствует обычному товару, не подлежащему обязательной маркировке средствами идентификации. Согласно формату фискальных документов ФФД 1.2 (тег 1212 «Признак предмета расчета»), комбинация, когда позиция содержит код маркировки (тег 1163 / MarkingCode), но при этом объявлена как простой товар (значение 1), является недопустимой. Прошивка ККТ после обновления распознает это противоречие и блокирует пробитие чека с кодом 94: Неверная операция.
Для исправления ситуации значение реквизита CalculationSubject в теге FiscalString должно быть строго скорректировано в зависимости от типа реализуемого товара:
Разберем по шагам, как исправить алгоритм формирования XML в коде конфигурации 1С. При заполнении структуры позиции чека для маркированного товара необходимо проверять наличие кода маркировки и корректно назначать признак предмета расчета.
Посмотрим на пример кода на встроенном языке 1С:
// Определяем признак предмета расчета согласно требованиям ФФД 1.2
Если Не ПустаяСтрока(СтрокаТовара.ШтрихкодМаркировки) Тогда
Если СтрокаТовара.Подакцизный Тогда
ПризнакПредметаРасчета = 30; // Маркированный подакцизный товар
Иначе
ПризнакПредметаРасчета = 33; // Маркированный товар с кодом маркировки
КонецЕсли;
Иначе
Если СтрокаТовара.Подакцизный Тогда
ПризнакПредметаРасчета = 2; // Подакцизный товар без маркировки
Иначе
ПризнакПредметаРасчета = 1; // Обычный товар
КонецЕсли;
КонецЕсли;
// Запись узла позиции в формируемый XML
ЗаписьXML.ЗаписатьНачалоЭлемента("FiscalString");
ЗаписьXML.ЗаписатьАтрибут("Name", СокрЛП(СтрокаТовара.НоменклатураНаименование));
ЗаписьXML.ЗаписатьАтрибут("Quantity", Формат(СтрокаТовара.Количество, "ЧДЦ=3; ЧРД=.; ЧГ=0"));
ЗаписьXML.ЗаписатьАтрибут("PriceWithDiscount", Формат(СтрокаТовара.Цена, "ЧДЦ=2; ЧРД=.; ЧГ=0"));
ЗаписьXML.ЗаписатьАтрибут("AmountWithDiscount", Формат(СтрокаТовара.Сумма, "ЧДЦ=2; ЧРД=.; ЧГ=0"));
ЗаписьXML.ЗаписатьАтрибут("CalculationSubject", Формат(ПризнакПредметаРасчета, "ЧГ=0"));
Если Не ПустаяСтрока(СтрокаТовара.ШтрихкодМаркировкиBase64) Тогда
ЗаписьXML.ЗаписатьАтрибут("MarkingCode", СтрокаТовара.ШтрихкодМаркировкиBase64);
КонецЕсли;
После корректировки строка формирования позиции в результирующем XML-пакете примет следующий вид:
<FiscalString Name="СТЭЛМАС МИНЕРАЛ 3+ 0,6л пэт" Quantity="1" PriceWithDiscount="50" AmountWithDiscount="50" DiscountAmount="0" Department="1" VATRate="10" VATAmount="4.55" PaymentMethod="4" CalculationSubject="33" MarkingCode="MDEwNDYwNzgxMTA0MDQzODIxNVNnQnlqcVc4Riw/eh05M2M1bis=" MeasureOfQuantity="0">
Если после установки CalculationSubject="33" ошибка сохраняется, рекомендуем проверить сопутствующие аппаратные и программные факторы: