С переходом на онлайн-кассы (ФЗ-54) формат взаимодействия 1С с фискальными регистраторами существенно изменился. Если раньше драйверы позволяли отправлять простые текстовые команды, то теперь обмен данными происходит через формирование сложных XML-пакетов. Часто возникает задача вывести в чек дополнительную информацию, например, номер дисконтной карты, баланс бонусов или рекламное сообщение. В этой статье мы разберем, как правильно модифицировать XML-пакет и какие механизмы БПО (Библиотеки подключаемого оборудования) для этого задействовать.
Для начала проанализируем, как онлайн-касса «понимает», что ей нужно напечатать. Вместо набора разрозненных команд 1С формирует один массив данных в формате XML и передает его драйверу. Ключевым элементом здесь является блок Positions, внутри которого описываются товары. Однако в этот же блок можно вставлять и нефискальную информацию.
Рассмотрим структуру тега для вывода текста. Ошибка многих разработчиков заключается в неправильной вложенности тегов. Правильный формат для текстовой строки выглядит так:
<Positions>
<TextString Text="Карта: 0000000000001" />
</Positions>
Важно помнить, что тег TextString является самозакрывающимся или должен иметь четкую структуру атрибутов. Атрибут Text содержит саму строку, которую вы хотите увидеть на бумаге. Также можно использовать атрибуты Font (номер шрифта) и Intensity (яркость), если это поддерживает ваш драйвер ККТ.
В современных конфигурациях, таких как 1С:Розница, Управление торговлей 11 или ERP, вся работа с кассой сосредоточена в модулях БПО. Процесс формирования чека проходит через несколько этапов. Разберем по шагам, где именно нужно внедрить свой код.
Основная логика подготовки данных находится в функции ПодключаемоеОборудованиеУниверсальныйДрайверКлиент.ФискализацияЧека. Внутри этой функции вызывается серверный метод для генерации XML. Для доработки нам потребуется найти место, где вызывается:
ДанныеЧека = МенеджерОборудованияВызовСервера.ПолучитьXMLПакетДляФискализацияЧека(ОбщиеПараметры, ШаблонЧека, СуммаЧека, ШиринаСтроки, НовыйФормат);
Чтобы добавить свои данные, не рекомендуется править типовой код напрямую. Лучше всего использовать механизм расширений. Рассмотрим пример того, как можно дополнить таблицу позиций чека перед тем, как она превратится в XML.
Пример кода для добавления текстовой строки в массив позиций:
НоваяСтрока = ТаблицаПозиций.Добавить();
НоваяСтрока.Наименование = "Дисконтная карта: " + НомерКарты;
НоваяСтрока.ТипПозиции = 1; // Указывает драйверу, что это текстовая информация
НоваяСтрока.Количество = 0;
НоваяСтрока.Цена = 0;
Если ваша задача — напечатать QR-код (например, ссылку на личный кабинет или акцию), структура XML будет отличаться. Вместо TextString используется тег Barcode. Проанализируем пример такого блока:
<Barcode Value="https://mysite.ru/promo" Type="QR" />
Здесь атрибут Value — это данные для кодирования, а Type — тип кода (EAN13, Code128, QR). Обратите внимание, что не все бюджетные модели фискальных регистраторов поддерживают печать произвольных QR-кодов внутри фискального документа. Если драйвер выдает ошибку, проанализируем альтернативный вариант — печать нефискального документа.
Иногда требования ФФД (формата фискальных данных) или ограничения конкретной модели ККТ не позволяют внедрить текст прямо в тело чека. В этом случае выясним, как напечатать второй «маркетинговый» чек сразу после основного. Для этого в 1С предусмотрен метод НапечататьТекстовыйДокумент.
Логика работы будет следующей:
ФискализироватьЧек.Это гарантирует, что основная фискальная часть будет принята налоговой без ошибок, а покупатель получит всю необходимую дополнительную информацию на отдельном отрезке ленты.
Процесс отладки работы с ККТ осложняется тем, что при остановке на точке останова драйвер может разорвать соединение по таймауту, что приводит к зависанию сессии 1С. Выясним, как этого избежать:
Во-первых, используйте «Эмулятор ККТ». Это встроенный в 1С драйвер, который не требует реального аппарата. Он выводит сформированный XML в текстовое окно, что позволяет проверить структуру тегов TextString и Positions без порчи бумаги.
Во-вторых, следите за шириной строки. Если ваша строка текста (например, «Спасибо за покупку, ждем вас снова!») превышает ширину ленты (32, 40 или 48 символов), драйвер может либо обрезать её, либо аварийно завершить печать всего чека. Проанализируем ширину ленты в настройках оборудования перед отправкой данных.
В-третьих, учитывайте версию ФФД. При использовании ФФД 1.05 и выше требования к оформлению чека стали строже. Любая нефискальная информация не должна напоминать фискальные реквизиты (суммы, налоги, типы оплаты), чтобы не вводить в заблуждение покупателя и контролирующие органы.
Прежде чем приступать к сложному программированию, рассмотрим встроенный функционал «Шаблоны чеков ККМ». В 1С:Розница реализован визуальный редактор шаблонов. Он позволяет:
Если стандартных полей шаблона недостаточно, можно воспользоваться механизмом «Дополнительные печатные формы» или расширить схему компоновки данных, которую использует шаблон чека. Это более «чистый» способ доработки, который сохранит обновляемость вашей конфигурации.