Многие пользователи 1С сталкиваются с необходимостью печатать этикетки со штрихкодами DataMatrix на специализированных принтерах Zebra, используя их родной язык ZPL (Zebra Programming Language) — для этого подойдёт генерация и печать кодов DataMatrix из 1С. Часто возникает путаница, почему простая отправка текста с ZPL-командами из Блокнота не работает, и как это правильно реализовать из системы 1С. В этом руководстве мы подробно разберем, как подойти к этой задаче, какие методы существуют и какие нюансы нужно учесть.
Прежде чем мы перейдем к методам печати, нам необходимо уяснить, что такое 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 используется команда ^BX. Эта команда обладает богатым набором параметров, позволяющих нам детально настроить внешний вид и свойства генерируемого кода.
Общая структура команды ^BX выглядит так:
^BXo,h,s,c,r,f,e,o,g
Где:
o: Ориентация (N - нормальная, R - перевернутая, I - инвертированная, B - прочитано снизу вверх). Для DataMatrix обычно используется N.h: Высота модуля (размер каждого квадратика DataMatrix). Задается в точках.s: Качество ECC (Error Correction Code). Для GS1 DataMatrix штрихкодов рекомендуется использовать качество ECC 200.c: Количество столбцов.r: Количество строк.f: Формат DataMatrix (для большинства случаев оставляем пустым или 0).e: Символ экранирования (Escape Character). Это критически важно, особенно для GS1 DataMatrix. Если вы работаете с GS1 DataMatrix, вам потребуется вставить мета-символ FNC1. Это делается с помощью escape-последовательности, например, _1, если в качестве escape-символа выбран символ подчеркивания (_). Важно определить escape-символ непосредственно в ZPL-файле, чтобы избежать зависимости от настроек прошивки принтера.o: Опции.g: Режим GS1 DataMatrix.Давайте рассмотрим базовый пример ZPL-кода для создания DataMatrix:
^XA
^FO50,50^BXN,5,200,,,,,^FD[ВАШИ_ДАННЫЕ_ДЛЯ_КОДИРОВАНИЯ]^FS
^XZ
В этом примере:
^FO50,50: Устанавливает начальную позицию для штрихкода (отступ 50 пикселей от левого и верхнего края).^BXN,5,200,,,,,:
N: Нормальная ориентация.5: Размер модуля (каждого квадратика) в точках.200: Качество ECC 200.^FD[ВАШИ_ДАННЫЕ_ДЛЯ_КОДИРОВАНИЯ]^FS: Поле данных, которое будет закодировано в DataMatrix.Если вы работаете с 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:
_1: Представляет FNC1.01234567890123456: Пример глобального номера предмета торговли (GTIN)._1: Еще один FNC1.10ABCDEF: Пример серийного номера.Таким образом, принтер корректно интерпретирует эти управляющие символы и формирует GS1 DataMatrix.
Теперь, когда мы понимаем, как формировать ZPL-код, давайте разберем, как его отправить на принтер из 1С — поможет автоматизация печати этикеток с маркировкой DataMatrix. Мы рассмотрим несколько подходов, от простых до более продвинутых.
Самый простой способ отправить необработанный ZPL-код на принтер – это использовать команду COPY в командной строке Windows. Этот метод предполагает, что мы сначала сохраним наш ZPL-код в текстовый файл, а затем скопируем его на устройство принтера.
Для принтеров, подключенных локально (например, по USB или LPT-порту), команда будет выглядеть так:
copy /b C:\Путь\К\Файлу\zpl_code.txt PRN
Где PRN – это зарезервированное имя для локально подключенного принтера. Ключ /b (binary) очень важен, так как он указывает на передачу файла в бинарном режиме, без каких-либо преобразований, которые могут исказить ZPL-команды.
Однако этот метод часто не работает напрямую для сетевых принтеров, подключенных по TCP/IP, поскольку у них нет прямого имени устройства типа PRN. В этом случае нам потребуется обходной путь: создать общий доступ к сетевому принтеру на локальном ПК, а затем отправлять команды, используя путь к этому общему ресурсу.
Для этого нам нужно:
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) в начале файла может быть воспринято принтером как мусорные символы и привести к ошибкам печати.
Этот метод считается одним из самых надежных и эффективных для сетевых принтеров Zebra. Принтеры Zebra обычно слушают порт 9100 для получения необработанных данных (RAW printing). Это позволяет нам отправлять ZPL-команды напрямую принтеру, минуя драйверы Windows и все их потенциальные сложности.
Реализовать это из 1С можно несколькими способами:
Принципы работы этого метода следующие:
Этот подход обеспечивает максимальную скорость и надежность, особенно при печати больших объемов этикеток или в сложных сетевых окружениях, поскольку мы избегаем промежуточных звеньев в виде драйверов операционной системы. Для реализации сетевой или Bluetooth-печати в формате ZPL из 1С можно использовать компоненту печати на принтерах по Bluetooth и сети.
На рынке и на специализированных ресурсах (например, Инфостарт) существуют готовые внешние компоненты, специально разработанные для 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С:ERP Управление предприятием" и другие) включают в себя стандартную внешнюю компоненту "1С:Печать штрихкодов". Эту компоненту можно найти в общих макетах конфигурации (например, под именем "КомпонентаПечатиШтрихкодов"). Она также является частью "1С:Библиотеки подключаемого оборудования" (БПО) и "1С:Библиотеки стандартных подсистем" (БСП).
Эта компонента действительно умеет генерировать штрихкоды различных форматов, включая DataMatrix. Однако, как правило, она работает следующим образом: компонента генерирует не ZPL-код, а растровое изображение штрихкода (например, в формате PNG или BMP). Затем 1С отправляет это изображение на принтер как обычную графику, используя стандартные механизмы печати Windows, а не как нативные ZPL-команды. Для этой задачи есть вывод штрихкодов в печатные формы складских документов.
Преимущества этого подхода:
Недостатки:
Таким образом, если у вас простые сценарии печати и небольшие объемы, использование "1С:Печать штрихкодов" может быть приемлемым. Однако для высокопроизводительной и качественной печати, особенно на сетевых принтерах Zebra, предпочтительнее освоить прямую отправку ZPL-кода.
Для успешной работы с ZPL и принтерами Zebra из 1С, мы рекомендуем принять во внимание следующие советы:
^FW в начале ZPL-формата для установки общей ориентации шрифтов.Понимание этих аспектов поможет вам эффективно настроить печать DataMatrix кодов из 1С на принтерах Zebra, достигая необходимой производительности и качества.