При подключении недорогих китайских термопринтеров (например, популярной линейки Xprinter XP-Q200II, XP-58, XP-365B и др.) к решениям на платформе 1С:Предприятие пользователи часто сталкиваются с неприятной проблемой: вместо понятного русского текста на чеке печатаются китайские иероглифы, знаки вопроса или нечитаемые символы («кракозябры»).
В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем внутренние механизмы кодирования принтеров и пошагово настроим устройство для корректного вывода кириллицы. Мы рассмотрим как аппаратные методы настройки через специализированные утилиты, так и способы прямого программного управления кодировкой из кода 1С.
Давайте разберем по шагам, как заставить ваш принтер разговаривать на русском языке.
Выясним причину проблемы. По умолчанию большинство китайских принтеров поставляются с завода настроенными на внутренний азиатский рынок. В их прошивке активирован двухбайтовый режим кодирования (Double-byte mode) для поддержки китайских иероглифов (кодировка GBK/BIG5). Когда программа 1С отправляет на принтер текстовые данные в однобайтовой кодировке Windows-1251 или DOS (CP866), принтер пытается интерпретировать каждые два байта как один китайский иероглиф. В результате на чековой ленте появляется восточная письменность.
Чтобы решить эту проблему, нам необходимо перевести принтер в однобайтовый режим работы (Single-byte mode) и указать ему правильную кодовую страницу, содержащую символы кириллицы.
Рассмотрим подробнее четыре основных способа устранения этой проблемы в зависимости от модели вашего устройства и специфики интеграции с 1С.
Большинство современных моделей Xprinter не имеют физических DIP-переключателей на корпусе. Вся настройка выполняется программно через заводскую утилиту Xprinter Test (также известную как Printer_Test.exe). Скачать её можно с официального сайта производителя.
Разберем по шагам правильный алгоритм работы с утилитой, так как простое нажатие кнопок часто не дает результата из-за специфики записи параметров в энергонезависимую память устройства:
Printer_Test.exe. Если интерфейс открылся на китайском языке, найдите в верхнем или правом углу кнопку English и переключите языковую локализацию.1F 1B 1F FE 01
Нажмите кнопку Print (или Send). Принтер при этом не должен ничего печатать, но может издать короткий писк.1F 1B 1F FE 11
Снова нажмите кнопку Print. Это зафиксирует отключение китайского режима.Если в вашей работе используется гибридный принтер (например, серии Xprinter XP-365B или XP-370B), проблема с иероглифами может быть вызвана тем, что устройство функционирует в неверном режиме печати.
Такие принтеры поддерживают два протокола работы:
Если принтер находится в режиме этикеток, он игнорирует стандартные команды смены кодовых страниц ESC/POS, отправляемые из 1С:Розница или утилиты XP-Test, и выводит иероглифы. Переключим режим аппаратно:
Emulation: ESC/POS или Emulation: TSPL).Если вы разрабатываете собственную систему печати чеков или кастомизируете существующую конфигурацию 1С, и данные отправляются напрямую в порт принтера (например, через COM, LPT или виртуальный USB-порт как RAW-данные), принтер берет шрифты из своего внутреннего ПЗУ. Чтобы текст на чеке не превратился в иероглифы, мы должны передать принтеру управляющие команды непосредственно перед отправкой самого текста.
Проанализируем пример кода на встроенном языке 1С. Для того чтобы принтер понял русский текст, мы должны инициализировать его, принудительно переключить кодовую страницу на кириллицу (например, страницу 17 - CP866) и перекодировать отправляемую строку в формат DOS (CP866).
Посмотрим на пример реализации такой процедуры:
Процедура НапечататьЧекНаXprinter()
// Определяем имя порта, к которому подключен принтер (например, COM3 или LPT1)
ИмяПорта = "COM3";
// Создаем объект для записи данных в порт
ЗаписьПорта = Новый ЗаписьТекста;
Попытка
// Открываем порт. Важно указать кодировку OEM (CP866) для корректной передачи кириллицы
ЗаписьПорта.Открыть(ИмяПорта, КодировкаТекста.OEM);
Исключение
Предупреждение("Не удалось открыть порт принтера: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Формируем управляющие ESC/POS команды в виде символов по их ASCII-кодам
// 1. Инициализация принтера: ESC @ (HEX: 1B 40, DEC: 27 64)
КомандаИнициализации = Символ(27) + Символ(64);
// 2. Выбор таблицы символов кириллицы (CP866): ESC t n (HEX: 1B 74 n)
// Где n = 17 (DEC: 17) для выбора Page17
КомандаВыбораКодировки = Символ(27) + Символ(116) + Символ(17);
// Отправляем управляющие команды на принтер
ЗаписьПорта.Записать(КомандаИнициализации);
ЗаписьПорта.Записать(КомандаВыбораКодировки);
// Формируем тело чека
ЗаписьПорта.ЗаписатьСтроку("ДОБРО ПОЖАЛОВАТЬ!");
ЗаписьПорта.ЗаписатьСтроку("ООО 'Наша Торговая Компания'");
ЗаписьПорта.ЗаписатьСтроку("--------------------------------");
ЗаписьПорта.ЗаписатьСтроку("Товар 1: 100.00 руб.");
ЗаписьПорта.ЗаписатьСтроку("Товар 2: 250.50 руб.");
ЗаписьПорта.ЗаписатьСтроку("--------------------------------");
ЗаписьПорта.ЗаписатьСтроку("ИТОГО: 350.50 руб.");
ЗаписьПорта.ЗаписатьСтроку("СПАСИБО ЗА ПОКУПКУ!");
// Команда частичной отрезки бумаги (если поддерживается принтером)
// GS V m (HEX: 1D 56 00, DEC: 29 86 0)
КомандаОтрезки = Символ(29) + Символ(86) + Символ(0);
ЗаписьПорта.Записать(КомандаОтрезки);
// Закрываем порт, завершая передачу данных
ЗаписьПорта.Закрыть();
КонецПроцедуры
В данном примере использование объекта ЗаписьТекста с параметром КодировкаТекста.OEM гарантирует, что 1С автоматически преобразует строки из внутреннего формата UTF-16 в однобайтовую кодировку CP866. Команда Символ(27) + Символ(116) + Символ(17) указывает принтеру искать символы именно в 17-й кодовой таблице своей памяти.
Некоторые специализированные принтеры этикеток Xprinter работают по протоколам EPL или ZPL и не поддерживают стандартный набор команд ESC/POS. В таких устройствах кириллические шрифты могут полностью отсутствовать на аппаратном уровне. В этом случае смена кодовых страниц не поможет — принтер просто не знает, как рисовать русские буквы.
Решить эту проблему можно путем прямой загрузки файла кириллического шрифта в FLASH-память принтера:
.ttf (например, Arial или Courier New из папки C:\Windows\Fonts), поддерживающий русский язык.^CI28. Пример ZPL-кода для отправки на принтер:
^XA
^CI28
^CWQ,E:ARI_CYR.TTF
^FO50,50^A0N,36,20^FDРусский текст на этикетке^FS
^XZ
Многие владельцы принтеров Xprinter жалуются на очень громкий и неприятный звуковой сигнал (писк), который принтер издает при завершении печати каждого чека. Это сильно утомляет кассиров и раздражает покупателей. Отключить или вернуть этот звук можно программно с помощью HEX-команд в той же утилите Xprinter Test:
1F 1B 1F 00 00 01 9E 01 и нажмите кнопку Print. Принтер применит настройки и больше не будет пищать при печати.1F 1B 1F 00 00 01 9E 02 и отправьте её на устройство.Используя приведенные инструкции, вы сможете быстро локализовать принтер чеков Xprinter, настроить корректный вывод чеков без иероглифов в любой конфигурации 1С и повысить комфорт работы ваших сотрудников.