Почему возникает большой интервал при печати этикеток на Xprinter из 1С и как это исправить?

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

При подключении термопринтеров (в частности, популярных моделей Xprinter XP-365B, XP-380 и аналогов) к 1С часто возникает проблема: из фирменной утилиты или Excel печать идет корректно, а при печати из 1С между этикетками появляется большой пустой интервал, или изображение «уползает» вниз. Рассмотрим детально причины этого явления и способы решения, объединив опыт сообщества и технические особенности оборудования.

Причина 1: Некорректные настройки Табличного документа в 1С

Чаще всего проблема кроется в том, как платформа 1С формирует задание на печать. Если размеры макета или настройки полей не соответствуют физическому размеру этикетки, принтер может воспринимать одну этикетку как две страницы или добавлять автоматические отступы.

Разберем основные свойства объекта ТабличныйДокумент, которые необходимо контролировать программно перед отправкой на печать:

  1. Автомасштаб. Свойство АвтоМасштаб часто пытается «вписать» макет в ширину страницы драйвера, что может приводить к искажениям. Для этикеток рекомендуется его отключать, как и при печати книжкой.
  2. Поля. По умолчанию у табличного документа могут быть выставлены поля (например, по 10 мм), которые сдвигают контент. Их нужно принудительно обнулять.
  3. Размер страницы. Желательно явно указывать имя размера бумаги или задавать его параметры (поможет генерация QR и штрихкодов без лишних шрифтов).

Посмотрим на пример кода настройки табличного документа:


// ТабДок - это наш сформированный табличный документ с этикеткой
ТабДок.АвтоМасштаб = Ложь;
ТабДок.МасштабПечати = 100; // Строго 100%
ТабДок.ПолеСлева = 0;
ТабДок.ПолеСправа = 0;
ТабДок.ПолеСверх = 0;
ТабДок.ПолеСнизу = 0;
ТабДок.ПолеСверху = 0; // Для надежности обнуляем все варианты
ТабДок.РазмерСтраницы = "Custom"; // Или имя бумаги, созданное в драйвере
// Если драйвер поддерживает, можно задать размеры программно (в мм)
// ТабДок.ВысотаСтраницы = 40; 
// ТабДок.ШиринаСтраницы = 58;
ТабДок.ЧерноБелаяПечать = Истина; // Улучшает четкость штрихкодов

Важно убедиться, что сам макет в конфигураторе (области печати) физически влезает в размер этикетки. Например, если этикетка 40 мм по высоте, а макет имеет высоту 41 мм, 1С разобьет его на две страницы, и принтер пропустит пустую этикетку.

Причина 2: Драйверы и «непечатаемая область»

Стандартные драйверы, идущие в комплекте с китайскими принтерами, часто имеют скрытую настройку «Unprintable Area» (непечатаемая область), которая составляет 2–5 мм по краям. Даже если вы выставили в драйвере размер бумаги 58х40, драйвер сообщает 1С, что полезная область меньше (например, 54х36). 1С видит, что макет не влезает, и начинает переносить данные.

Решение:

  1. В настройках принтера Windows создайте пользовательский размер бумаги, а для тестирования макета используйте отладку внешних обработок.
  2. В параметрах этого размера убедитесь, что все отступы (Left, Right, Top, Bottom) установлены в 0.
  3. Если стандартный драйвер работает некорректно, рекомендуется установить драйверы от Seagull Scientific (BarTender). Они корректнее работают с 1С и позволяют точно управлять зазорами и отрезкой.

Также стоит проверить наличие проблемы EasyPrint, если печать идет через удаленный рабочий стол (RDP). Драйвер EasyPrint часто подменяет размер бумаги на А4, что приводит к огромным пропускам ленты. В этом случае необходимо отключить использование EasyPrint в групповых политиках и установить «родные» драйверы на сервере и клиенте.

Причина 3: Аппаратная калибровка

Иногда принтер «забывает» размер этикетки. Простая процедура калибровки датчика зазора часто решает проблему «убегания» печати.

Как выполнить калибровку:

  1. Выключите принтер.
  2. Зажмите кнопку Pause (или Feed, зависит от модели, обычно это единственная или верхняя кнопка).
  3. Включите принтер, не отпуская кнопку.
  4. Держите кнопку, пока принтер не начнет печать и не помигает индикаторами (обычно через 3-5 секунд).
  5. Принтер прогонит несколько этикеток, измеряя их высоту, и запомнит параметры.

Альтернативное решение: Прямая печать команд (Raw print)

Если добиться корректной печати через стандартный графический вывод (макет 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 """ + ИмяВремФайл + """ \\ИмяКомпьютера\ИмяРасшаренногоПринтера");

УдалитьФайлы(ИмяВремФайл);

Этот метод сложнее в реализации, так как требует верстки этикетки на специальном языке команд, но он гарантирует идеальное попадание в размер этикетки и высокую скорость печати.

← На главную