Как выделить жирным шрифтом и увеличить текст в чеке 1С:Розница на принтерах Xprinter и ESC/POS

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

При работе с торговым оборудованием в 1С:Розница часто возникает необходимость кастомизации внешнего вида чека. Одной из самых популярных задач является выделение итоговой суммы: чтобы покупатель сразу видел главную информацию, строку "ИТОГ" делают жирной или увеличивают в размере. Однако при попытке реализовать это через программный код программисты часто сталкиваются с техническими трудностями, такими как ошибки XML-парсинга.

В этой статье мы подробно разберем, почему стандартные ESC-последовательности могут не работать, проанализируем причины возникновения ошибок и рассмотрим несколько способов реализации форматирования текста чека — от правки кода до штатных настроек программы.

Почему прямая вставка ESC-кодов вызывает ошибку

Рассмотрим стандартный подход, который часто пытаются применить разработчики. В языке управления принтерами ESC/POS для включения жирного шрифта используется последовательность ESC E 1. В коде 1С это может выглядеть так:


ВклЖирнШрифт = Символ(27) + "E" + Символ(1);
ВыклЖирнШрифт = Символ(27) + "E" + Символ(0);
Текст = Текст + ВклЖирнШрифт + "ИТОГ: " + Формат(СуммаЧека, "ЧДЦ=2") + ВыклЖирнШрифт + Символы.ПС;

Проанализируем ситуацию: при выполнении такого кода в современных конфигурациях на базе БПО (Библиотека подключаемого оборудования) система выдает критическую ошибку: "Текст XML содержит недопустимый символ в позиции...". Выясним причину: современные драйверы 1С передают данные на устройство не в виде "сырого" текста, а упаковывают их в XML-пакет. Символ ESC (код 27) является управляющим и, согласно стандарту XML 1.0, запрещен к передаче внутри XML-структуры. Именно поэтому драйвер "спотыкается" при попытке прочитать сформированный пакет данных.

Способ 1. Использование штатного механизма «Шаблоны чеков»

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

  1. Перейдем в раздел Администрирование — Печатные формы, отчеты и обработки — Шаблоны чеков.
  2. Создадим новый шаблон или отредактируем существующий.
  3. В визуальном редакторе найдем строку "Итого".
  4. В правой части окна настроек для выбранной строки установим флаг «Жирный» или выберем «Широкий шрифт» в поле «Шрифт».
  5. Сохраним изменения и назначим этот шаблон для вашей кассы ККМ.

Преимущество этого метода в том, что 1С сама сформирует правильный XML-пакет, который драйвер корректно преобразует в команды принтера, не вызывая ошибок символов.

Способ 2. Использование XML-тегов форматирования в коде

Если специфика задачи требует изменения именно программного кода в функции СформироватьТекстНефискальногоДокумента, нам необходимо использовать теги, которые понимает драйвер 1С. Вместо прямой вставки Символ(27), попробуем обернуть текст в специальные теги форматирования. Разберем пример формирования строки:


// Вместо прямой вставки ESC-кодов используем XML-структуру
СтрокаИтого = "ИТОГ: " + Формат(Сумма, "ЧДЦ=2");
Текст = Текст + "<ОбщиеПараметры><Строка><Текст Шрифт=""2"" Жирный=""Да"">" + СтрокаИтого + "</Текст></Строка></ОбщиеПараметры>" + Символы.ПС;

Важно помнить, что поддержка конкретных тегов зависит от используемого драйвера (например, "1С:Принтер чеков"). Некоторые драйверы поддерживают упрощенную разметку, похожую на HTML:

Текст = Текст + "<b>" + "ИТОГ: " + Сумма + "</b>" + Символы.ПС;

Способ 3. Изменение размера шрифта командами GS !

Если ваш принтер (например, Xprinter XP-N160II) поддерживает расширенный протокол ESC/POS и вы работаете через драйвер, позволяющий прямую передачу команд (в режиме "Текстовый"), можно использовать команду GS ! для изменения размера. Однако, чтобы избежать ошибки XML, эти команды должны передаваться драйверу в обход стандартной XML-сериализации или через специальные Hex-последовательности, если драйвер это поддерживает.

Проанализируем значения для команды Символ(29) + "!" + Символ(n):

Чтобы реализовать это без ошибки XML, убедитесь, что в настройках драйвера 1С включена опция "Использовать служебные команды ESC/POS". В этом случае драйвер может ожидать команды в формате {ESC} или {GS}. Пример вставки в код:


// Пример для драйверов, поддерживающих текстовые подстановки
Текст = Текст + "{GS}!{17}ИТОГ: " + Формат(Сумма, "ЧДЦ=2") + "{GS}!{0}" + Символы.ПС;

Способ 4. Печать через графический режим (Windows Driver)

Если принтер подключен как обычный принтер Windows (через USB-порт и установленный в системе драйвер принтера), можно изменить логику печати. В настройках оборудования выберите тип принтера "Принтер Windows".

В этом случае 1С будет формировать не текстовую строку, а полноценный ТабличныйДокумент. Посмотрим на алгоритм действий:

  1. Найдите макет, по которому печатается нефискальный чек.
  2. В макете выделите ячейку с параметром "Итого".
  3. Установите для этой ячейки шрифт Arial Black, размер 12 или 14 и свойство Жирный.
  4. При печати драйвер Windows преобразует это в графическое изображение и отправит на принтер.

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

Резюме и рекомендации

Проанализировав ситуацию, мы видим, что проблема заключается не в самом принтере Xprinter, а в способе передачи данных через XML-интерфейс 1С. Для решения задачи рекомендуем придерживаться следующего приоритета действий:

  1. Первоочередно: Попробуйте настроить Шаблон чека в пользовательском режиме. Это самый стабильный и обновляемый способ.
  2. Если требуется программный контроль: Используйте XML-теги форматирования (<b>, <font>), которые поддерживает ваш драйвер оборудования.
  3. Для сложных случаев: Переведите принтер в режим работы через Windows Driver и редактируйте макет печатной формы как обычный документ 1С.

Помните, что использование Символ(27) напрямую в строковых переменных при формировании XML-пакета неизбежно приведет к ошибке. Всегда проверяйте документацию к конкретной версии драйвера БПО, который вы используете в вашей информационной базе.

← На главную