При подключении термопринтеров (в частности, популярных моделей Xprinter XP-365B, XP-380 и аналогов) к 1С часто возникает проблема: из фирменной утилиты или Excel печать идет корректно, а при печати из 1С между этикетками появляется большой пустой интервал, или изображение «уползает» вниз. Рассмотрим детально причины этого явления и способы решения, объединив опыт сообщества и технические особенности оборудования.
Чаще всего проблема кроется в том, как платформа 1С формирует задание на печать. Если размеры макета или настройки полей не соответствуют физическому размеру этикетки, принтер может воспринимать одну этикетку как две страницы или добавлять автоматические отступы.
Разберем основные свойства объекта ТабличныйДокумент, которые необходимо контролировать программно перед отправкой на печать:
АвтоМасштаб часто пытается «вписать» макет в ширину страницы драйвера, что может приводить к искажениям. Для этикеток рекомендуется его отключать, как и при печати книжкой.Посмотрим на пример кода настройки табличного документа:
// ТабДок - это наш сформированный табличный документ с этикеткой
ТабДок.АвтоМасштаб = Ложь;
ТабДок.МасштабПечати = 100; // Строго 100%
ТабДок.ПолеСлева = 0;
ТабДок.ПолеСправа = 0;
ТабДок.ПолеСверх = 0;
ТабДок.ПолеСнизу = 0;
ТабДок.ПолеСверху = 0; // Для надежности обнуляем все варианты
ТабДок.РазмерСтраницы = "Custom"; // Или имя бумаги, созданное в драйвере
// Если драйвер поддерживает, можно задать размеры программно (в мм)
// ТабДок.ВысотаСтраницы = 40;
// ТабДок.ШиринаСтраницы = 58;
ТабДок.ЧерноБелаяПечать = Истина; // Улучшает четкость штрихкодов
Важно убедиться, что сам макет в конфигураторе (области печати) физически влезает в размер этикетки. Например, если этикетка 40 мм по высоте, а макет имеет высоту 41 мм, 1С разобьет его на две страницы, и принтер пропустит пустую этикетку.
Стандартные драйверы, идущие в комплекте с китайскими принтерами, часто имеют скрытую настройку «Unprintable Area» (непечатаемая область), которая составляет 2–5 мм по краям. Даже если вы выставили в драйвере размер бумаги 58х40, драйвер сообщает 1С, что полезная область меньше (например, 54х36). 1С видит, что макет не влезает, и начинает переносить данные.
Решение:
Также стоит проверить наличие проблемы EasyPrint, если печать идет через удаленный рабочий стол (RDP). Драйвер EasyPrint часто подменяет размер бумаги на А4, что приводит к огромным пропускам ленты. В этом случае необходимо отключить использование EasyPrint в групповых политиках и установить «родные» драйверы на сервере и клиенте.
Иногда принтер «забывает» размер этикетки. Простая процедура калибровки датчика зазора часто решает проблему «убегания» печати.
Как выполнить калибровку:
Если добиться корректной печати через стандартный графический вывод (макет 1С) не удается, можно использовать прямую отправку команд на принтер. Это самый надежный способ, так как он минует драйвер Windows и его настройки полей. Принтер получает четкие инструкции: «напечатать текст тут», «штрихкод здесь».
Для принтеров Xprinter обычно используется язык TSPL (эмуляция TSC), но некоторые модели поддерживают и ZPL (Zebra). Перед использованием команд уточните, какой язык поддерживает ваша прошивка (часто это переключается джамперами на дне принтера).
Рассмотрим пример кода для отправки задания напрямую в порт принтера. Этот метод требует, чтобы принтер был доступен по сети или «расшарен» (общий доступ) локально.
// Пример шаблона на языке ZPL (для Zebra или эмуляции)
// ВАЖНО: Для Xprinter чаще нужен синтаксис TSPL
Шаблон ="
|v^XA
|^FO40,23
|^BXN,6,200,26,26
|^FD%ШтрихКод1%^FS
|^CF0,130
|^FO200,40^FD%Номер1%^FS
|^XZ";
// Подставляем данные
Этикетка = СтрЗаменить(Шаблон,"%ШтрихКод1%", "123456789");
Этикетка = СтрЗаменить(Этикетка,"%Номер1%", "Товар-1");
// Сохраняем команды во временный файл
ИмяВремФайл = ПолучитьИмяВременногоФайла("prn");
ЗаписьТекста = Новый ЗаписьТекста(ИмяВремФайл, "UTF-8"); // Иногда требуется ANSI
ЗаписьТекста.Записать(Этикетка);
ЗаписьТекста.Закрыть();
// Отправка на принтер
// Вариант 1: Если принтер сетевой
Соединение = Новый FTPСоединение("192.168.1.100", 9100, , , , Истина, 20);
Соединение.Записать(ИмяВремФайл, "");
// Вариант 2: Если принтер локальный (USB), его нужно расшарить в Windows
// и отправить файл командой copy через командную строку
КомандаСистемы("copy /b """ + ИмяВремФайл + """ \\ИмяКомпьютера\ИмяРасшаренногоПринтера");
УдалитьФайлы(ИмяВремФайл);
Этот метод сложнее в реализации, так как требует верстки этикетки на специальном языке команд, но он гарантирует идеальное попадание в размер этикетки и высокую скорость печати.