При доработке типовых конфигураций 1С (например, 1С:Управление торговлей) и подключении онлайн-касс через низкоуровневые вызовы драйвера часто возникают проблемы с отображением обязательных фискальных реквизитов. Разберем две распространенные проблемы при работе с ККТ АТОЛ 55Ф под управлением драйвера DTO 8.x: искажение служебных надписей (печать «съшфър» вместо «скидка») и двойную регистрацию ставок НДС (одновременный вывод НДС 0% и НДС 18%/20%).
Проанализируем, почему возникают обе эти ошибки при прямом взаимодействии с ККТ:
1 соответствует ставке 18% (20%), 2 — 10%, а 3 — 0%. Если в методе передавать значение 3 (полагая, что это номер секции с НДС 18%), касса регистрирует товар со ставкой 0%, а затем при закрытии чека пытается свести итоги, вызывая расхождение и лишние строки на чековой ленте.Если в конфигурации используется прямая работа через низкоуровневые методы драйвера (например, НапечататьФискСтроку), разберем по шагам необходимые исправления.
Во-первых, проверим сопоставление налоговых ставок. В коде формирования позиции чека налог должен передаваться не как номер отдела, а как фискальный код ставки налога:
1 — ставка НДС 18% (или 20%);2 — ставка НДС 10%;3 — ставка НДС 0%;4 — без НДС;5 — расчетная ставка НДС 18/118 (20/120);6 — расчетная ставка НДС 10/110.Во-вторых, исключим передачу скидок отдельными строками или параметрами снижения цены. Рассчитаем итоговую стоимость и цену позиции с учетом скидки на стороне 1С до передачи в ККТ:
// Пример расчета цены с учетом скидки перед регистрацией строки
ЦенаСоСкидкой = Окр(СуммаСоСкидкой / Количество, 2);
СуммаПозиции = Окр(ЦенаСоСкидкой * Количество, 2);
// Передаем в кассу конечную цену и код налога (1 - НДС 18%/20%)
Драйвер.Цена = ЦенаСоСкидкой;
Драйвер.Количество = Количество;
Драйвер.Сумма = СуммаПозиции;
Драйвер.Налог = 1; // Фиксированный код ставки НДС
Драйвер.НапечататьФискСтроку();
Наиболее надежный и современный способ избавиться от проблем с кодировками и расчетом налогов — отказаться от ручного вызова процедур печати строк чека и перейти на типовой механизм передачи чека единым XML-пакетом через подсистему «Библиотека подключаемого оборудования» (БПО).
Рассмотрим структуру XML-пакета чека. При таком подходе кассовое ядро и компонента интеграции самостоятельно выполняют преобразование кодировок, сопоставление ставок налогов и распределение скидок по позициям чека:
// Пример формирования структуры чека для передачи в БПО
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку("UTF-8");
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("CheckPackage");
ЗаписьXML.ЗаписатьНачалоЭлемента("Parameters");
ЗаписьXML.ЗаписатьАтрибут("PaymentType", "1");
ЗаписьXML.ЗаписатьАтрибут("TaxVariant", "0");
ЗаписьXML.ЗаписатьКонецЭлемента(); // Parameters
ЗаписьXML.ЗаписатьНачалоЭлемента("Positions");
ЗаписьXML.ЗаписатьНачалоЭлемента("FiscalString");
ЗаписьXML.ЗаписатьАтрибут("Name", "Товар со скидкой");
ЗаписьXML.ЗаписатьАтрибут("Quantity", "1");
ЗаписьXML.ЗаписатьАтрибут("PriceWithDiscount", "900.00");
ЗаписьXML.ЗаписатьАтрибут("Amount", "900.00");
ЗаписьXML.ЗаписатьАтрибут("VATRate", "20"); // Передача ставки НДС
ЗаписьXML.ЗаписатьКонецЭлемента(); // FiscalString
ЗаписьXML.ЗаписатьКонецЭлемента(); // Positions
ЗаписьXML.ЗаписатьКонецЭлемента(); // CheckPackage
XMLЧек = ЗаписьXML.Закрыть();
Сформированный XML передается в метод СформироватьЧек интеграционной компоненты ККТ. Это полностью исключает возникновение искаженных символов и некорректное распределение сумм налога в чеке.