Как правильно передавать и печатать разные ставки НДС в чеке ККМ из 1С 7.7

Программист 1С v7.7 Налоговый учет Торговля и дистрибуция
← На главную

При регистрации продаж в 1С 7.7 через фискальные регистраторы (в частности, оборудование линейки «Штрих-М») нередко возникает ситуация, когда в одном документе присутствуют позиции с разными ставками налога (например, 18%/20% и 10%). Если передавать параметры налогообложения некорректно, кассовый аппарат либо рассчитывает налог только по одной ставке с ошибочной суммой, либо вовсе не выводит разбивку по налогам в подвале чека.

Разберем детально механизм работы драйвера ККМ, выясним причину возникновения ошибки и настроим код обработки обслуживания для корректного расчета и печати НДС.

Причина некорректного расчета и логика работы свойств Tax в драйвере

Проанализируем типовую ошибку при попытке передать признак налога в процедуре регистрации позиции. Зачастую в коде устанавливается фиксированное значение свойства Tax1 = 1 для каждой строки чека. В результате драйвер относит все позиции к одной и той же налоговой группе, зарегистрированной в ККМ под номером 1.

Важно понимать внутреннюю структуру работы драйвера «Штрих-М»:

  1. Свойство Tax1 принимает не флаг активности (0 или 1), а порядковый номер налоговой ставки (от 0 до 4), настроенной во внутренней таблице кассового аппарата.
  2. Свойства Tax2, Tax3, Tax4 предназначены исключительно для случаев, когда к одной товарной позиции применяется одновременно несколько налогов (например, федеральный и региональный). Они не служат для распределения разных ставок по разным строкам чека.
  3. Перед регистрацией каждой строки свойства Tax2, Tax3, Tax4 необходимо обнулять, а в Tax1 передавать индекс требуемой ставки.

Способ 1. Программная передача номера налоговой ставки в метод Sale() (Рекомендуемый)

Рассмотрим правильную реализацию функции регистрации позиции в обработке обслуживания (например, shtrihfr_comm.ert). Для того чтобы касса правильно рассчитала налог по каждой позиции и вывела итоги в подвале чека при вызове метода CloseCheck(), необходимо передавать номер ставки НДС в качестве параметра.

Доработаем функцию регистрации позиции, добавив в нее передачу ставки налога:


Функция РегистрацияПозиции(Отдел, Сумма, Количество, Объект, СтавкаНДС)
    Пока "на экране окно вопроса" = "на экране окно вопроса" Цикл
        Объект.StringForPrinting = "";
        Объект.Price              = Сумма;
        Объект.Quantity           = Количество;
        Объект.Department         = Отдел;   
        
        // Очищаем дополнительные налоги
        Объект.Tax2 = 0;
        Объект.Tax3 = 0;
        Объект.Tax4 = 0;
        
        // Передаем индекс налоговой ставки из таблицы ККМ
        Если (СтавкаНДС = 18) Или (СтавкаНДС = 20) Тогда
            Объект.Tax1 = 1; // 1-я налоговая ставка в кассе
        ИначеЕсли СтавкаНДС = 10 Тогда
            Объект.Tax1 = 2; // 2-я налоговая ставка в кассе
        ИначеЕсли (СтавкаНДС = 0) Или (ПустоеЗначение(СтавкаНДС) = 1) Тогда
            Объект.Tax1 = 0; // Без налога / ставка 0%
        Иначе
            Объект.Tax1 = 0;
        КонецЕсли;
        
        Объект.Sale();
        Результат = ОбработкаОшибокПриПечати(Объект);
        
        Если Результат = "Отмена" Тогда 
            Объект.CancelCheck();
            Возврат 0;
        ИначеЕсли Результат = 0 Тогда
            Возврат 1;
        КонецЕсли;   
    КонецЦикла;
КонецФункции

В месте вызова функции в цикле обхода строк документа передаем актуальную ставку НДС из реквизитов строки или справочника номенклатуры. В этом случае фискальный регистратор самостоятельно накапливает суммы по каждой налоговой группе и при закрытии чека методом CloseCheck() формирует итоговый блок по ставкам.

Способ 2. Вывод информации строками печати (Нефискальный метод)

Если используется старая модель кассы или конфигурация настроена без фискального разделения налогов, иногда применяют вывод расчетной суммы отдельными текстовыми строками перед вызовом закрытия чека.

Посмотрим на пример такого кода:


// Печать текстовых строк с расшифровкой НДС
Если СуммаНДС18 > 0 Тогда
    СтрокаПечати = "В ТОМ ЧИСЛЕ НДС 18%: " + СокрЛП(Формат(СуммаНДС18, "Ч15.2"));
    Объект.StringForPrinting = СтрокаПечати;
    Объект.PrintString();
КонецЕсли;

Если СуммаНДС10 > 0 Тогда
    СтрокаПечати = "В ТОМ ЧИСЛЕ НДС 10%: " + СокрЛП(Формат(СуммаНДС10, "Ч15.2"));
    Объект.StringForPrinting = СтрокаПечати;
    Объект.PrintString();
КонецЕсли;

Обратите внимание: вывод через PrintString() печатает только произвольный текст. Данные суммы не накапливаются в налоговых счетчиках фискального накопителя и не отправляются в налоговые органы и ОФД как фискальные теги.

Настройка внутренних таблиц фискального регистратора

Чтобы фискальный регистратор корректно сопоставлял переданный индекс со ставкой и выводил ее в чек, необходимо проверить настройки ККМ через утилиту «Тест драйвера ККТ»:

  1. Таблица 6 («Налоговые ставки»): Убедимся, что строки таблицы соответствуют используемым индексам. Например, строка 1 — 18.00% (или 20.00%), строка 2 — 10.00%, строка 3 — 0.00%, строка 4 — Без НДС. Редактирование этой таблицы возможно только при закрытой смене (после снятия Z-отчета).
  2. Таблица 1 («Установки параметров ККТ»): Проверим поле «Печать налогов». Для вывода развернутой информации (наименование ставки, оборот и рассчитанная сумма) установим значение 2. При значении 0 печать налогового блока в чеке отключается.

Правильное указание индекса ставки в Tax1 и корректная настройка таблиц кассы обеспечивают автоматический и точный расчет налогов по каждой товарной строке и корректное закрытие чека.

← На главную