Маркировка: Автоматическая печать наклеек из 1С на EZPL

Число просмотров: 1,944 
3 оценки, среднее: 5.00 из 53 оценки, среднее: 5.00 из 53 оценки, среднее: 5.00 из 53 оценки, среднее: 5.00 из 53 оценки, среднее: 5.00 из 5 (3 голосов, средний: 5.00 из 5)
Вы должны быть зарегистрированным пользователем чтобы голосовать за эту запись.

Материалы для щитов, помеченные автоматическими наклейками

Продолжаем издеваться над принтером этикеток Godex G500, для которого можно печатать этикетки при помощи программы GoLabel (я рассказывал про неё только что). Повторю кратко. Принтер имеет свой внутренний язык, при помощи которого ему можно сказать: “А начерти-ка вот тут вот прямугольник, а тут – QR-код, а тут – текст!”. Этот язык текстовый, и такая фишка характерна для практически всех принтеров штрих-кодов или этикеток. А раз язык текстовый – то всё это дело можно автоматизировать!

В самом идеале пользователь (ну в данном случае я сам, хотя подруга уже зубы точит это всё в своём магическом магазинчике использовать) должен ни о каких языках не знать и только заправлять правильную этикетку в принтер и нажимать кнопку “Напечатать”. И вот для того, чтобы это всё сделать – и сделать универсально (это значит что этикетка не должна быть закодирована в программе жёстко, а должна быть возможность нафигачить кучу любых шаблонов), мне понадобилась пара недель бессонных ночей и взрыва головы. Потому что всё всегда начинается с проектирования интерфейса печаталки, а его и надо было выдумать так, чтобы можно было легко печатать всё что попало, но и ещё и заточить его под печать этикеток для щитов.

Вот чего у меня получилось как конечный результат:

Система печати наклеек для электрощита (CS CRM)

Есть обработка, которая вызывается для разных частей базы (номенклатура, заказ, контрагент, щит) и в которой можно повыбирать разные шаблоны для печати. Также можно подкорректировать положение этикетки, если она вдруг уехала. А для того, чтобы можно было всё это проверять, есть кнопочка “Тест”: она печатает одну копию текущего шаблона с тестовыми даными. Кнопка “Печать” выдаёт уже чистовую этикетку с указанным числом копий.

А ещё все эти настройки (смещение этикетки, копии) запоминаются для каждого шаблона отдельно. Причём если речь идёт о щите (или другом документе, который можно сохранить), то это всё ещё и сохраняется для каждого щита по своему. Мне это удобно, чтобы подстраивать количство этикеток с материалами под количество материалов щита или под другие задачи. Код который печатает на WAGOвских расходниках, я пока не написал, потому что сейчас у меня завал сборок щитов. Но там осталось сделать немного – сам интерфейс готов, а это здорово.

Ещё я заложил фишку, чтобы можно было допечатывать какие-нибудь элементы маркировки. Ну вот скажем, наклеиваешь ты эти Q1, Q2.. и вдруг на Q20 наклейка подвела и нужна ещё одна копия. Вот в ручном режиме можно набить нужные элементы, и система напечатает только их. Так же для ручного режима будут свои хитрые шаблоны, чтобы нестандартные шильдики печатать (например для маркировки кабельных держателей).

Система печати наклеек для электрощита в ручном режиме (CS CRM)

Настройки тут тоже хранятся для каждого шаблона отдельно. Причём ещё и отдельно от шаблонов автоматической маркировки. Вот как раз все эти списки и код сохранения-восстановления настроек я долго и писал. Дальше уже всё идёт легче.

А самое для меня главное – это то, что моя система при помощи хитрой утилитки, которую я сам и написал, умеет работать с USB и LAN-принтерами и ещё и формирует нормальные задания на печать:

Задания печати хранятся в очереди принтера, если их надо повторить

Так что всякие штуки типа автономной работы принтера или повторения заданий печати поддерживаются на уровне Windows. Но Вот сами команды принтеру передаются в RAW-формате на языке EZPL, так что слать на принтер можно что попало. Причём эта утилитка не обрабатывает сами команды, а просто выдаёт текстовый файл в принтер. Поэтому она сгодится и под другие языки и принтеры.

В итоге теперь я получил то, что хотел. Я заправляю в принтер нужные мне этикетки. Открываю например силовой щит, открываю печать маркировки и выбираю там нужный шаблон. Например “Материалы (100х60)”. Нажимаю кнопку “Тест”, чтобы проверить что принтер настроился на новый размер этикеток. А потом вписываю число копий и жму “Печать”. И всё. А потом остаётся только наклеить этикетки на товары, чтобы ничего не перепутать.

Напечатанные большие этикетки на материалы

Как это всё работает? Вспоминаем EZPL и то, с чего это всё начиналось. Мы рисуем в GoLabel нужную нам этикетку с “рыбой”-заполненными хрен чем полями типа “Вася Пупкин” или “Название щита”. Всё это прямо из GoLabel экспортируется в текстовые команды EZPL (и при помощи же GoLabel в принтер загружаются все шрифты и графика).

Команды на языке EZPL для принтеров GODEX

В 1Ске у меня есть хитрый справочник “Шаблоны системы”, в котором прописывается куча разных параметров: и цвета раскраски таблиц, и всякие правила создания штрих-кодов для документов. Вот там же прописываются шаблоны. Для каждого объекта может быть неограниченное число шаблонов. Программа определяет тот объект, с которым мы щас работает, и считывает только его шаблоны.

Сам шаблон – это тупо текстовый файл в кодировке Wndows-1251, который редактируется обычным блокнотом или другим редактором. В моих шаблонах поддерживаются комментарии: для этого строка должна ВСЕГДА начинаться с символа “;”. Такая строка просто вырезается из шаблона и всё.

Корректировка смещения этикетки делается при помощи макросов $TPL_POSX() и $TPL_POSY. Пока я их не вводил в шаблоны, но на отладке проверял. Для того чтобы 1Ска умела сдвигать этикетку, надо все координаты всех объектов обернуть в эти макросы. Тогда она считает эти координаты и подставит прибавит или отнимет указанные нами смещения. Вот как раз скриншот из шаблона, где это описано:

Внутренний шаблон этикеток (пояснение позиции этикетки)

Ну а дальше в шаблоне есть кучка полей на все случаи жизни:

Внутренний шаблон этикеток (пояснение полей этикетки)

Причём если перед названием поля воткнуть префикс “UTF_”, то поле будет закодировано в UTF-8. Это иногда надо для случаев, если в принтере загружен какой-то нестандартный шрифт с хитрой кодовой таблицей. То есть $TPL_KONTR_NAME даст имя контрагента в Windows-1251, а $TPL_UTF_KONTR_NAME даст имя контрагента в UTF-8.

В итоге, если сделать простой шаблон, то нам надо только выдернуть из GoLabel команды EZPL, а потом вместо “НАЗВАНИЕ КОНТРАГЕНТА” подставить что-то типа $TPL_KONTR_NAME. Это может выглядеть так:

Пример EZPL-кода в шаблоне для печати этикетки на щит

А вот так выглядит отпечатаный шаблон материалов, который я верстал в GoLabel, когда писал про эту программу пост.

Распечатанная этикетка на материалы

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

Распечатанные этикетки на папки с документами по щитам

Вот такая вот система получилась! Потом её ещё допишу для других объектов 1Ски и тогда уже буду вообще напрямую печатать ещё и внутреннюю маркировку проводов и модульки щита. А в третьем посте я расскажу и выложу ту самую утилитку.

2 Отзывов на “Маркировка: Автоматическая печать наклеек из 1С на EZPL”


  • 1 EvilGremlin

    Круть. Ещё бы в опенсорс это всё :) Кстати, неплохо было бы иметь возможность задавать свой принтер для каждого размера этикетки. Это когда карман отяжелеет и рулоны менять надоест :)

  • 2 CS  [Москва / Одинцово]

    Да не получится из этого опенсорс. Не потому что жадность, а потому что сама фигня из которой берутся данные, в моей базе уникальна.
    А сам код состоит тупо из цепочки
    СтрТекст = СтрЗаменить(СтрТекст, "$TPL_XXX", хххх.ххх);
    Где хххх.ххх – это какие-нить “ТекущийЩит.Название”.
    А потом это сохраняется в файл и запускается прога:
    НазваниеЗадания = "Щит " + СокрЛП(ТекВладелец.НомерДок) + " [" + ТекНазвание + "] - " + ТекШаблон.Название + ?(ТипПечати = "Т", " (тест)", "");
    ПутьУтилиты = СтрЗаменить(СтрЗаменить(СокрЛП(Константа.ПринтерЭтикетокПутьУтилиты), "$IBDir", КаталогИБ()), "\\", "\");
    СтрКоманда = """" + ПутьУтилиты + """ """ + НазваниеПринтера + """ """ + НазваниеЗадания + """ """ + ФайлКоманд + """";
    ЗапуститьПриложение(СтрКоманда);

    и всё.

Оставить отзыв

Вы должны войти на блог, чтобы оставить комментарий.