При автоматизации розничной торговли часто возникает задача вывода на чековую ленту различной нефискальной информации. Это могут быть рекламные предложения, условия текущих акций, баланс бонусных баллов покупателя, купоны на скидку или просто приветственный текст с логотипом компании. Главная трудность, с которой сталкиваются разработчики и администраторы при внедрении этой задачи, — сохранение читаемости и красивой разметки текста. На разных моделях ККТ (контрольно-кассовой техники) ширина ленты отличается, шрифты ведут себя непредсказуемо, а ручные отступы пробелами часто приводят к тому, что текст «сползает» или обрезается.
В этой статье мы подробно разберем, как устроены механизмы печати на ККМ в среде «1С:Предприятие», проанализируем ограничения типовых конфигураций и рассмотрим практические методы верстки нефискальных документов, гарантирующие идеальный результат на любых кассовых аппаратах.
Прежде чем приступать к разработке макета, давайте выясним техническую причину деформации текста. Физическая чековая лента имеет фиксированную ширину, которая измеряется не в пикселях и не в сантиметрах, а в количестве символов в одной строке при определенном размере шрифта. Наиболее популярные стандарты ленты:
Если в макете 1С заложена строка длиной 40 символов, а печать происходит на узкой ленте 57 мм (где максимальная емкость строки составляет 32 символа), принтер ККТ автоматически перенесет оставшиеся 8 символов на следующую строчку. В итоге вся табличная верстка и центрирование смещаются, делая чек нечитаемым.
Кроме того, в старых конфигурациях (например, «1С:Розница 2.0») возможности встроенных редакторов шаблонов чеков были сильно урезаны. Они часто используют стандартный моноширинный шрифт и не позволяют динамически рассчитывать ширину области печати. Чтобы решить эту проблему на современном уровне, необходимо использовать Библиотеку подключаемого оборудования (БПО) и возможности XML-форматирования.
В современных конфигурациях 1С на платформе 8.3 (таких как «1С:Розница 3.0», «1С:УНФ 3.0», «1С:Комплексная автоматизация 2.5») встроенный конструктор шаблонов стал гораздо «умнее». Проанализируем, как правильно задействовать его потенциал:
Для передачи данных на кассовый аппарат платформа 1С использует стандартизированные XML-пакеты. Чтобы не заниматься ручным подсчетом пробелов для выравнивания текста по центру или по правому краю, мы можем использовать встроенные атрибуты тегов XML, которые драйвер ККТ отрабатывает на аппаратном уровне.
Рассмотрим структуру XML-кода, передаваемого на принтер ККМ. Вместо простой отправки набора строк мы оборачиваем текст в тег TextString с указанием параметра выравнивания Alignment:
<Receipt>
<TextString Text="АКЦИЯ! СКИДКА 20% НА СЛЕДУЮЩУЮ ПОКУПКУ!" Alignment="Center" />
<TextString Text="Промокод: MARCH2026" Alignment="Center" FontWidth="Double" />
<TextString Text="Период действия: до 31.03.2026" Alignment="Left" />
</Receipt>
Параметр Alignment может принимать следующие значения:
Left — выравнивание текста по левому краю чека;Center — автоматическое центрирование строки силами процессора ККТ с учетом ширины бумаги;Right — выравнивание текста по правому краю.Использование аппаратного выравнивания гарантирует, что независимо от ширины подключенной ленты (57 мм или 80 мм) рекламный слоган всегда окажется строго по центру чека, без необходимости переписывать код программы.
Если печать выполняется напрямую через нативный драйвер ККМ (например, АТОЛ или Штрих-М) в обход стандартных механизмов БПО, программисты используют низкоуровневые команды управления принтером (Escape-последовательности).
Многие современные фискальные регистраторы поддерживают изменение шрифта в рамках одной строки. Например, передача специального управляющего символа с кодом 09h (или определенных HEX-последовательностей во внутренней кодировке принтера) позволяет временно удвоить ширину шрифта для акцентирования внимания покупателя на промокоде или важной информации. Однако помните, что в одной строке принтер обычно может напечатать текст только одного размера, поэтому управляющие коды применяются к строке целиком.
Красивый графический логотип в шапке чека или рекламный баннер в подвале делают документ презентабельным. Но прямая отправка тяжелых картинок из 1С в процессе пробития чека — это плохая практика. Передача растрового изображения по протоколам связи (особенно если кассиры работают в терминальном режиме через RDP) может вызвать задержку печати чека до 5-10 секунд, что недопустимо при высоком потоке покупателей.
Разберем по шагам наиболее эффективный алгоритм интеграции графики:
<Barcode Type="QR" Value="https://site.ru/promo" />. Кассовый аппарат сгенерирует QR-код аппаратно за доли секунды, обеспечивая максимальную четкость печати для легкого считывания смартфонами покупателей.Что делать, если вам нужно формировать динамический рекламный текст, зависящий от состава корзины покупателя (например, если клиент купил кофе, напечатать купон на пончик)? В этом случае стандартного пользовательского конструктора шаблонов будет недостаточно, и потребуется программная доработка.
Для сохранения конфигурации на поддержке настоятельно рекомендуется реализовать эту логику через Расширение конфигурации. Нам потребуется перехватить формирование XML-пакета чека перед его отправкой на фискальный регистратор.
Рассмотрим пример реализации в общем модуле расширения, где мы модифицируем стандартный XML-пакет БПО:
&После("ПолучитьXMLПакетДляФискализацииЧека")
Процедура Расш_ПолучитьXMLПакетДляФискализацииЧека(ПараметрыЧека, XMLПакет, Результат)
// Проверим, успешно ли сформирован базовый пакет системой
Если ПустаяСтрока(XMLПакет) Тогда
Возврат;
КонецЕсли;
// Создаем объект для чтения XML-структуры чека
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(XMLПакет);
// Создаем объект для записи модифицированного XML
ЗаписьXML = Новый ЗаписьXML;
ПараметрыЗаписи = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Ложь);
ЗаписьXML.УстановитьСтроку(ПараметрыЗаписи);
Пока ЧтениеXML.Прочитать() Цикл
// Копируем существующие узлы чека в новый пакет
ЗаписьXML.ЗаписатьТекущий(ЧтениеXML);
// Находим закрывающий тег фискального чека, чтобы добавить рекламу в нефискальный блок
Если ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента И ЧтениеXML.Имя = "Receipt" Тогда
// Начинаем вывод нефискальной рекламной секции
ЗаписьXML.ЗаписатьНачалоЭлемента("TextString");
ЗаписьXML.ЗаписатьАтрибут("Text", "========================================");
ЗаписьXML.ЗаписатьАтрибут("Alignment", "Center");
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьНачалоЭлемента("TextString");
ЗаписьXML.ЗаписатьАтрибут("Text", "СПАСИБО ЗА ПОКУПКУ!");
ЗаписьXML.ЗаписатьАтрибут("Alignment", "Center");
ЗаписьXML.ЗаписатьКонецЭлемента();
// Динамически анализируем сумму чека для персонального предложения
Если ПараметрыЧека.СуммаДокумента > 1000 Тогда
ЗаписьXML.ЗаписатьНачалоЭлемента("TextString");
ЗаписьXML.ЗаписатьАтрибут("Text", "Вам начислен купон на скидку 10%!");
ЗаписьXML.ЗаписатьАтрибут("Alignment", "Center");
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьНачалоЭлемента("Barcode");
ЗаписьXML.ЗаписатьАтрибут("Type", "QR");
ЗаписьXML.ЗаписатьАтрибут("Value", "https://site.ru/coupon/gift10");
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЕсли;
ЗаписьXML.ЗаписатьНачалоЭлемента("TextString");
ЗаписьXML.ЗаписатьАтрибут("Text", "========================================");
ЗаписьXML.ЗаписатьАтрибут("Alignment", "Center");
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЕсли;
КонецЦикла;
// Перезаписываем выходной параметр модифицированным XML-пакетом
XMLПакет = ЗаписьXML.Закрыть();
КонецПроцедуры
Проанализировав представленный код, мы видим, что перехват происходит на уровне формирования пакета БПО. Это безопасный способ, который гарантирует корректность фискальных данных, так как мы дополняем чек исключительно информационными тегами в самом конце документа.
Подведем итоги. Чтобы разметка рекламного текста на чеках ККМ никогда не плыла, придерживайтесь следующих правил:
Alignment="Center" в XML-пакетах.