Как исправить некорректную печать на принтере этикеток TSC при работе в 1С через Linux (RDP)?

Системный администратор 1С v8.3 (Управляемые формы)
← На главную

При работе в 1С через удаленный рабочий стол (RDP) с использованием операционных систем семейства Linux часто возникает специфическая проблема: этикетки на принтерах (например, TSC-TE210) печатаются некорректно. Это может проявляться в виде «съезжания» текста, печати одной этикетки с последующим прогоном нескольких пустых листов или нарушении масштаба. Рассмотрим подробно причины возникновения этой ситуации и разберем пошаговые методы ее решения.

Анализ причин возникновения проблемы

Проанализируем архитектуру системы. Когда пользователь подключается с Linux к серверу Windows по протоколу RDP (используя Remmina или FreeRDP), подсистема печати CUPS пробрасывает локальный принтер в удаленную сессию. Основной конфликт заключается в том, что сервер не всегда правильно интерпретирует настройки «виртуального» принтера, которые передает Linux-клиент. Выясним основные факторы, влияющие на ошибку:

  1. Несоответствие параметров страницы: Windows-сервер может подставлять стандартный размер (например, Letter или A4) вместо специфического размера этикетки.
  2. Особенности драйверов CUPS: В Linux драйверы этикеточных принтеров часто работают в графическом режиме, что при передаче через RDP-канал приводит к искажениям.
  3. Тип датчика (Sensor Type): Если в настройках указана непрерывная лента вместо меток (Gap), принтер не понимает границ этикетки.
  4. Разница в DPI: Принтер TSC-TE210 работает с разрешением 203 DPI. Если в системе Linux или в настройках проброшенного принтера на сервере установлено иное значение (например, 300 или 600 DPI), масштаб изображения будет нарушен.

Метод 1. Тонкая настройка параметров CUPS в Linux

Прежде всего, проанализируем локальные настройки на стороне Linux-машины. Нам необходимо убедиться, что CUPS (Common Unix Printing System) передает корректные метаданные. Перейдем в веб-интерфейс настройки CUPS (обычно доступен по адресу localhost:631).

Рассмотрим шаги по настройке:

  1. Выберем нужный принтер в разделе Printers и перейдем в меню Set Default Options.
  2. В разделе Media Size установим точный размер этикетки, соответствующий физической ленте (например, 58x40 мм).
  3. В параметрах Media Type выставим значение Label with Gaps. Это критически важно для предотвращения печати пустых этикеток.
  4. Установим Margins (отступы) в значение 0 или None. В Linux-системах «непечатные области», добавленные драйвером, часто суммируются с отступами из 1С, что вызывает смещение.

Метод 2. Настройка проброса через RDP-клиент

Посмотрим на ситуацию со стороны RDP-клиента. При использовании FreeRDP или Remmina, принтер часто определяется на сервере как MS Publisher Imagesetter. Чтобы система использовала «родной» драйвер, установленный на сервере, проанализируем параметры запуска.

Если мы используем командную строку для запуска xfreerdp, можно принудительно указать имя драйвера:

/printer:name="TSC-TE210",driver="TSC TE210"

Это заставит сервер Windows искать соответствие драйвера по имени. Если драйвер на сервере совпадает с тем, что запрашивает клиент, настройки формата бумаги будут подтягиваться более корректно.

Метод 3. Прямая печать (RAW) из 1С — самое надежное решение

Рассмотрим наиболее профессиональный подход, который позволяет полностью исключить влияние драйверов CUPS и графической подсистемы Windows. Это использование языка команд принтера — TSPL (TSC Printer Language).

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

Пример формирования команды для печати этикетки:


ТекстКоманд = "SIZE 58 mm, 40 mm" + Символы.ПС;
ТекстКоманд = ТекстКоманд + "GAP 3 mm, 0" + Символы.ПС;
ТекстКоманд = ТекстКоманд + "DIRECTION 1" + Символы.ПС;
ТекстКоманд = ТекстКоманд + "CLS" + Символы.ПС;
ТекстКоманд = ТекстКоманд + "TEXT 50,50,""3"",0,1,1,""Наименование товара""" + Символы.ПС;
ТекстКоманд = ТекстКоманд + "BARCODE 50,100,""128"",50,1,0,2,2,""123456789012""" + Символы.ПС;
ТекстКоманд = ТекстКоманд + "PRINT 1,1" + Символы.ПС;

// Запись во временный файл
ИмяФайла = ПолучитьИмяВременногоФайла("txt");
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.УстановитьТекст(ТекстКоманд);
ТекстовыйДокумент.Записать(ИмяФайла, КодировкаТекста.ANSI);

Для отправки этого файла на принтер из-под Linux-клиента через RDP, мы можем настроить принтер как Generic / Text Only. В этом режиме данные передаются «как есть», и принтер TSC выполнит команды SIZE, GAP и PRINT идеально точно, без лишних пустых страниц.

Метод 4. Синхронизация настроек по умолчанию на сервере

Проанализируем настройки на самом Windows-сервере. Даже если принтер проброшен, сервер хранит настройки «по умолчанию» для этого устройства. Часто 1С берет параметры именно оттуда.

  1. Зайдем в Панель управления -> Устройства и принтеры.
  2. Найдем перенаправленный (redirected) принтер TSC.
  3. Нажмем правую кнопку мыши и выберем Настройка печати (Printing Preferences), а также Свойства принтера -> Дополнительно -> Умолчания (Printing Defaults).
  4. Везде убедимся, что установлены правильные размеры (например, 58x40) и тип носителя. Важно: настройки в «Умолчаниях» и «Настройках печати» должны быть идентичны.

Итоги и рекомендации

Подводя итог, можно сказать, что проблема «корявой» печати этикеток в связке 1С + Linux + RDP чаще всего решается либо отключением отступов в CUPS, либо переходом на Raw-печать. Если ваша задача позволяет использовать команды TSPL, это сэкономит массу времени на администрирование драйверов в будущем, так как печать перестанет зависеть от графических обновлений системы и версий RDP-клиентов.

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

← На главную