Как настроить печать произвольного текста и рекламы на ККМ в 1С и избежать смещения разметки?

Программист 1С v8.3 (Управляемые формы) Торговля и дистрибуция
← На главную

При автоматизации розничной торговли часто возникает задача вывода на чековую ленту различной нефискальной информации. Это могут быть рекламные предложения, условия текущих акций, баланс бонусных баллов покупателя, купоны на скидку или просто приветственный текст с логотипом компании. Главная трудность, с которой сталкиваются разработчики и администраторы при внедрении этой задачи, — сохранение читаемости и красивой разметки текста. На разных моделях ККТ (контрольно-кассовой техники) ширина ленты отличается, шрифты ведут себя непредсказуемо, а ручные отступы пробелами часто приводят к тому, что текст «сползает» или обрезается.

В этой статье мы подробно разберем, как устроены механизмы печати на ККМ в среде «1С:Предприятие», проанализируем ограничения типовых конфигураций и рассмотрим практические методы верстки нефискальных документов, гарантирующие идеальный результат на любых кассовых аппаратах.

Понимание ограничений ККТ: почему «плывет» разметка?

Прежде чем приступать к разработке макета, давайте выясним техническую причину деформации текста. Физическая чековая лента имеет фиксированную ширину, которая измеряется не в пикселях и не в сантиметрах, а в количестве символов в одной строке при определенном размере шрифта. Наиболее популярные стандарты ленты:

Если в макете 1С заложена строка длиной 40 символов, а печать происходит на узкой ленте 57 мм (где максимальная емкость строки составляет 32 символа), принтер ККТ автоматически перенесет оставшиеся 8 символов на следующую строчку. В итоге вся табличная верстка и центрирование смещаются, делая чек нечитаемым.

Кроме того, в старых конфигурациях (например, «1С:Розница 2.0») возможности встроенных редакторов шаблонов чеков были сильно урезаны. Они часто используют стандартный моноширинный шрифт и не позволяют динамически рассчитывать ширину области печати. Чтобы решить эту проблему на современном уровне, необходимо использовать Библиотеку подключаемого оборудования (БПО) и возможности XML-форматирования.

Использование современного конструктора шаблонов БПО

В современных конфигурациях 1С на платформе 8.3 (таких как «1С:Розница 3.0», «1С:УНФ 3.0», «1С:Комплексная автоматизация 2.5») встроенный конструктор шаблонов стал гораздо «умнее». Проанализируем, как правильно задействовать его потенциал:

  1. Интеграция нефискальных блоков. Современная БПО позволяет разделять фискальную часть чека и дополнительную информацию. Вы можете создавать отдельные нефискальные блоки (например, рекламные купоны), которые будут отправляться на принтер сразу после закрытия основного фискального чека.
  2. Автоматический опрос оборудования. При создании или редактировании шаблона система обращается к установленному драйверу ККТ и запрашивает физические параметры подключенной модели. В окне предпросмотра редактора появляются визуальные границы (пунктирные линии), соответствующие реальной ширине ленты. Разработчик сразу видит, помещается ли текст в отведенные рамки.

Управление разметкой через XML-пакеты (CheckPackage)

Для передачи данных на кассовый аппарат платформа 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 может принимать следующие значения:

Использование аппаратного выравнивания гарантирует, что независимо от ширины подключенной ленты (57 мм или 80 мм) рекламный слоган всегда окажется строго по центру чека, без необходимости переписывать код программы.

Использование управляющих ESC-последовательностей

Если печать выполняется напрямую через нативный драйвер ККМ (например, АТОЛ или Штрих-М) в обход стандартных механизмов БПО, программисты используют низкоуровневые команды управления принтером (Escape-последовательности).

Многие современные фискальные регистраторы поддерживают изменение шрифта в рамках одной строки. Например, передача специального управляющего символа с кодом 09h (или определенных HEX-последовательностей во внутренней кодировке принтера) позволяет временно удвоить ширину шрифта для акцентирования внимания покупателя на промокоде или важной информации. Однако помните, что в одной строке принтер обычно может напечатать текст только одного размера, поэтому управляющие коды применяются к строке целиком.

Печать графических элементов и логотипов

Красивый графический логотип в шапке чека или рекламный баннер в подвале делают документ презентабельным. Но прямая отправка тяжелых картинок из 1С в процессе пробития чека — это плохая практика. Передача растрового изображения по протоколам связи (особенно если кассиры работают в терминальном режиме через RDP) может вызвать задержку печати чека до 5-10 секунд, что недопустимо при высоком потоке покупателей.

Разберем по шагам наиболее эффективный алгоритм интеграции графики:

  1. Подготовка изображения. Создайте черно-белый логотип (1-битный рисунок в формате BMP). Размер картинки должен соответствовать разрешению печатающей термоголовки кассы (для ленты 57 мм оптимальная ширина картинки составляет до 384 пикселей, для 80 мм — до 576 пикселей).
  2. Запись в энергонезависимую память ККТ. Используйте сервисную утилиту производителя кассы (например, «Тест драйвера ККТ АТОЛ» или «Тест драйвера Штрих-М»). Зайдите в раздел программирования и загрузите картинку в память устройства под определенным индексом (например, Логотип №1).
  3. Настройка клише ККТ. В таблицах настроек ККТ укажите, что при открытии или закрытии каждого документа (чека) принтер должен автоматически выводить из своей внутренней памяти картинку №1. При таком подходе 1С вообще не тратит время на передачу графики по сети, а печать происходит мгновенно.
  4. Использование QR-кодов. Если ваша цель — напечатать ссылку на сайт или скидочный купон, не генерируйте QR-код как картинку в 1С. Передавайте в ККТ специальный XML-тег <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.Закрыть();
    
КонецПроцедуры

Проанализировав представленный код, мы видим, что перехват происходит на уровне формирования пакета БПО. Это безопасный способ, который гарантирует корректность фискальных данных, так как мы дополняем чек исключительно информационными тегами в самом конце документа.

Резюме и чек-лист для разработчика

Подведем итоги. Чтобы разметка рекламного текста на чеках ККМ никогда не плыла, придерживайтесь следующих правил:

← На главную