При оформлении продаж в розничной торговле владельцы бизнеса часто хотят показать покупателю его выгоду прямо в чеке. Распространенное требование — вывести для каждой позиции информацию в следующем формате:
Однако при реализации этой задачи разработчики сталкиваются с техническими трудностями. Информация выводится некрасиво, "съезжает" в конец чека или ломает фискальные блоки. В этой статье мы подробно разберем, почему возникают такие сложности, какие ограничения накладывает кассовое законодательство и как правильно реализовать вывод скидок на ККТ Атол из 1С.
---
Попытка настроить этот функционал напрямую через встроенный «Редактор шаблонов чеков Атол» обычно заводит в тупик. Реквизит «Цена без скидки» в редакторе присутствует, а вот «Суммы без скидки» там нет. Выясним причину этого ограничения.
Все современные кассовые аппараты работают в строгом соответствии с 54-ФЗ и Форматами фискальных документов (ФФД 1.05 / 1.1 / 1.2). Согласно закону:
Цена со скидкой * Количество = Итоговая сумма по позиции проверяется процессором кассы на уровне прошивки. Если округление скидки выполнено некорректно хотя бы на копейку, касса вернет ошибку и чек не пробьется.Поскольку ККТ Атол не производит фискальных расчетов по "старым" ценам, внутренняя прошивка кассы не умеет самостоятельно перемножать исходную цену на количество для вычисления виртуальной суммы без скидки. Соответственно, в редакторе шаблонов ККТ такой переменной нет. Эту информацию должна рассчитывать и передавать товароучетная система (1С).
---
Часто заказчики требуют выстроить блоки внутри одной позиции в строго определенном порядке, например:
Важно понимать: напрямую разделить фискальную позицию текстовой строкой «посередине» технически невозможно.
Фискальная строка (блок регистрации позиции) отправляется в ККТ как единый объект. Печатью этого блока полностью управляет внутренний шаблон ККТ (например, компактный шаблон ATEC или стандартный ATCP на Платформе 5.0). Касса печатает наименование, цену, количество и итоговую сумму фискальной позиции слитно, по жестко заложенному в логику прошивки алгоритму. Текстовую строку (нефискальный текст) драйвер ККТ может напечатать либо строго ДО фискального блока регистрации товара, либо строго ПОСЛЕ него.
---
Проанализируем три основных способа реализации красивого чека со скидками в зависимости от используемой версии конфигурации 1С и платформы ККТ.
Если вы работаете в конфигурации на обычных формах (где используется API версии 2.05 и ниже), вы можете управлять порядком вывода за счет очередности элементов в массиве ОбщиеПараметры.ПозицииЧека. Порядок добавления объектов в этот массив критически важен: драйвер ККТ обрабатывает их последовательно.
Чтобы справочная информация выводилась красиво и логично, мы должны для каждого товара сначала добавить фискальную позицию (которая напечатает название и цену со скидкой), а затем сразу же добавить текстовую нефискальную строку с расчетом скидки.
Рассмотрим пример реализации этого алгоритма в коде 1С:
// Предположим, мы находимся в процедуре формирования XML или структуры чека для ККТ
Для Каждого СтрокаТЧ Из СсылкаНаОбъект.Товары Цикл
// 1. Формируем стандартную фискальную позицию чека (со скидкой)
СтрокаЧекаФискальная = Новый Структура;
СтрокаЧекаФискальная.Вставить("Наименование", СтрокаТЧ.Номенклатура.Наименование);
СтрокаЧекаФискальная.Вставить("Количество", СтрокаТЧ.Количество);
СтрокаЧекаФискальная.Вставить("Цена", СтрокаТЧ.ЦенаСоСкидкой); // Фактическая цена продажи
СтрокаЧекаФискальная.Вставить("Сумма", СтрокаТЧ.СуммаСоСкидкой); // Итоговая сумма по чеку
СтрокаЧекаФискальная.Вставить("СтавкаНДС", СтрокаТЧ.СтавкаНДС);
СтрокаЧекаФискальная.Вставить("ПризнакСпособаРасчета", ПредопределенноеЗначение("Перечисление.ПризнакиСпособовРасчетаОплатами.ПередачаСПолнойОплатой"));
СтрокаЧекаФискальная.Вставить("ПризнакПредметаРасчета", ПредопределенноеЗначение("Перечисление.ПризнакиПредметовРасчета.Товар"));
// Добавляем фискальный блок в общий массив чека
ОбщиеПараметры.ПозицииЧека.Добавить(СтрокаЧекаФискальная);
// 2. Рассчитываем скидки и выводим нефискальную текстовую строку
ЦенаБезСкидки = СтрокаТЧ.Цена; // Исходная цена номенклатуры
СуммаБезСкидки = ЦенаБезСкидки * СтрокаТЧ.Количество;
СуммаСкидки = СуммаБезСкидки - СтрокаТЧ.СуммаСоСкидкой;
// Выводим информацию о скидке только если она действительно была предоставлена
Если СуммаСкидки > 0 Тогда
// Формируем понятный и красивый текст для покупателя
ШаблонТекста = "[Без скидки: %1 * %2 = %3 | Скидка: %4]";
ТекстСтроки = СтрШаблон(ШаблонТекста,
Формат(ЦенаБезСкидки, "ЧДЦ=2; ЧГ=0"),
Формат(СтрокаТЧ.Количество, "ЧДЦ=3; ЧГ=0"),
Формат(СуммаБезСкидки, "ЧДЦ=2; ЧГ=0"),
Формат(СуммаСкидки, "ЧДЦ=2; ЧГ=0"));
// Используем стандартную функцию БСП для создания параметров текстовой строки
// Третий параметр "Истина" отвечает за перенос текста, если он шире ленты ККТ
СтрокаЧекаТекстовая = МенеджерОборудованияКлиентСервер.ПараметрыТекстовойСтрокиЧека(ТекстСтроки, , Истина);
// Добавляем текстовую строку СРАЗУ вслед за фискальной
ОбщиеПараметры.ПозицииЧека.Добавить(СтрокаЧекаТекстовая);
КонецЕсли;
КонецЦикла;
При таком подходе на чековой ленте мы получим аккуратный и структурированный вид:
Шоколад молочный Аленка
1.000 шт. х 80.00 = 80.00
[Без скидки: 100.00 * 1.000 = 100.00 | Скидка: 20.00]
Это выглядит профессионально, не нарушает фискальный блок кассы и дает покупателю полную информацию о его выгоде.
---
Если вы работаете в современных конфигурациях 1С (таких как «1С:Розница 2.3 / 3.0», «1С:Управление нашей фирмой» или «1С:Управление торговлей 11»), программировать вывод строк вручную нет необходимости. В этих системах разработан удобный графический редактор чеков на базе Системы компоновки данных (СКД).
Разберем по шагам, как настроить отображение скидки через интерфейс 1С:
[ЦенаБезСкидки] — исходная цена товара;[СуммаСкидки] — общая величина скидки на позицию;[ПроцентСкидки] — относительный размер скидки.---
В современных кассовых аппаратах Атол, работающих под управлением Платформы 5.0 и управляемых Драйвером торгового оборудования (ДТО) версии 10, появился внутренний механизм «Шаблонов дополнения чека».
Касса может автоматически дописывать информацию о скидках в чеке, если включить соответствующую настройку драйвера:
---
Подведем итоги нашего анализа:
TextString) сразу после регистрации фискальной позиции (FiscalString) в коде 1С.