Как исправить искажение слова скидка и некорректную ставку НДС при печати чека на АТОЛ 55Ф

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

При доработке типовых конфигураций 1С (например, 1С:Управление торговлей) и подключении онлайн-касс через низкоуровневые вызовы драйвера часто возникают проблемы с отображением обязательных фискальных реквизитов. Разберем две распространенные проблемы при работе с ККТ АТОЛ 55Ф под управлением драйвера DTO 8.x: искажение служебных надписей (печать «съшфър» вместо «скидка») и двойную регистрацию ставок НДС (одновременный вывод НДС 0% и НДС 18%/20%).

Причины возникновения ошибок

Проанализируем, почему возникают обе эти ошибки при прямом взаимодействии с ККТ:

  1. Искажение текста («съшфър»): данная строка представляет собой слово «Скидка», преобразованное через некорректную таблицу символов (интерпретация кодировки MacCyrillic или Windows-1251 в кодировку IBM866/DOS). Драйвер ККТ или встроенный шаблон чека ожидает текст в одной кодировке, а внешняя компонента 1С передает данные в другой. Кроме того, согласно требованиям формата фискальных данных (ФФД), скидка не должна печататься отдельной самостоятельной операцией.
  2. Неверная регистрация ставок НДС: в онлайн-кассах налоги больше не привязываются к секциям (отделам), как это было в кассах старого образца с ЭКЛЗ. В протоколе драйвера АТОЛ номера ставок налога строго фиксированы: значение 1 соответствует ставке 18% (20%), 2 — 10%, а 3 — 0%. Если в методе передавать значение 3 (полагая, что это номер секции с НДС 18%), касса регистрирует товар со ставкой 0%, а затем при закрытии чека пытается свести итоги, вызывая расхождение и лишние строки на чековой ленте.

Способ 1. Корректировка параметров низкоуровневых методов драйвера

Если в конфигурации используется прямая работа через низкоуровневые методы драйвера (например, НапечататьФискСтроку), разберем по шагам необходимые исправления.

Во-первых, проверим сопоставление налоговых ставок. В коде формирования позиции чека налог должен передаваться не как номер отдела, а как фискальный код ставки налога:

  1. Код 1 — ставка НДС 18% (или 20%);
  2. Код 2 — ставка НДС 10%;
  3. Код 3 — ставка НДС 0%;
  4. Код 4 — без НДС;
  5. Код 5 — расчетная ставка НДС 18/118 (20/120);
  6. Код 6 — расчетная ставка НДС 10/110.

Во-вторых, исключим передачу скидок отдельными строками или параметрами снижения цены. Рассчитаем итоговую стоимость и цену позиции с учетом скидки на стороне 1С до передачи в ККТ:


// Пример расчета цены с учетом скидки перед регистрацией строки
ЦенаСоСкидкой = Окр(СуммаСоСкидкой / Количество, 2);
СуммаПозиции = Окр(ЦенаСоСкидкой * Количество, 2);

// Передаем в кассу конечную цену и код налога (1 - НДС 18%/20%)
Драйвер.Цена = ЦенаСоСкидкой;
Драйвер.Количество = Количество;
Драйвер.Сумма = СуммаПозиции;
Драйвер.Налог = 1; // Фиксированный код ставки НДС
Драйвер.НапечататьФискСтроку();

Способ 2. Переход на передачу XML-пакета по стандарту БПО

Наиболее надежный и современный способ избавиться от проблем с кодировками и расчетом налогов — отказаться от ручного вызова процедур печати строк чека и перейти на типовой механизм передачи чека единым 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 передается в метод СформироватьЧек интеграционной компоненты ККТ. Это полностью исключает возникновение искаженных символов и некорректное распределение сумм налога в чеке.

← На главную