При разработке и адаптации самописных документов или доработке типовых конфигураций 1С (например, старых редакций «1С:Управление торговлей 10.3») программисты часто сталкиваются со следующей проблемой: при попытке пробить чек со 100% скидкой на выходе получается фискальный документ, в котором цена и сумма товара равны нулю (Количество = 1, Цена = 0, Сумма = 0). При этом бухгалтерия и руководство компании настойчиво требуют, чтобы в чеке отображалась исходная цена товара, размер скидки и итоговый нулевой результат (Цена = 50, Скидка = 50, Сумма = 0).
В этой статье мы подробно разберем, почему ККТ ведет себя именно так, рассмотрим требования законодательства (54-ФЗ) и особенности форматов фискальных данных (ФФД), а также предложим конкретные технические решения для реализации этой задачи в коде 1С.
Для начала давайте обратимся к нормативной базе и выясним, насколько законно пробивать чек с нулевыми позициями. Согласно пункту 1 статьи 4.7 Федерального закона № 54-ФЗ, кассовый чек должен содержать ряд обязательных реквизитов, среди которых:
«наименование товаров, работ, услуг, их количество, цена (в валюте Российской Федерации) за единицу с учетом скидок и наценок, стоимость с учетом скидок и наценок...»
Из этой формулировки четко следует, что закон требует указывать в чеке цену товара уже с учетом предоставленной скидки. Если скидка составляет 100%, то фактическая цена за единицу и итоговая стоимость предмета расчета равны 0 рублей. Пробивать исходную цену (без скидки) в качестве фискальной цены товара в данном случае является нарушением закона.
Федеральная налоговая служба (ФНС) в своих официальных разъяснениях подтверждает эту позицию. При оформлении чеков со 100% скидкой (например, при расчете бонусами или в рамках маркетинговых акций) должны заполняться следующие теги:
Таким образом, нулевая цена в фискальной части чека — это абсолютно корректное и законное поведение системы.
Давайте проанализируем, как менялся подход к передаче скидок в ККТ на уровне кода 1С. Ранее, при использовании устаревшего формата ФФД 1.0, структура XML-пакета, отправляемого в драйвер кассы, позволяла передавать исходную цену и сумму скидки отдельно. В коде это выглядело следующим образом:
ЗаписьXML.ЗаписатьНачалоЭлемента("FiscalString");
ЗаписьXML.ЗаписатьАтрибут("Name" , Наименование);
ЗаписьXML.ЗаписатьАтрибут("Quantity" , XMLСтрока(ТекущаяПозиция.Количество));
ЗаписьXML.ЗаписатьАтрибут("Price" , XMLСтрока(ТекущаяПозиция.Цена));
ЗаписьXML.ЗаписатьАтрибут("Amount" , XMLСтрока(ТекущаяПозиция.Сумма));
ЗаписьXML.ЗаписатьАтрибут("Department", XMLСтрока(ТекущаяПозиция.НомерСекции));
При переходе на формат ФФД 1.05 и более современные версии (включая ФФД 1.2) логика работы изменилась. Реквизит «Цена без учета скидки» перестал быть обязательным и во многих драйверах вообще перестал передаваться в ОФД. Вместо этого ККТ ожидает только итоговые показатели. Код формирования XML-данных стал выглядеть так:
ЗаписьXML.ЗаписатьНачалоЭлемента("FiscalString");
ЗаписьXML.ЗаписатьАтрибут("Name" , XMLСтрока(ТекущаяПозиция.Наименование));
ЗаписьXML.ЗаписатьАтрибут("Quantity" , XMLСтрока(ТекущаяПозиция.Количество));
ЗаписьXML.ЗаписатьАтрибут("PriceWithDiscount", XMLСтрока(ТекущаяПозиция.ЦенаСоСкидками));
ЗаписьXML.ЗаписатьАтрибут("SumWithDiscount" , XMLСтрока(ТекущаяПозиция.Сумма));
ЗаписьXML.ЗаписатьАтрибут("DiscountSum" , XMLСтрока(ТекущаяПозиция.СуммаСкидок));
ЗаписьXML.ЗаписатьАтрибут("Department" , XMLСтрока(ТекущаяПозиция.НомерСекции));
При 100% скидке переменная ТекущаяПозиция.ЦенаСоСкидками равна 0. Соответственно, атрибут PriceWithDiscount получает нулевое значение, и ККТ печатает в фискальной строке нулевую цену.
Довольно часто при попытке пробить чек с нулевой ценой разработчики сталкиваются с аппаратной ошибкой ККТ или ошибкой драйвера («Недопустимая цена», «Сумма чека равна нулю» и т.д.).
Выясним причину этой проблемы: в заводских настройках большинства фискальных регистраторов по умолчанию активирована защита от случайных ошибок кассира — установлен запрет на регистрацию операций с нулевой ценой.
Чтобы решить эту проблему, выполним следующие шаги:
После активации этой опции кассовый аппарат без проблем начнет принимать чеки, в которых цена позиций равна нулю.
Что же делать, если главный бухгалтер настаивает на визуальном отображении маркетинговой информации в чеке (чтобы покупатель видел ценность «подарка»)? Поскольку передавать ненулевую цену в фискальные теги нельзя, лучшим решением будет использование нефискальных текстовых строк.
Мы можем вывести информацию о базовой стоимости товара и предоставленной скидке отдельной текстовой строкой, которая напечатается на чековой ленте непосредственно под наименованием товара, но при этом не уйдет в налоговую как финансовая операция.
Рассмотрим пример реализации этой логики на встроенном языке 1С. При подготовке таблицы позиций чека перед отправкой на фискализацию мы можем применить следующий алгоритм:
// Создаем структуру параметров фискальной строки
ПараметрыСтроки = Новый Структура;
ПараметрыСтроки.Вставить("Наименование" , Товар.Наименование);
ПараметрыСтроки.Вставить("Количество" , 1);
ПараметрыСтроки.Вставить("Цена" , 50); // Исходная цена
ПараметрыСтроки.Вставить("ЦенаСоСкидками" , 0); // Итоговая цена для ФФД
ПараметрыСтроки.Вставить("Сумма" , 0); // Итоговая сумма для ФФД
ПараметрыСтроки.Вставить("СуммаСкидок" , 50);
// Если цена со скидкой равна 0, формируем дополнительную текстовую строку для печати
Если ПараметрыСтроки.ЦенаСоСкидками = 0 Тогда
ТекстДляПечати = "Базовая цена: " + СокрЛП(ПараметрыСтроки.Цена) + " руб. Скидка: 100%";
// В зависимости от используемой БПО (Библиотеки подключаемого оборудования)
// добавляем нефискальную текстовую строку в массив позиций чека
НоваяСтрокаТекста = Новый Структура;
НоваяСтрокаТекста.Вставить("Текст", ТекстДляПечати);
// Отправляем на печать методом вывода текстовых строк драйвера
КонецЕсли;
Для отправки произвольного текста на ККТ обычно используется метод драйвера PrintText (или метод ПечатьТекста в интеграционных модулях 1С). Таким образом, покупатель увидит на бумажном носителе всю историю скидки, а фискальные требования контролирующих органов будут строго соблюдены.
Разберем еще один важный нюанс, который волнует бухгалтеров при проведении чеков со 100% скидкой — это риск квалификации операции как безвозмездной передачи товаров или услуг. При безвозмездной передаче у компании возникает обязанность начислить НДС с рыночной стоимости переданного имущества за счет собственных средств.
Чтобы избежать подобных рисков, необходимо четко разграничивать эти понятия:
Разработчикам, поддерживающим самописные решения на базе 1С, следует учитывать долгосрочные планы развития ФНС. Планируется постепенный и полный вывод из обращения устаревших форматов ФФД 1.05 и 1.1. Согласно текущим проектам нормативных актов, поддержка этих форматов будет полностью прекращена к **1 марта 2027 года**.
Все налогоплательщики будут обязаны использовать ФФД 1.2. При адаптации и написании новых алгоритмов взаимодействия с кассовым оборудованием в 1С рекомендуется изначально ориентироваться на требования стандарта ФФД 1.2, исключая любые попытки передавать старые параметры (такие как `Price` вместо `PriceWithDiscount`). Отрабатывайте сценарии со 100% скидками через передачу нулевых фискальных сумм и вывод информационных сообщений через нефискальные строки печати.