gifts2017

Печать этикеток в формате ZPL/EPL

Опубликовал Евгений _ (Johny_v) в раздел Программирование - Внешние компоненты

Компонента для печати на принтере этикеток, подключенном к компьютеру в сети. Обработка для формирования этикеток в формате ZPL и EPL по шаблону (1С 8.2 / Обычная форма).

Данная компонента создана для отправки данных на принетры этикеток. Другие способы отправки данных на принтер (Например с использованием команд net use и copy) не работали, в случае когда принтер был подключен к компьютеру в сети.

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

Компонента создана с использованием Native API, поэтому должна работать только на 1С 8. Тестировалась только на версии 1С предприятия 8.2. 

1. Установка и регистрация компоненты

Для работы данной компоненты необходмио наличие установленного NET.Framework 4. Скопируйте файлы из архива в каталог на локальном компьютере (Например C:\Adm\COM\). Регистрация компоненты в системе выполняется с помощью комнадного файла:

@ECHO OFF

REM The following directory is for .NET 4.0
set DOTNETFX2=%SystemRoot%\Microsoft.NET\Framework\v4.0.30319
set PATH=%PATH%;%DOTNETFX2%

echo ---------------------------------------------------
regasm.exe C:\Adm\COM\VKV8MEANS.dll /codebase
echo ---------------------------------------------------
echo Done.
@pause

2. Настройка принтера для работы

Для печати на принтере с использованием команд ZPL (EPL) необходимо закачать нужные шрифты и изображения на принтер, используя ПО поставляемое с вашим принтером. Я закачиваю данные на принтеры используя программу "Zebra Designer Font and Graphics Downloader" из состава "Zebra Setup Utilities".
Предоставляем общий доступ к принтеру по сети.  
Обращение к принтеру будет осуществляться по адресу принтера: "\\Имя компьютера\Имя принтера" или "Имя принтера", если используется локальный принтер.

3. Подготовка этикетки для печати на принтере


Этикетка формируется в виде команд принтера для печати нужного текста и изображений.
Пример этикетки в формате ZPL:

^XA
^FO20,25
^A@N,10,9,E:ARI000.FNT^FDBosch1234 Sup^FS
^FO20,49
^A@N,10,9,E:ARI001.FNT^FDАрт.1234^FS
^FO370,49
^IME:RCT.GRF^FS
^FO385,49
^A@N,8,7,E:ARI002.FNT^FDМТ14^FS
^FO50,64
^BY4^BEN,70,Y,N        
^FD4909500320181^FS
^XZ

Описывать команды ZPL и EPL не буду. Этой информации много в интернете.

Формирование этикетки производится по макету:

Макет этикетки ZPL

Где:

ТипЭлемента - Тип элемента для вывода на печать: Текст, Изображение, Штрихкод            
ПозицияЛево - Позиция элемента от левого края (По умолчанию 20)            
ПозицияВерх - Отступ от последнего элемента до текущей строки. Для первой строки 25.            
Значение - Значение для вывода в элемента            
ДополнительныеДанные - Для текста - Шрифт, Для изображения - Диск принтера, Для штрихкода - Тип штрихкода            
ВысотаЭлемента - Высота элемента. Текст - высота букв в точках (По умолчанию 10), Штрихкод - Высота кода от 1 до 10.            
ШиринаЭлемента - Ширина элемента в точках, по умолчанию 9            
ВыводитьЕслиУказанПараметр - Если в строке есть параметр и он не заполнен, то строка не будет выведена            
Отступ[Тип штрихкода] - Задается отступ для различных видов ШК

В приложенной обработке есть пример формирования этикетки и отправки на принтер. Обработка проверялась на УПП, но должна работать и на других конфигурациях.

4. Описание функций библиотеки

  •     Функция "SendRawDataStringToPrinter", ("ОтправитьСтрокуДанныхНаПринтер")

                    Описание:
                    Отправляет строку данных в порт принтера. В строке передаются команды для печати эткетки.
                    Параметры:
                        Адрес порта - Строка, Имя принтера
                        Команда - Строка, Команды для отправки на порт.
                    Возвращаемое значение:
                        Истина - Данные отправлены на печать упешно

  •     Функция "SendRawDataFileToPrinter", ("ОтправитьФайлДанныхНаПринтер")

                    Описание:
                        Отправляет файл в порт принтера. В текстовом файле передаются команды для печати этикетки.
                    Параметры:
                        Адрес порта: - Строка, Имя принтера
                        Имя файла - Имя файла для отправки на принтер.
                    Возвращаемое значение:
                        Истина - Данные отправлены на печать упешно    

  •     Функция "BackgroundSendRawDataFileToPrinter", ("ФоноваяОтправкаФайлаДанныхНаПринтер")

                    Описание:
                        Фоновая отправка файла на принтер. Компонента вернет управление 1С не дожидаясь окончания печати. Используется при отправке на печать большого числа этикеток.
                    Параметры:
                        Адрес порта: - Строка, Имя принтера
                        Имя файла - Имя файла для отправки на принтер.
                    Возвращаемое значение:
                        Истина - Данные отправлены на печать упешно

5. Пример работы с библиотекой

Отвечая на комментарии, понял что нужно все-таки выложить простенький примерчик работы с библиотекой:

ИмяПринтера = "\\192.168.1.280\Zebra";
ЭтикеткаТовара = "^XA
|^FO20,25
|^A@N,10,9,^FDНаименование товара^FS
|^FO20,49
|^A@N,10,9,^FDАрт.123456789^FS
|^FO20,73
|^A@N,10,9,^FDПроизводитель:Фабрика^FS
|^FO20,97
|^FO50,187
|^BY4^BEN,70,Y,N 
|^FD4909500671160^FS
|^XZ";

// Для Управляемых форм сначала подключаем компоненту

//Если НЕ ПодключитьВнешнююКомпоненту("AddIn.VKV8MEA") Тогда
//      Сообщить("Компонента печати этикеток не загружена");
//КонецЕсли;
СерверПечати = Новый("AddIn.VKV8MEA");
Результат = СерверПечати.ОтправитьСтрокуДанныхНаПринтер(ИмяПринтера, ЭтикеткаТовара);
Если НЕ Результат Тогда
    Сообщить("Ошибка печати этикетки");
КонецЕсли;

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

Наименование Файл Версия Размер
Компонента печати этикеток на принтере
.zip 789,37Kb
25.10.16
0
.zip 789,37Kb Скачать
Обработка печати этикеток по шаблону 47
.epf 15,85Kb
25.10.16
47
.epf 1 15,85Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. mxm2 mxm2 (mxm2) 18.12.13 08:51
http://infostart.ru/public/196424/ для УФ. (имитация копирования файла по сетевому пути)
2. Евгений _ (Johny_v) 18.12.13 11:08
Это не совсем то же самое. В вашем случае идет печать на сетевой принтер с сетевым интерфейсом Ethernet.
Моя библиотека печатает на принтеры подключенные через USB/COM/LPT к компьютеру. В том числе и по сети (Например с терминального сервера идет печать на принтеры клиентов).
С такими принтерами нет возможности просто скопировать на них файл с этикеткой или отправить его по FTP.
Там нужно отправлять данные в порт принтера, что и делает данная библиотека.
И еще один плюс библиотеки - это отправка на принтер строки. Нет необходимости создавать и записывать файл, можно сразу отправить текст этикетки на принтер.
3. mxm2 mxm2 (mxm2) 18.12.13 22:14
(2) Johny_v,
В вашем случае идет печать на сетевой принтер с сетевым интерфейсом Ethernet.

совсем не так: обработка http://infostart.ru/public/196424/ используется с принтером TSC TDP 225, подключенном к клиентскому компу через кабель USB, и настроенном как доступный по сети (вкладка Доступ). Печать возможна как с любого компа в сети, так и с терминального сервера по пути, указанному во вкладке Доступ принтера. Работает такая связка значительно быстрее чем через "родные" драйвера/компоненты (платные - не испытывались). Сама этикетка строится на том-же языке, что и у Вас, однако при этом не требует ни внешних компонент ни макетов.
4. Егор Titov (Titov222) 26.05.14 13:41
Подскажите, пожалуйста, а где взять текст модуля СерверПечати?
5. Евгений _ (Johny_v) 26.05.14 14:05
(4) Titov222,
СерверПечати - Это не модуль, а объект внешней библиотеки VKV8MEANS.dll
Создается следующим образом:
СерверПечати = Новый("AddIn.VKV8MEA");

6. Dmitry Vidmanov (etmarket) 28.12.14 16:50
Поле агрегатного объекта не обнаружено (ОтправитьСтрокуДанныхНаПринтер)
Поле агрегатного объекта не обнаружено (SendRawDataStringToPrinter)
Поле агрегатного объекта не обнаружено (ОтправитьФайлДанныхНаПринтер)
Поле агрегатного объекта не обнаружено (SendRawDataFileToPrinter)
Поле агрегатного объекта не обнаружено (ФоноваяОтправкаФайлаДанныхНаПринтер)
Поле агрегатного объекта не обнаружено (BackgroundSendRawDataFileToPrinter)

Ваша библиотека из файла "Компонента печати этикеток на принтере" не содержит методов! Она вообще ничего не содержит! Я открывал её редактором ресурсов. Что за шарлотанство?
7. Евгений _ (Johny_v) 12.01.15 11:51
Спасибо за выбор моей библиотеки. Она давно и успешно работает и не только у меня одного.
Никакого шарлотанства в ней нет. Просто нужно внимательнее читать описание:

ОтправитьСтрокуДанныхНаПринтер - Это имя функции которую необходимо вызвать.

Пример работы:

СерверПечати = Новый("AddIn.VKV8MEA");
СерверПечати.ОтправитьСтрокуДанныхНаПринтер("\\Comp\Zebra", "^XA");


Если у Вас возникнут проблемы с этой библиотекой, пишите, постараюсь помочь.
8. Dmitry Vidmanov (etmarket) 12.01.15 22:13
(7) Johny_v, я всё внимательно прочитал. Создал объект "СерверПечати", аналогично приведенному примеру и вызвал его метод "ОтправитьСтрокуДанныхНаПринтер". И такого метода у объекта не существует! Как раз по причине, что я описал выше:
Ваша библиотека из файла "Компонента печати этикеток на принтере" не содержит методов! Она вообще ничего не содержит! Я открывал её редактором ресурсов. Что за шарлотанство?


Поэтому никакого недопонимания нет. Просто вы предлагаете людям за 1 СМ скачать "пустышку", которая ничего не делает!
9. Евгений _ (Johny_v) 13.01.15 10:06
(8) На какой версии 1С Вы хотите работать с моей компонентой?
10. Dmitry Vidmanov (etmarket) 13.01.15 21:51
(9) Johny_v, не имеет значение, какой версией 1С пользоваться при создании объекта из библиотеки, хоть в приложении из Visual Studio, если для объекта отсутствует код методов. Не пудрите людям мозги!
11. Евгений _ (Johny_v) 14.01.15 08:03
(10) Разница есть. Моя компонента построена по технологии Native API, которая поддерживается 1С, начиная с версии 1С Предприятия 8. Поэтому в 1С 7.7 она работать не будет. А вот на 8.3 я ее не тестировал, постараюсь проверить в ближайшее время.

Компоненту здесь выкладывал по просьбе людей, которые ей тоже успешно пользуются.
Вы первый человек, у которого возникла такая проблема с ней.
Если Вам очень хочется что-то доказать, то прежде чем писать что это пустышка, попробуйте для начала запустить ее на платформе версии 8.2 для которой она разрабатывалась.
12. Евгений _ (Johny_v) 14.01.15 08:29
Перезалил архив с компонентой, в которой точно все работает
13. Андрей Лео (LeoAndrey) 03.02.15 13:45
Печатаю этикетки на ZPL из 1c таким незамысловатым способом:
Текст = Новый ЗаписьТекста(Путь,КодировкаТекста.OEM);
Текст.Записать(Шаблон);
Текст.Закрыть();

Где:
- Путь- куда отправляем текстовый код ZPL: порт принтера, сетевой путь или имя файла.
- КодировкаТекста.OEM - у меня работает с кодировкой текста ОЕМ.
- Шаблон - собственно текст программы на ZPL.
Novoross11; Basko; Johny_v; +3 Ответить 1
14. Саня Кошев (drat9) 01.07.16 10:44
(13) LeoAndrey, у меня сетевой принтер, никак не отправляет на него (нету доступа), приведите пример путь сетевой адрес+ порт + имя файла
15. Andrey (kentavr27) 24.10.16 19:05
Не могу не согласиться с одним из "ораторов"... Что-то здесь не то...
{Форма.Форма.Форма(31)}: Метод объекта не обнаружен (ОтправитьСтрокуДанныхНаПринтер)
Результат = СерверПечати.ОтправитьСтрокуДанныхНаПринтер(ИмяПринтера, ЭтикеткаТовара);


В реестре присутствует (зарегилась)
win XP, Тонкий клиент, 1С 8.3. В обычном приложении результат такой же...
Клиентский код:
	ЭтикеткаТовара = "^XA
	|^FO20,25
	|^A@N,10,9,^FDНаименование товара^FS
	|^FO20,49
	|^A@N,10,9,^FDАрт.123456789^FS
	|^FO20,73
	|^A@N,10,9,^FDПроизводитель:Фабрика^FS
	|^FO20,97
	|^FO50,187
	|^BY4^BEN,70,Y,N 
	|^FD4909500671160^FS
	|^XZ";
	
	//СерверПечати = Новый ("AddIn.VKV8MEA");
	СерверПечати = Новый COMОбъект("AddIn.VKV8MEA");
	ИмяПринтера = "\\192.168.20.253\TSC_TDP-245";
	Результат = СерверПечати.ОтправитьСтрокуДанныхНаПринтер(ИмяПринтера, ЭтикеткаТовара);
	Если НЕ Результат Тогда
		Сообщить("Ошибка печати этикетки");
	КонецЕсли;
...Показать Скрыть


На любой из приведенных методов -- ругается. Так все же, где собака порылась?
16. Евгений _ (Johny_v) 25.10.16 08:04
(15) kentavr27,
Добрый день. Какая конфигурация?
Какой тип переменной СервисПечати?
17. Евгений _ (Johny_v) 25.10.16 12:07
(15) kentavr27,
Для управляемых форм необходимо сначала подключить внешнюю компоненту, а потом уже создавать объект.
 ЭтикеткаТовара = "^XA
    |^FO20,25
    |^A@N,10,9,^FDНаименование товара^FS
    |^FO20,49
    |^A@N,10,9,^FDАрт.123456789^FS
    |^FO20,73
    |^A@N,10,9,^FDПроизводитель:Фабрика^FS
    |^FO20,97
    |^FO50,187
    |^BY4^BEN,70,Y,N 
    |^FD4909500671160^FS
    |^XZ";
	
	Если НЕ ПодключитьВнешнююКомпоненту("AddIn.VKV8MEA") Тогда
		Сообщить("Компонента печати этикеток не загружена");
	КонецЕсли;
	
    СерверПечати = Новый("AddIn.VKV8MEA");
    ИмяПринтера = "\\10.10.10.234\Zebra1";
    Результат = СерверПечати.ОтправитьСтрокуДанныхНаПринтер(ИмяПринтера, ЭтикеткаТовара);
    Если НЕ Результат Тогда
        Сообщить("Ошибка печати этикетки");
    КонецЕсли;
...Показать Скрыть
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа