Как напечатать DataMatrix код из 1С на принтере Zebra с использованием языка ZPL?

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

Многие пользователи 1С сталкиваются с необходимостью печатать этикетки со штрихкодами DataMatrix на специализированных принтерах Zebra, используя их родной язык ZPL (Zebra Programming Language) — для этого подойдёт генерация и печать кодов DataMatrix из 1С. Часто возникает путаница, почему простая отправка текста с ZPL-командами из Блокнота не работает, и как это правильно реализовать из системы 1С. В этом руководстве мы подробно разберем, как подойти к этой задаче, какие методы существуют и какие нюансы нужно учесть.

Понимание основ ZPL и принципов работы принтеров Zebra

Прежде чем мы перейдем к методам печати, нам необходимо уяснить, что такое ZPL и как принтеры Zebra его обрабатывают. ZPL (Zebra Programming Language) — это язык команд, разработанный компанией Zebra для управления своими принтерами этикеток. Эти команды позволяют нам точно задавать расположение текста, графики, штрихкодов и других элементов на этикетке.

Когда вы пытаетесь напечатать ZPL-код из обычного текстового редактора, например, Блокнота, операционная система воспринимает это как команду на печать обычного текста. Принтер получает строку, например, ^FO50,300^FDJohn Doe^FS, и печатает её именно как текст, символ за символом, а не как набор инструкций для форматирования этикетки. Это происходит потому, что стандартный механизм печати через драйверы Windows преобразует текст или изображения в понятный принтеру формат (обычно EMF или XPS), а не передает ему сырые команды ZPL для интерпретации. Принтер Zebra, ожидающий сырые ZPL-команды, просто не понимает, что ему делать с этим "псевдо-ZPL" текстом.

Для того чтобы принтер Zebra правильно интерпретировал наши команды, мы должны отправить ему необработанный (RAW) ZPL-код. Каждое ZPL-сообщение должно начинаться с команды ^XA (Start Format — начало формата) и заканчиваться командой ^XZ (End Format — конец формата). Все команды внутри этого блока определяют содержимое этикетки. Например, простейший ZPL-код для печати текста будет выглядеть так:


^XA
^FO50,50^A0N,30,30^FDHello World^FS
^XZ

Здесь ^FO50,50 устанавливает позицию поля на 50 пикселей от левого края и 50 пикселей от верхнего края, ^A0N,30,30 выбирает шрифт и его размер, а ^FDHello World^FS определяет текст "Hello World" и завершает поле.

Создание DataMatrix штрихкода с помощью ZPL

Для создания штрихкода DataMatrix в ZPL используется команда ^BX. Эта команда обладает богатым набором параметров, позволяющих нам детально настроить внешний вид и свойства генерируемого кода.

Общая структура команды ^BX выглядит так:

^BXo,h,s,c,r,f,e,o,g

Где:

Давайте рассмотрим базовый пример ZPL-кода для создания DataMatrix:


^XA
^FO50,50^BXN,5,200,,,,,^FD[ВАШИ_ДАННЫЕ_ДЛЯ_КОДИРОВАНИЯ]^FS
^XZ

В этом примере:

Если вы работаете с GS1 DataMatrix, вам потребуется явно указать мета-символ FNC1 — есть печать этикеток для маркировки продукции с GS1 DataMatrix. Для этого мы используем параметр e (Escape Character) в команде ^BX. Допустим, мы выбираем символ подчеркивания (_) в качестве escape-символа. Тогда FNC1 будет представлен как _1. Важно также включить команду ^FH_ (Field Hexadecimal Indicator) в начало вашего ZPL-кода, чтобы принтер знал, какой символ используется для экранирования.


^XA
^FO50,50^BXN,5,200,,,,,^FH_^FD_101234567890123456_110ABCDEF^FS
^XZ

В этом примере ^FH_ указывает, что символом экранирования является подчеркивание. Затем в ^FD:

Таким образом, принтер корректно интерпретирует эти управляющие символы и формирует GS1 DataMatrix.

Методы отправки ZPL-команд на принтер из 1С

Теперь, когда мы понимаем, как формировать ZPL-код, давайте разберем, как его отправить на принтер из 1С — поможет автоматизация печати этикеток с маркировкой DataMatrix. Мы рассмотрим несколько подходов, от простых до более продвинутых.

Метод 1: Отправка текстового файла командой COPY

Самый простой способ отправить необработанный ZPL-код на принтер – это использовать команду COPY в командной строке Windows. Этот метод предполагает, что мы сначала сохраним наш ZPL-код в текстовый файл, а затем скопируем его на устройство принтера.

Для принтеров, подключенных локально (например, по USB или LPT-порту), команда будет выглядеть так:

copy /b C:\Путь\К\Файлу\zpl_code.txt PRN

Где PRN – это зарезервированное имя для локально подключенного принтера. Ключ /b (binary) очень важен, так как он указывает на передачу файла в бинарном режиме, без каких-либо преобразований, которые могут исказить ZPL-команды.

Однако этот метод часто не работает напрямую для сетевых принтеров, подключенных по TCP/IP, поскольку у них нет прямого имени устройства типа PRN. В этом случае нам потребуется обходной путь: создать общий доступ к сетевому принтеру на локальном ПК, а затем отправлять команды, используя путь к этому общему ресурсу.

Для этого нам нужно:

  1. Установить драйвер для сетевого принтера на компьютере, с которого мы будем печатать из 1С.
  2. Предоставить общий доступ к этому принтеру. Назовите его, например, "ZebraNet".
  3. Использовать команду COPY, указывая путь к этому общему ресурсу:

copy /b C:\Путь\К\Файлу\zpl_code.txt \\localhost\ZebraNet

Из 1С вы можете выполнить эту команду с помощью функций, таких как ЗапуститьПриложение() или КомандаСистемы() (для толстого клиента). Сначала вы формируете ZPL-код, записываете его во временный текстовый файл, а затем вызываете команду системы:


// Пример формирования ZPL-кода и записи в файл (для управляемого приложения)
Функция СформироватьИНапечататьZPL(ДанныеДляDataMatrix, ИмяПринтера)
    КаталогВременныхФайлов = ПолучитьКаталогВременныхФайлов();
    ИмяФайлаZPL = КаталогВременныхФайлов + "DataMatrix_" + Строка(Новый УникальныйИдентификатор()) + ".zpl";

    ZPLКод = "^XA" + Символы.ПС;
    ZPLКод = ZPLКод + "^FO50,50^BXN,5,200,,,,,^FD" + ДанныеДляDataMatrix + "^FS" + Символы.ПС;
    ZPLКод = ZPLКод + "^XZ";

    ТекстФайла = Новый ТекстовыйДокумент();
    ТекстФайла.УстановитьТекст(ZPLКод);
    ТекстФайла.Записать(ИмяФайлаZPL, КодировкаТекста.UTF8БезBOM); // Важно: UTF8 без BOM

    КомандаПечати = "cmd /c copy /b """ + ИмяФайлаZPL + """ """ + ИмяПринтера + """";
    
    // В зависимости от платформы и клиента, можно использовать различные методы
    // Для толстого клиента или серверного вызова:
    РезультатКоманды = ЗапуститьПриложение(КомандаПечати, , Истина); 
    // Для тонкого клиента, возможно, потребуется вызов на сервере или через внешнюю компоненту
    
    УдалитьФайлы(ИмяФайлаZPL); // Удаляем временный файл

    Возврат Истина;
КонецФункции

// Пример вызова
// Если принтер локальный:
// СформироватьИНапечататьZPL("0104606013231333", "PRN");
// Если принтер сетевой, общий ресурс на локальной машине:
// СформироватьИНапечататьZPL("0104606013231333", "\\localhost\МояZebra");

Важно: При записи ZPL-кода в файл используйте кодировку UTF-8 без BOM. Наличие BOM (Byte Order Mark) в начале файла может быть воспринято принтером как мусорные символы и привести к ошибкам печати.

Метод 2: Прямая отправка ZPL через TCP/IP (порт 9100)

Этот метод считается одним из самых надежных и эффективных для сетевых принтеров Zebra. Принтеры Zebra обычно слушают порт 9100 для получения необработанных данных (RAW printing). Это позволяет нам отправлять ZPL-команды напрямую принтеру, минуя драйверы Windows и все их потенциальные сложности.

Реализовать это из 1С можно несколькими способами:

  1. Использование сторонних COM-компонент: Существуют COM-компоненты (например, различные библиотеки для работы с сетью или специализированные компоненты для печати), которые позволяют устанавливать TCP-соединение и отправлять данные. Вы регистрируете такую компоненту в системе и затем используете ее объекты из 1С.
  2. Программное взаимодействие с сетевым сокетом: Этот метод требует более глубоких знаний в программировании 1С и работы с сокетами. Вы можете создать объект, который устанавливает TCP-соединение с IP-адресом принтера на порт 9100, затем отправляет ZPL-код как поток байтов и закрывает соединение. Для этого обычно требуется использование внешних библиотек или расширений языка 1С, так как встроенных средств для прямой работы с сокетами в 1С до недавнего времени не было (или они были очень ограничены). В последних версиях платформы 1С есть возможности для работы с HTTP-соединениями, но для RAW TCP-сокетов все еще предпочтительны внешние компоненты.

Принципы работы этого метода следующие:

  1. Устанавливаем TCP-соединение с IP-адресом принтера на порт 9100.
  2. Отправляем сформированный ZPL-код в виде байтов через это соединение.
  3. Закрываем соединение.

Этот подход обеспечивает максимальную скорость и надежность, особенно при печати больших объемов этикеток или в сложных сетевых окружениях, поскольку мы избегаем промежуточных звеньев в виде драйверов операционной системы. Для реализации сетевой или Bluetooth-печати в формате ZPL из 1С можно использовать компоненту печати на принтерах по Bluetooth и сети.

Метод 3: Использование готовых внешних компонент для 1С

На рынке и на специализированных ресурсах (например, Инфостарт) существуют готовые внешние компоненты, специально разработанные для 1С, которые упрощают отправку ZPL/EPL команд на принтеры этикеток (удобно через печать кодов маркировки на принтерах этикеток). Эти компоненты обычно представляют собой COM-объекты или DLL-библиотеки, которые подключаются к 1С и предоставляют удобный API для печати.

Преимущества таких компонент:

Например, такая компонента может иметь метод НапечататьZPL(IPАдрес, Порт, ZPLКод), который мы можем легко вызвать из 1С:


// Пример использования гипотетической внешней компоненты
Попытка
    ПечатьZebra = Новый COMОбъект("ИмяМоейZebraКомпоненты"); // Замените на реальное имя
    ПечатьZebra.УстановитьПараметрыСоединения("192.168.1.100", 9100); // IP-адрес и порт принтера
    
    ДанныеДляDataMatrix = "0104606013231333";
    ZPLКод = "^XA" + Символы.ПС + 
             "^FO50,50^BXN,5,200,,,,,^FD" + ДанныеДляDataMatrix + "^FS" + Символы.ПС + 
             "^XZ";
             
    ПечатьZebra.ОтправитьZPL(ZPLКод);
    Сообщить("ZPL-код успешно отправлен на принтер.");
Исключение
    Сообщить("Ошибка при отправке ZPL-кода: " + ОписаниеОшибки());
КонецПопытки;

Поиск и приобретение такой компоненты может значительно сократить время разработки и повысить стабильность работы системы печати.

Альтернативное решение: Внешняя компонента "1С:Печать штрихкодов"

Многие конфигурации 1С (такие как "1С:Управление торговлей", "1С:ERP Управление предприятием" и другие) включают в себя стандартную внешнюю компоненту "1С:Печать штрихкодов". Эту компоненту можно найти в общих макетах конфигурации (например, под именем "КомпонентаПечатиШтрихкодов"). Она также является частью "1С:Библиотеки подключаемого оборудования" (БПО) и "1С:Библиотеки стандартных подсистем" (БСП).

Эта компонента действительно умеет генерировать штрихкоды различных форматов, включая DataMatrix. Однако, как правило, она работает следующим образом: компонента генерирует не ZPL-код, а растровое изображение штрихкода (например, в формате PNG или BMP). Затем 1С отправляет это изображение на принтер как обычную графику, используя стандартные механизмы печати Windows, а не как нативные ZPL-команды. Для этой задачи есть вывод штрихкодов в печатные формы складских документов.

Преимущества этого подхода:

  1. Простота реализации: Вам не нужно изучать ZPL, достаточно вызвать методы компоненты для генерации изображения.
  2. Стандартное решение: Компонента уже встроена во многие типовые конфигурации, что облегчает её использование.
  3. Универсальность: Работает с любыми принтерами, для которых установлены драйверы в Windows, так как отправляет растровую графику.

Недостатки:

  1. Скорость печати: Отправка растрового изображения на принтер занимает больше времени, чем отправка нескольких строк ZPL-кода. Для больших объемов печати (сотни или тысячи этикеток) это может стать существенным ограничением.
  2. Качество штрихкода: Хотя современные принтеры хорошо справляются с растровыми изображениями, нативное формирование штрихкода принтером из ZPL-кода часто обеспечивает более высокую четкость и контрастность, что важно для надежного считывания сканером.
  3. Ограничения фоновой печати: Если вам требуется фоновый процесс, который печатает этикетки на разные принтеры, использование стандартных механизмов Windows для печати изображений может быть менее гибким или требовать более сложных настроек.

Таким образом, если у вас простые сценарии печати и небольшие объемы, использование "1С:Печать штрихкодов" может быть приемлемым. Однако для высокопроизводительной и качественной печати, особенно на сетевых принтерах Zebra, предпочтительнее освоить прямую отправку ZPL-кода.

Общие рекомендации и советы

Для успешной работы с ZPL и принтерами Zebra из 1С, мы рекомендуем принять во внимание следующие советы:

  1. Тестирование ZPL: Для быстрого тестирования и визуализации ZPL-кода без фактической печати, используйте онлайн-вьюверы ZPL. Существуют веб-сайты, куда вы можете вставить свой ZPL-код и увидеть, как будет выглядеть этикетка. Также утилиты от Zebra, такие как Zebra Setup Utilities или драйвер ZDesigner, позволяют отправлять ZPL-файлы на принтер напрямую, что очень полезно для отладки.
  2. Кодировка ZPL-файлов: При формировании ZPL-файлов или строк в 1С всегда используйте кодировку UTF-8 без BOM (Byte Order Mark). Наличие BOM в начале файла может вызвать ошибку интерпретации у принтера.
  3. Официальное руководство ZPL II: Для детального изучения команд ZPL и их параметров всегда обращайтесь к официальному руководству по программированию ZPL II от Zebra. Это ваш основной источник информации о языке.
  4. Настройки драйвера принтера: Некоторые драйверы принтеров Zebra имеют сервисную возможность отправить произвольную строку на принтер. Это может быть полезно для быстрого тестирования коротких ZPL-команд без необходимости писать код в 1С. Посмотрите в свойствах вашего драйвера принтера на вкладке "Сервис" или "Инструменты".
  5. Использование `^FW` для ориентации шрифта: Если у вас возникают проблемы с ориентацией текста, убедитесь, что вы правильно используете команду ^FW в начале ZPL-формата для установки общей ориентации шрифтов.

Понимание этих аспектов поможет вам эффективно настроить печать DataMatrix кодов из 1С на принтерах Zebra, достигая необходимой производительности и качества.

← На главную