При работе со старыми конфигурациями, такими как 1С:Розница 1.0, пользователи часто сталкиваются с проблемой некорректного отображения налоговых ставок после обновления прошивок ККТ под формат фискальных данных (ФФД) 1.05. Типичная ситуация: организация не является плательщиком НДС или продает товары, освобожденные от налога, но в печатной форме чека вместо ожидаемого текста "Без НДС" выводится "НДС 0%". Разберем подробно, почему это происходит и как исправить данную ситуацию программным путем.
Проанализируем ситуацию с точки зрения взаимодействия программного обеспечения и «железа». В старых версиях драйверов и протоколах ФФД 1.0 соответствие налоговых ставок было менее строгим. Однако с введением ФФД 1.05 налоговые ставки получили жесткую индексацию (тег 1199). Для большинства касс (особенно производства АТОЛ) стандартное распределение индексов выглядит следующим образом:
Проблема заключается в том, что устаревшие обработки обслуживания в 1С:Розница 1.0 при выборе ставки "Без НДС" в карточке номенклатуры могут передавать драйверу индекс 0 или 3. Касса, следуя своей внутренней таблице налогов, интерпретирует этот индекс как НДС 0%. Наша задача — заставить программу передавать корректный индекс, соответствующий значению "Без НДС".
Прежде чем вносить изменения в код 1С, выясним, какие именно индексы настроены в самой кассе. Для этого воспользуемся утилитой "Тест драйвера ККТ" (обычно это драйвер АТОЛ версии 8.х или 10.х). Рассмотрим последовательность действий:
Запомним этот номер, он понадобится нам для корректировки программного кода.
В конфигурации 1С:Розница 1.0 взаимодействие с кассой обычно происходит через внешнюю обработку обслуживания (файл с расширением .epf). Нам необходимо найти фрагмент кода, отвечающий за формирование XML-структуры чека, а именно узла FiscalString.
Рассмотрим пример кода, где формируются атрибуты каждой позиции чека. Нам нужно обратить внимание на атрибуты Tax, TaxTypeNumber или Department. Выясним, как программа определяет, какой налог передать. Скорее всего, там присутствует условие, проверяющее ставку НДС из справочника номенклатуры.
Проанализируем пример кода, который часто встречается в обработках обслуживания. Для исправления ошибки нам нужно принудительно указать правильный индекс для ставки "Без НДС". Посмотрим на типичный блок формирования строки чека:
ЗаписьXML.ЗаписатьНачалоЭлемента("FiscalString");
ЗаписьXML.ЗаписатьАтрибут("Name", XMLСтрока(ТекущаяПозиция.Номенклатура));
ЗаписьXML.ЗаписатьАтрибут("Quantity", XMLСтрока(ТекущаяПозиция.Количество));
ЗаписьXML.ЗаписатьАтрибут("Price", XMLСтрока(ТекущаяПозиция.Цена));
ЗаписьXML.ЗаписатьАтрибут("Amount", XMLСтрока(ТекущаяПозиция.Сумма));
// Установка ставки налога
Если ТекущаяПозиция.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС Тогда
// Пытаемся передать строковое значение "none"
ЗаписьXML.ЗаписатьАтрибут("Tax", XMLСтрока("none"));
// Или передаем конкретный индекс из таблицы налогов ККТ (например, 4)
ЗаписьXML.ЗаписатьАтрибут("TaxTypeNumber", XMLСтрока("4"));
ИначеЕсли ТекущаяПозиция.СтавкаНДС = Перечисления.СтавкиНДС.НДС0 Тогда
ЗаписьXML.ЗаписатьАтрибут("Tax", XMLСтрока("0"));
ЗаписьXML.ЗаписатьАтрибут("TaxTypeNumber", XMLСтрока("3"));
КонецЕсли;
ЗаписьXML.ЗаписатьКонецЭлемента(); // FiscalString
Важный момент: если передача атрибута Tax со значением none не помогает, это означает, что драйвер или компонента ВК (внешняя компонента) ожидают строго числовой индекс в атрибуте TaxTypeNumber. В некоторых случаях ставка может быть привязана к секции (отделу). Тогда следует проверить атрибут Department.
Многие современные драйверы АТОЛ при получении XML-структуры ориентируются на текстовое поле Tax. Для реализации вывода "Без НДС" рекомендуется попробовать передать значение none. Рассмотрим подробнее, как это должно выглядеть в итоговом XML-пакете, который 1С отправляет на вход драйверу:
<FiscalString Name="Товар пример" Quantity="1" Price="100" Amount="100" Tax="none" />
Если в вашем коде 1С ставка определяется автоматически через функцию сопоставления, выясним, как работает эта функция. Обычно она называется ПолучитьПараметрыНалога или аналогично. Нам нужно убедиться, что для значения Перечисления.СтавкиНДС.БезНДС она возвращает именно none, а не число 0.
Если вы используете современный драйвер АТОЛ 10-й версии через старую 1С, ситуация усложняется тем, что драйвер 10.х имеет совершенно иную объектную модель. В этом случае "Без НДС" соответствует константе LIBFPTR_TAX_NO. Если ваша конфигурация работает через промежуточную компоненту (например, ATOL_KKT_10), убедитесь, что в настройках подключения в 1С правильно прописаны таблицы соответствия налогов.
Зачастую в настройках торгового оборудования в самой 1С есть таблица, где напротив каждой ставки НДС из программы (18, 10, 0, Без НДС) нужно вручную проставить номер налога в кассе. Если такая таблица есть, просто измените цифру напротив "Без НДС" с 0 на 4 (или 6, в зависимости от модели ККТ).
Проанализируем еще несколько факторов, которые могут влиять на результат:
Подведем итог: исправление вывода налогов в 1С:Розница 1.0 требует совместного анализа настроек драйвера ККТ и кода обработки обслуживания. Чаще всего решение сводится к замене индекса налога в XML-пакете с 0 на 4 или передаче строкового параметра none.