Как отправить ZPL или EZPL этикетку на принтер Godex напрямую по IP-адресу

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

При автоматизации складского учета или маркировки товаров часто возникает задача отправить сформированный код этикетки (в форматах ZPL или EZPL) напрямую на принтер, минуя стандартные диалоговые окна печати Windows. Ситуация осложняется, когда принтер подключен по сети (через Ethernet/IP), так как привычные команды командной строки, такие как copy или type, ориентированы на работу с локальными портами или общими сетевыми папками по протоколу SMB, но не умеют «общаться» напрямую с сокетами принтера.

В данной статье мы разберем несколько проверенных способов решения этой задачи, проанализируем, почему стандартные методы DOS дают сбой, и приведем примеры кода для реализации прямой печати из среды 1С.

Почему стандартная команда COPY не работает с IP-адресом?

Разберем типичную ситуацию: программист пытается выполнить команду КомандаСистемы("copy label.txt 192.168.0.15"). С точки зрения операционной системы Windows, строка 192.168.0.15 не является путем к устройству. Команда copy ожидает либо имя локального порта (LPT1, COM1), либо сетевой путь в формате UNC (\\Server\Printer). Чтобы принтер принял данные напрямую по IP, необходимо использовать протоколы передачи данных более низкого уровня, такие как RAW (порт 9100) или LPR, либо использовать высокоуровневые протоколы, такие как HTTP, если принтер их поддерживает.

Решение 1: Отправка команд через HTTP POST запрос

Многие современные сетевые принтеры Godex (например, модель RT230) имеют встроенный веб-интерфейс, который позволяет принимать управляющие команды через стандартные HTTP-запросы. Это наиболее элегантный и современный способ, который не требует установки драйверов или настройки сетевых шар.

Рассмотрим алгоритм реализации этого метода в 1С 8.3:

  1. Подготавливаем строку с командами на языке принтера (например, EZPL).
  2. Создаем объект HTTPСоединение с IP-адресом принтера.
  3. Формируем HTTPЗапрос и отправляем его методом POST.

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


// Формируем текст этикетки на языке EZPL
ТекстЭтикетки = "^Q25,3" + Символы.ВК + Символы.ПС;
ТекстЭтикетки = ТекстЭтикетки + "^W50" + Символы.ВК + Символы.ПС;
ТекстЭтикетки = ТекстЭтикетки + "^H10" + Символы.ВК + Символы.ПС;
ТекстЭтикетки = ТекстЭтикетки + "AD,20,20,1,1,0,0,Текст на этикетке" + Символы.ВК + Символы.ПС;
ТекстЭтикетки = ТекстЭтикетки + "E" + Символы.ВК + Символы.ПС;

// Указываем IP-адрес принтера
АдресПринтера = "192.168.0.15";

// Создаем соединение. Порт по умолчанию для HTTP - 80
Соединение = Новый HTTPСоединение(АдресПринтера);

// В некоторых моделях путь для приема команд может отличаться (например, /index.cgi или /pjl)
// Однако часто принтер принимает данные напрямую в корень или через специальный скрипт
Запрос = Новый HTTPЗапрос("/");
Запрос.УстановитьТелоИзСтроки(ТекстЭтикетки, КодировкаТекста.ANSI);

Попытка
    Ответ = Соединение.ОтправитьДляОбработки(Запрос);
    Если Ответ.КодСостояния = 200 Тогда
        Сообщить("Этикетка успешно отправлена на печать.");
    Иначе
        Сообщить("Принтер вернул ошибку: " + Ответ.КодСостояния);
    КонецЕсли;
Исключение
    Сообщить("Не удалось связаться с принтером по адресу " + АдресПринтера);
КонецПопытки;

Важно помнить, что принтеры Godex чувствительны к кодировке. Обычно используется ANSI (Windows-1251), но для корректного отображения кириллицы могут потребоваться дополнительные команды переключения шрифтов в самом коде этикетки.

Решение 2: Использование TCP/IP сокетов (порт 9100)

Если принтер не поддерживает HTTP-интерфейс для печати, он точно поддерживает протокол RAW на порту 9100. Это стандарт де-факто для сетевой печати. В 1С «из коробки» нет прямого способа открыть TCP-сокет, но мы можем воспользоваться внешними компонентами или скриптами PowerShell.

Проанализируем пример использования PowerShell для проброса файла в порт принтера:


// Путь к временному файлу с командами ZPL/EZPL
ИмяФайла = "C:\temp\label.txt";

// Формируем команду PowerShell
КомандаPS = "$client = New-Object System.Net.Sockets.TcpClient('192.168.0.15', 9100); " +
            "$stream = $client.GetStream(); " +
            "$bytes = [System.IO.File]::ReadAllBytes('" + ИмяФайла + "'); " +
            "$stream.Write($bytes, 0, $bytes.Length); " +
            "$stream.Close(); " +
            "$client.Close();";

// Запускаем через КомандаСистемы или ЗапуститьПриложение
КомандаВыполнения = "powershell -ExecutionPolicy Bypass -Command """ + КомандаPS + """";
ЗапуститьПриложение(КомандаВыполнения, , Истина);

Этот метод крайне надежен, так как имитирует работу стандартного драйвера печати в режиме RAW.

Решение 3: Виртуальный принтер Generic / Text Only

Если вы хотите продолжать использовать стандартные команды копирования файлов (КопироватьФайл в 1С), можно пойти по пути создания «прослойки» в операционной системе. Выясним, как это настроить по шагам:

  1. Установите в Windows новый принтер. При выборе драйвера укажите Generic -> Generic / Text Only (Общий / Только текст).
  2. В настройках порта выберите Standard TCP/IP Port и введите IP вашего Godex.
  3. В свойствах принтера на вкладке «Доступ» разрешите общий доступ к принтеру (например, под именем GodexLocal).
  4. Теперь вы можете обращаться к нему по UNC-пути, даже если он подключен по IP. Используйте путь вида \\127.0.0.1\GodexLocal.

Теперь в коде 1С вы можете использовать простую операцию копирования:


ИмяФайла = "D:\etiketka.txt";
// Копируем файл напрямую в очередь печати «расшаренного» принтера
КопироватьФайл(ИмяФайла, "\\127.0.0.1\GodexLocal");

Преимущество метода: ОС сама заботится об очереди печати и передаче данных в сеть. Недостаток: требуется предварительная настройка каждого рабочего места.

Решение 4: Использование драйвера из БПО (Библиотека подключаемого оборудования)

Для профессиональной разработки в среде 1С:Предприятие 8 рекомендуется использовать штатные механизмы БПО. Рассмотрим, как это работает с принтерами Godex. Существует специализированный нативный драйвер (например, от компании Сканкод), который поддерживает протокол EZPL.

При использовании драйвера вам не нужно знать синтаксис команд ^Q или ^W. Вы работаете с объектом драйвера, передавая ему параметры печати. Однако, если у вас уже есть готовый сформированный файл с кодом этикетки, драйверы Godex часто предоставляют метод SendCustomCommand() или DirectPrint(), который отправит ваш текст напрямую в порт.

Различия между ZPL и EZPL

Важный момент, который часто упускают из виду: принтеры Godex по умолчанию используют собственный язык EZPL. Если вы нашли в интернете примеры кода для принтеров Zebra (язык ZPL, команды начинаются с символа ^), они могут не заработать на Godex без включения режима эмуляции.

Проанализируем ситуацию: если ваш принтер молчит при получении файла, проверьте следующие настройки в утилите GoLabel или Godex Tool:

Рассмотрим пример простейшей команды на EZPL для проверки связи:

~V

Отправка этой короткой команды (всего два символа) заставляет принтер Godex распечатать информацию о текущей версии прошивки. Это отличный способ проверить, доходят ли данные до устройства по выбранному вами каналу (HTTP, Сокет или Generic драйвер).

Резюме

Подводя итог, можно сказать: для быстрой реализации «здесь и сейчас» без настройки системы идеально подходит метод с HTTP POST запросом. Если же требуется высокая надежность и работа через стандартную очередь печати Windows — выбирайте установку драйвера Generic / Text Only с последующим предоставлением общего доступа. Помните о важности правильной кодировки (ANSI) и завершающих символов строк (ВК + ПС) в вашем текстовом файле этикетки.

← На главную