В процессе интеграции торгового оборудования, особенно при работе с классическими конфигурациями на платформе 1С 7.7, разработчики часто сталкиваются с ситуацией, когда фискальный регистратор (ФР) принудительно выводит в чеке информацию о налогах. Даже если организация работает без НДС (например, на упрощенной системе налогообложения — УСН или патенте), в чеке могут продолжать печататься строки «НДС 18%» или «НДС 0%». В этой статье мы подробно разберем, как программно управлять налоговыми ставками в драйвере АТОЛ и добьемся корректного вывода чека без лишних налоговых строк.
Основная сложность заключается в том, что в фискальных регистраторах АТОЛ (в частности, в модели 30Ф) за тип налога отвечает свойство TaxTypeNumber. Согласно документации к драйверу версии 8.х, значение 4 обычно соответствует режиму «НДС не облагается». Однако на практике мы можем столкнуться с тем, что на разных экземплярах ККТ одно и то же значение кода приводит к разным результатам. Проанализируем причину: внутри кассового аппарата существует внутренняя «Таблица налогов». Индекс, который мы передаем из 1С, — это просто номер строки в этой таблице. Если прошивки аппаратов различаются или таблицы были изменены при фискализации, индексы могут «поплыть».
Рассмотрим типичный фрагмент кода, который инициализирует продажу позиции с указанием налога:
// Пример стандартной установки налога в цикле по товарам
ECR.Name = Строка(СокрЛП(ТЧ.Номенклатура.Наименование));
ECR.Price = ТЧ.Цена;
ECR.Quantity = ТЧ.Количество;
ECR.Department = 1;
// Установка индекса налога:
// 1 - НДС 0%
// 2 - НДС 10%
// 3 - НДС 18% (или 20% для новых прошивок)
// 4 - НДС не облагается
ECR.TaxTypeNumber = 4;
ECR.Registration();
Если после выполнения этого кода в чеке всё равно печатается налог, значит, настройки в таблицах ККТ или параметры драйвера требуют уточнения.
Одной из скрытых причин принудительной печати НДС является неверно указанная система налогообложения в чеке. Если касса считает, что чек пробивается по Общей системе (ОСН), она будет требовать выделения налога. С введением онлайн-касс (ФФД 1.05 и выше) передача тега 1055 стала обязательной. Выясним, как передать этот атрибут через драйвер 8.х.
Для установки СНО нам необходимо использовать метод записи атрибута WriteAttribute() перед открытием чека или перед регистрацией позиций. Разберем код настройки системы налогообложения:
// Номера СНО:
// 1 - ОСН; 2 - УСН доход; 4 - УСН доход-расход; 8 - ЕНВД; 16 - ЕСХН; 32 - ПСН
Объект.AttrNumber = 1055;
Объект.AttrValue = 2; // Например, УСН доход
Объект.WriteAttribute();
Важный момент: если вы используете старую версию драйвера, эти свойства могут называться иначе или требовать обновления до версии 8.14 и выше для корректной поддержки ФФД 1.05.
Если программная установка TaxTypeNumber = 4 не помогает, нам нужно проверить, что именно записано в памяти самой кассы. Рассмотрим алгоритм действий в сервисной утилите «Тест драйвера ККТ»:
fptr10_t.exe для 10-й версии или drivers8.exe для 8-й).Именно этот номер строки (начиная с 1) и будет являться вашим TaxTypeNumber. Как показывает практика (и сообщения коллег с форумов), на некоторых аппаратах АТОЛ 30Ф нужным значением оказывается 6. Посмотрим, как это реализовать в коде:
// В некоторых случаях помогает использование индекса 6
Если ЭтоБезНДС Тогда
Объект.TaxTypeNumber = 6;
Иначе
Объект.TaxTypeNumber = 4; // Стандартное значение
КонецЕсли;
Проанализируем комплексный пример кода для 1С 7.7, который учитывает проверку ставок и корректную передачу данных в ФР. Мы будем использовать объект драйвера (обычно инициализируемый как Объект или ECR).
Процедура ПробитьЧекБезНДС(СписокТоваров)
// 1. Установка режима чека
Объект.CheckType = 1; // Продажа
Объект.OpenCheck();
// 2. Указываем СНО (Тег 1055)
Объект.AttrNumber = 1055;
Объект.AttrValue = 2; // УСН Доход
Объект.WriteAttribute();
// 3. Цикл по позициям
СписокТоваров.ВыбратьСтроки();
Пока СписокТоваров.ПолучитьСтроку() = 1 Цикл
Объект.Name = СписокТоваров.Наименование;
Объект.Quantity = СписокТоваров.Количество;
Объект.Price = СписокТоваров.Цена;
// Принудительно ставим налог "Без НДС"
// Пробуем 4 или 6 в зависимости от таблицы налогов вашего ФР
Объект.TaxTypeNumber = 4;
// Выполняем регистрацию позиции
Если Объект.Registration() <> 0 Тогда
Сообщить("Ошибка регистрации товара: " + Объект.ResultDescription);
Объект.CancelCheck();
Возврат;
КонецЕсли;
КонецЦикла;
// 4. Закрытие чека с оплатой (тип оплаты 1 - наличные)
Объект.Summ = СуммаЧека;
Объект.TypeClose = 1;
Объект.Payment();
Объект.CloseCheck();
КонецПроцедуры
Если ваш Атол 30Ф переведен на новую Платформу 5.0, старые методы драйвера 8.х могут работать нестабильно. В этом случае свойство TaxTypeNumber может игнорироваться, так как драйвер переходит в режим эмуляции. Выясним причину: в Платформе 5.0 налоги управляются через конкретные константы налоговых ставок, а не через индексы таблиц.
В современных реалиях рекомендуется использовать более явную передачу признака налога. Если вы все же ограничены использованием 7.7 и OLE-объекта, убедитесь, что в параметрах ККТ (через Тест драйвера) в разделе «Налоги» выключена опция «Печатать налоги с нулевыми суммами». Это позволит «скрыть» строки НДС в чеке, даже если логика драйвера пытается их туда добавить.
Рассмотрим по шагам, что делать, если НДС всё равно печатается:
TaxTypeNumber существует свойство Tax. Попробуйте устанавливать их в паре: Объект.Tax = 4; Объект.TaxTypeNumber = 4;.FPrnM1C.log вы сможете увидеть, какое именно число передается в ККТ в команде регистрации позиции. Если там уходит правильный индекс, но касса печатает налог — проблему нужно решать в настройках самой кассы через Тест Драйвера.Подводя итог, можно сказать, что решение проблемы с печатью НДС в 1С 7.7 на аппаратах АТОЛ 30Ф чаще всего кроется в несоответствии индекса TaxTypeNumber внутренней таблице налогов ККТ или в отсутствии принудительной установки системы налогообложения (СНО) через атрибуты чека. Используя предложенные выше фрагменты кода и методику проверки таблиц, вы сможете настроить корректную печать чеков для любой системы налогообложения.