При работе с торговым оборудованием в среде 1С программисты и системные администраторы часто сталкиваются с аппаратными ошибками ККТ, которые выводятся в абсолютно нечитаемом для обычного пользователя виде. Одной из таких распространенных проблем является ошибка: «Ошибка парсинга запроса (некорректное значение поля "items[0].tax.type" ())».
Чаще всего эта ошибка возникает при попытке пробить чек из документа Оплата покупателя платежной картой или Приходный кассовый ордер в конфигурациях на обычных формах (например, 1С:Управление строительной организацией 1.3 или 1С:Управление производственным предприятием 1.3), использующих драйвер ККТ Атол 10-й версии. Давайте детально разберем природу этой ошибки и пошагово выясним, как ее исправить.
Данное сообщение возвращается непосредственно драйвером кассового аппарата (в нашем случае Атол). Оно означает, что при отправке XML-пакета с данными чека из 1С в кассу, для первой товарной позиции (индекс items[0]) XML-тег, отвечающий за ставку НДС (tax.type), передается пустым или содержит значение, которое касса не может сопоставить со своей внутренней таблицей налогов. Кассовый аппарат получает пустые скобки () вместо конкретного идентификатора налога и аварийно прерывает операцию печати чека.
Для наглядности проанализируем упрощенную структуру проблемного XML-пакета, который формирует интеграционная компонента 1С:
<items>
<item>
<name>Предоплата за строительные материалы</name>
<price>50000.00</price>
<quantity>1</quantity>
<tax>
<type></type> <!-- Источник проблемы: пустое значение внутри тега! -->
</tax>
</item>
</items>
В корректном же состоянии этот блок должен содержать явный признак налоговой ставки, понятный драйверу, например none (без НДС), vat20 (НДС 20%) или соответствующий цифровой код ставки:
<tax>
<type>none</type> <!-- Корректный формат передачи налога -->
</tax>
Ниже мы подробно рассмотрим пять основных причин, по которым этот тег может приходить на кассу пустым, и разберем методы их устранения.
Как совершенно справедливо отметили участники обсуждения на форуме, простая установка новой версии драйвера Атол (EXE-дистрибутива) в операционную систему Windows часто не решает проблему. Дело в том, что 1С работает с кассой не напрямую через установленный в ОС драйвер, а через специальную интеграционную компоненту (файл DLL, который обычно запакован внутрь обработки обслуживания ККТ или макета самой конфигурации 1С).
Даже если мы обновили обработку обслуживания торгового оборудования (файл .epf), 1С может продолжать использовать старую версию внешней компоненты, которая была ранее распакована в кэш пользователя. Выясним, как полностью обновить компоненту и очистить память программы:
Подключаемое оборудование (или Торговое оборудование в старых релизах).ИмяПользователя — учетная запись Windows):
C:\Users\ИмяПользователя\AppData\Roaming\1C\1cv8\ExtCompT\C:\Users\ИмяПользователя\AppData\Local\1C\1cv8\...ExtCompT все файлы, связанные с драйверами Атол (например, файлы вида Fptr10*.dll).
Очень часто 1С не может заполнить тег tax.type из-за отсутствия связи между внутренними ставками НДС в информационной базе и кодами ставок, которые зашиты в физической памяти кассового аппарата.
Рассмотрим, как настроить сопоставление налогов:
Без НДС должен быть четко сопоставлен налог ККТ (обычно это «Без НДС» или код «4» / «6» в зависимости от настроек кассы). Для ставки 20% должен быть выбран соответствующий налог ККТ.tax.type (), который и вызывает ошибку.Документы регистрации оплаты (такие как оплата картой или ПКО) имеют свою специфику формирования фискальных признаков. В отличие от обычного товарного чека реализации, где ставки берутся напрямую из номенклатуры в табличной части, чек оплаты часто регистрирует авансовый платеж или погашение кредита.
Проанализируем алгоритм проверки данных в самом документе:
Оплата покупателя платежной картой.МенеджерОборудованияКлиентСервер или специализированные модули интеграции с ККТ).Если вы являетесь разработчиком и вам необходимо быстро локализовать проблему непосредственно в коде конфигурации, проанализируем место, где формируется структура чека. Найдем функцию, которая собирает данные для ККТ.
Обычно в модуле формирования чека присутствует обход табличной части. Посмотрим на классический пример кода, где может возникать ошибка, если ставка НДС не определена:
// Пример формирования структуры товарной позиции для передачи в ККТ
Для Каждого СтрокаТаблицы Из ТоварныеПозиции Цикл
СтрокаЧека = Новый Структура;
СтрокаЧека.Вставить("Name", СтрокаТаблицы.Содержание);
СтрокаЧека.Вставить("Price", СтрокаТаблицы.Сумма);
СтрокаЧека.Вставить("Quantity", 1);
// Потенциально опасное место: если СтавкаНДС пустая, запишется Неопределено
Если ЗначениеЗаполнено(СтрокаТаблицы.СтавкаНДС) Тогда
СтрокаЧека.Вставить("Tax", ПолучитьСтроковоеПредставлениеСтавки(СтрокаТаблицы.СтавкаНДС));
Иначе
// ОШИБКА: Записываем пустое значение, которое приведет к сбою парсинга!
СтрокаЧека.Вставить("Tax", "");
КонецЕсли;
МассивПозиций.Добавить(СтрокаЧека);
КонецЦикла;
Для исправления подобного поведения на уровне кода мы можем принудительно подставлять значение по умолчанию (например, ставку «Без НДС»), если ставка не заполнена в документе:
// Исправленный вариант кода с подстраховкой дефолтной ставки
Если ЗначениеЗаполнено(СтрокаТаблицы.СтавкаНДС) Тогда
СтрокаЧека.Вставить("Tax", ПолучитьСтроковоеПредставлениеСтавки(СтрокаТаблицы.СтавкаНДС));
Иначе
// Безопасное решение: подставляем признак "Без НДС" (none) вместо пустоты
СтрокаЧека.Вставить("Tax", "none");
КонецЕсли;
Иногда корень проблемы лежит за пределами 1С — непосредственно в самом фискальном регистраторе. При переходе на новые форматы фискальных данных (ФФД 1.05 / 1.2) и новые ставки налога производители касс существенно меняют внутреннюю структуру таблиц налога ККТ.
Выясним, что нужно проверить на уровне «железа»:
Систематизируя все описанные шаги, мы можем с уверенностью сказать, что залог успешного решения проблемы — это последовательное исключение факторов. Сначала убедимся, что в самом документе 1С физически заполнена ставка налога. Затем проверим настройки сопоставления налогов в торговом оборудовании. И только после этого перейдем к радикальным мерам: очистке кэша внешних компонент 1С, обновлению обработки обслуживания и проверке прошивки ККТ.