Печать этикеток на принтере с ножом и автоматическая резка по группам

Печать - Ценники

печать этикеток резка этикеток zebra

4
В статье описан процесс печати и автоматической резки этикеток из 1С на примере принтера с режущим лезвием Zebra ZT410 с помощью предварительного формирования файла с командами для принтера.

Весь товар в нашей организации стикеруется по приходу. В одной накладной, откуда печатаются этикетки, может быть до 100 позиций, каждой по 10-100 единиц, т.е. в результате печати может получиться лента с 1000 этикетками. Естественно, работать с такой лентой кладовщикам не удобно – приходится искать, где заканчивается один товар и начинается другой, рвать ленту на куски, делить между собой, на что уходит куча времени. Куда проще, чтобы принтер сам сразу нарезал этикетки по группам товаров.

Поэтому, вместо простенького принтера этикеток был закуплен промышленный принтер Zebra ZT410 с режущим лезвием. В комплекте поставляется утилита, которая позволяет рисовать этикетки и резать их в определенном кол-ве, но у нее нет API и она не поддерживает работу через командную строку. Через драйвер принтера есть возможность настройки резки этикеток, но, опять же, только через определённое кол-во напечатанных этикеток.

В решении задачи помогла возможность Windows (наверно, как и в других ОС) отправки любого задания на печать в драйвер принтера с последующим сохранением команд для принтера в файл.

Сохранить файл команд для принтера можно либо непосредственно перед печатью через диалоговое окно, поставив соответствующий флаг:


либо установив в качестве порта принтера значение FILE:

 


Файл с командами для принтера Zebra ZT410 выглядит примерно так:

На помощь в расшифровке пришел мануал по программированию и командам данного принтера. Кстати, этот язык программирования называется ZPL (Zebra Programming Language).

Блок команд находится между командами ^XA и ^XZ, то есть, грубо говоря, этот блок и есть наша этикетка. Внутри идут команды с размерами этикетки и качеством, закодированная строка (возможно в base64), содержащая картинку и текст этикетки.

Находим в мануале, что смена режимов работы принтера - ручное отрывание или резка, осуществляется командами ^MMT и ^MMC соответственно. Следовательно, задача заключается в том, чтобы весь текст команд разбить на блоки (этикетки) и последовательно их сравнить. Как только блок команд будет отличаться от предыдущего, вставляем в предыдущий блок команду перевода принтера в режим резки, а в текущем опять переводим принтер в режим отрывания.

Процедуру распарсивания текста я приводить не буду, но покажу, как изменился текст команд после его обработки:

На приведенном примере видно, что первые 3 блока команд одинаковые, а 4-ый отличается закодированной строкой с текстом этикетки. В первом блоке переводим принтер в режим отрывания (не известно в каком режиме принтер был до этого). В 3-ем блоке вставляем команду резки ^MMC, а в 4-ом обратно переводим в режим отрывания. Во время печати принтер отрежет ленту после 3-ей этикетки.

Теперь у нас есть файл с командами, которые укажут принтеру как распечатать и нарезать этикетки. Как отправить его на принтер? Существуют различные способы – использовать зебровскую утилиту либо сторонний софт, который отправляет на принтер команды, но нам подходит другой, самый простой - команда COPY командной строки Windows. Работает это так:

copy /b <Путь к файлу с командами> <Имя принтера>

Однако, данный метод не работает с сетевыми принтерами, подключенными через TCP/IP. Применяем небольшую хитрость – создаем общий доступ на локальном ПК для сетевого принтера. Отправка файла команд на него будет выглядеть так: «copy /b <Путь к файлу с командами> \\localhost\<Имя принтера>».

С теорией разобрались, приступаем к практике.

Для полной автоматизации процесса нам потребуется добавить в систему один и тот же принтер этикеток два раза с разными настройками.

У первого принтера в качестве порта укажем FILE, он будет сохранять файл команд.

Второй будет настроен на нормальную печать (и иметь общий доступ, если это сетевой принтер).

На стороне 1С каждый сам для себя может решить, как ему будет удобнее это доработать. Я решил доработать команду «Печать» на общей форме ПечатьДокументов (УТ 11) таким образом, чтобы доработка не касалась остальных сотрудников и не мешала им - добавляем в справочник «Пользователи» доп. реквизит типа булево «Печать этикеток». Теперь при печати система проверяет этот реквизит, если он есть, то задается вопрос: «Резать этикетки по группам?». «Да» - запускается наш новый механизм, «Нет» - работает типовой механизм отправки на печать на принтер, установленный по умолчанию.

И так, что нам осталось. «Распечатать» табличный документ с этикетками на первом принтере, который сохранит команды в файл. А затем обработать файл добавив команды резки и отправить сформированный файл на второй принтер командой copy, который уже и распечатает этикетки согласно отправленным командам. При «печати» на первом принтере система будет каждый раз спрашивать, куда сохранить наш файл команд, что не очень удобно, т.к. кладовщик должен минимально участвовать в этом процессе.

Чтобы система ничего не спрашивала, необходимо у принтера, сохраняющего файл команд, указать в качестве порта не FILE, а путь до файла.

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

Для его поиска создадим COM-объект WScript.Network. Его метод EnumPrinterConnections() возвращает коллекцию, содержащую последовательно порт, а затем имя принтера.

 

Через найденный принтер «Печатаем» наш табличный документ с этикетками, в результате чего он сохранится в файл с командами:

Далее откроем, распарсим и вставим нужные команды в получившемся файле (ПринтерДляПечатиВФайл.ПутьКФайлу) так, чтобы между отличающимися блоками была команда ^MMC. Сама процедура парсинга громоздкая и не представляет особого технического интереса, поэтому я приложил ее отдельным файлом к статье.

Ну и теперь осталось только отправить на второй принтер наш подготовленный файл с командами:

ИмяПринтераДляПечати – в случае, если это сетевой принтер, то это имя, которое мы указываем в свойствах доступа расшаренного принтера:

Так как пользователь в процессе ничего не выбирает, то имя принтера для печати необходимо где-то хранить. Для этого я поменял тип ранее добавленного доп. реквизита «Печать этикеток» с булево на строку и храню там имя принтера.

4

Скачать файлы

Наименование Файл Версия Размер
Процедура ОбработатьФайлКомандДляПринтера
.txt 2,78Kb
26.11.18
0
.txt 2,78Kb Скачать

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. muskul 27.11.18 03:43 Сейчас в теме
Да вроде парсинг файла и расчленение в этом наборе символов групп как раз самое интересное
2. megaZ 3 27.11.18 08:34 Сейчас в теме
(1) Открываем и читаем файл построчно. Как только в строке встречаем команду ^XA, начинаем записывать эту и все последующие строчки в переменную. Когда встречаем в строке ^XZ, то добавляем переменную в массив. Далее очищаем переменную и опять построчно пишем в нее, а дойдя до ^XZ сравниваем ее с последним элементом массива. Если переменная отличается от последнего элемента массива - это новая этикетка, вставляем в последний элемент массива команду резки ^MMC.
3. muskul 28.11.18 04:49 Сейчас в теме
(2)По разным номенклатурам а не группам номенклатурам, а то немного не понятно как из этих символов группы вычленяешь и разбивку делаешь. тогда понятно
4. 33885222 28.11.18 12:30 Сейчас в теме
(3) Да, тут именно разбивка по товарам получается, а не по номенклатурным группам
Оставьте свое сообщение