При работе с торговым оборудованием в 1С:Розница часто возникает необходимость кастомизации внешнего вида чека. Одной из самых популярных задач является выделение итоговой суммы: чтобы покупатель сразу видел главную информацию, строку "ИТОГ" делают жирной или увеличивают в размере. Однако при попытке реализовать это через программный код программисты часто сталкиваются с техническими трудностями, такими как ошибки XML-парсинга.
В этой статье мы подробно разберем, почему стандартные 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С сама сформирует правильный XML-пакет, который драйвер корректно преобразует в команды принтера, не вызывая ошибок символов.
Если специфика задачи требует изменения именно программного кода в функции СформироватьТекстНефискальногоДокумента, нам необходимо использовать теги, которые понимает драйвер 1С. Вместо прямой вставки Символ(27), попробуем обернуть текст в специальные теги форматирования. Разберем пример формирования строки:
// Вместо прямой вставки ESC-кодов используем XML-структуру
СтрокаИтого = "ИТОГ: " + Формат(Сумма, "ЧДЦ=2");
Текст = Текст + "<ОбщиеПараметры><Строка><Текст Шрифт=""2"" Жирный=""Да"">" + СтрокаИтого + "</Текст></Строка></ОбщиеПараметры>" + Символы.ПС;
Важно помнить, что поддержка конкретных тегов зависит от используемого драйвера (например, "1С:Принтер чеков"). Некоторые драйверы поддерживают упрощенную разметку, похожую на HTML:
Текст = Текст + "<b>" + "ИТОГ: " + Сумма + "</b>" + Символы.ПС;
Если ваш принтер (например, Xprinter XP-N160II) поддерживает расширенный протокол ESC/POS и вы работаете через драйвер, позволяющий прямую передачу команд (в режиме "Текстовый"), можно использовать команду GS ! для изменения размера. Однако, чтобы избежать ошибки XML, эти команды должны передаваться драйверу в обход стандартной XML-сериализации или через специальные Hex-последовательности, если драйвер это поддерживает.
Проанализируем значения для команды Символ(29) + "!" + Символ(n):
n = 16 (0x10) — двойная высота.n = 32 (0x20) — двойная ширина.n = 48 (0x30) — двойная высота + двойная ширина.Чтобы реализовать это без ошибки XML, убедитесь, что в настройках драйвера 1С включена опция "Использовать служебные команды ESC/POS". В этом случае драйвер может ожидать команды в формате {ESC} или {GS}. Пример вставки в код:
// Пример для драйверов, поддерживающих текстовые подстановки
Текст = Текст + "{GS}!{17}ИТОГ: " + Формат(Сумма, "ЧДЦ=2") + "{GS}!{0}" + Символы.ПС;
Если принтер подключен как обычный принтер Windows (через USB-порт и установленный в системе драйвер принтера), можно изменить логику печати. В настройках оборудования выберите тип принтера "Принтер Windows".
В этом случае 1С будет формировать не текстовую строку, а полноценный ТабличныйДокумент. Посмотрим на алгоритм действий:
Важный нюанс: Печать в графическом режиме происходит медленнее, чем в текстовом, но она гарантирует, что вы получите именно тот шрифт и размер, который задали в макете.
Проанализировав ситуацию, мы видим, что проблема заключается не в самом принтере Xprinter, а в способе передачи данных через XML-интерфейс 1С. Для решения задачи рекомендуем придерживаться следующего приоритета действий:
<b>, <font>), которые поддерживает ваш драйвер оборудования.Помните, что использование Символ(27) напрямую в строковых переменных при формировании XML-пакета неизбежно приведет к ошибке. Всегда проверяйте документацию к конкретной версии драйвера БПО, который вы используете в вашей информационной базе.