При работе с конфигурацией 1С:Розница и фискальными регистраторами Атол часто возникает задача кастомизировать печатную форму чека. Стандартная задача — вывести дополнительную итоговую информацию, например, общую сумму без учета скидок, причем сделать это нужно после строки "ИТОГ".
Для начала выясним, как 1С отправляет данные на печать. В типовых конфигурациях, особенно если используется актуальная версия БПО, взаимодействие с подключаемым оборудованием происходит через общие модули. В данном случае ключевую роль играет процедура ФискализацияЧека в общем модуле ПодключаемоеОборудованиеДрайверСинхронноКлиент. Внутри нее формируется XML-структура данных, которая передается драйверу ККТ. Для глубокой кастомизации процесса иногда применяется независимая печать на ККМ напрямую через драйвер:
Результат = ОбъектДрайвера.СформироватьЧек(ПараметрыПодключения.ИДУстройства, ДанныеОперации.Электронно, ДанныеЧекаXML, ДанныеОперации.РезультатОперацииXML);
Переменная ДанныеЧекаXML содержит всю информацию о чеке в виде XML-строки. Макет чека как таковой в 1С отсутствует, внешний вид документа определяется драйвером и прошивкой ККТ на основе полученных данных. Стандартная структура XML для фискализации чека (CheckPackage) выглядит примерно так:
<?xml version="1.0" encoding="UTF-8"?>
<CheckPackage>
<Parameters CashierName="Кассир" OperationType="1" TaxationSystem="0" ...>
...
</Parameters>
<Positions>
<FiscalString Name="Творожок" Quantity="1" PriceWithDiscount="1404" AmountWithDiscount="1404" ... />
</Positions>
<Payments Cash="1404" .../>
</CheckPackage>
Наша задача — добавить в этот чек новую строку. Рассмотрим несколько способов.
Стандарт интеграции с ККТ от 1С предусматривает возможность реализации печати произвольного текста и штрихкодов в чеке ККМ внутри его табличной части. Для этого в узел Positions можно добавить тег TextString.
Пример XML-фрагмента:
...
<Positions>
<FiscalString Name="Товар 1" ... />
<FiscalString Name="Товар 2" ... />
<TextString Text="Ваш произвольный текст"/>
</Positions>
...
Проблема этого способа: Строка, добавленная таким образом, будет напечатана внутри списка товаров, то есть до всех итоговых сумм, скидок и QR-кода. Для нашей задачи, где текст должен быть после итога, этот метод не подходит.
Это самый гибкий и правильный способ, когда требуется печать дополнительного информационного чека после всех фискальных данных. Алгоритм действий следующий:
Ключевой момент: для печати нефискального документа используется другая структура XML. Подобный подход часто используют, когда формируют нефискальные чеки для обучения персонала или вывода маркетинговой информации. XML для нефискального документа не должен содержать корневой тег CheckPackage. Вместо него используется, например, Document или DocumentPackage.
Если попытаться отправить нефискальную XML-структуру через команду фискализации, возникнет ошибка: "Не найден тег CheckPackage". Это логично, так как команда ожидает данные для фискального чека.
В коде 1С это может выглядеть как вызов функции типа СформироватьТекстНефискальногоЧека или прямой вызов метода драйвера для печати текста после выполнения основной фискализации.
Пример XML для нефискального документа:
<?xml version="1.0" encoding="UTF-8"?>
<Document>
<Positions>
<TextString Text="--------------------------------"/>
<TextString Text="СУММА БЕЗ СКИДКИ =722.00"/>
</Positions>
</Document>
Этот подход позволяет напечатать любой блок информации после закрытия фискального чека, что полностью решает поставленную задачу.
Фискальные регистраторы Атол позволяют настраивать шаблоны печати с помощью специальной утилиты «Редактор шаблонов». В настройках ККТ можно задать так называемые "клише" — статические текстовые блоки для шапки и подвала чека. Этот способ хорошо подходит для печати постоянной информации (реклама, контакты), но его возможности для вывода динамических данных, рассчитанных в 1С (как "Сумма без скидки"), сильно ограничены или требуют сложной настройки по передаче специальных тегов.
Часто возникает желание переименовать стандартные поля, например, "СКИДКА" на "СКИДКА ПО ПОЗИЦИИ". Важно понимать, что название этого поля является фискальным реквизитом, и оно "зашито" в прошивку ККТ. Передать другое название через XML из 1С (например, изменив атрибут DiscountAmount) невозможно.
Единственный способ изменить это наименование — отредактировать шаблон печати непосредственно в самом фискальном регистраторе с помощью утилиты от производителя, если прошивка и редактор шаблонов предоставляют такую возможность для данного поля.