При автоматизации различных процессов в 1С часто возникает необходимость в генерации штрихкодов, и Data Matrix является одним из самых востребованных форматов, особенно в контексте маркировки товаров. Интеграция внешних генераторов штрихкодов, таких как Zint, с 1С может вызывать определенные сложности. В этой статье мы подробно разберем типичные проблемы, с которыми сталкиваются разработчики, и предложим решения на основе опыта коллег и дополнительной информации.
Давайте рассмотрим ситуацию, когда при попытке вызвать zint.exe из 1С через функцию ЗапуститьПриложение, как показано в примере:
ЗапуститьПриложение(КаталогВременныхФайлов+"zint.exe -b 71 --gs1 -d "+""""+СтрЗаменить(СтрокаШК.ДатаМатрикс,"""","""""")+"""",КаталогВременныхФайлов,Истина);
у нас не формируется изображение. Это распространенная проблема, которая может быть вызвана несколькими причинами. Проанализируем возможные шаги для диагностики и устранения.
zint.exe действительно находится в указанном каталоге (в нашем случае, КаталогВременныхФайлов). Часто файл может быть помещен в макет обработки, а затем извлечен в временный каталог. Если вы вызываете Zint и в этом каталоге появляется файл, это подтверждает, что исполняемый файл доступен и запускается.ЗапуститьПриложение. Например:
C:\Users\f\AppData\Local\Temp\zint.exe -b 71 --gs1 -d "[01]02900000458659[21]TDGuv?[][]"
Если команда работает, и изображение генерируется, значит проблема кроется в особенностях вызова из 1С или в передаче параметров. Если же командная строка выдает ошибку, как в примере invalid AI in input data, мы переходим к следующему пункту.
КаталогВременныхФайлов и запуска zint.exe. Иногда помогает перемещение исполняемого файла Zint в более доступный каталог, например, в домашнюю папку пользователя, а также использование пути, содержащего только латинские символы, чтобы избежать проблем с кодировкой.Истина в ЗапуститьПриложение: Параметр Истина в функции ЗапуститьПриложение указывает на синхронный запуск, то есть 1С будет ждать завершения выполнения Zint. Это может быть полезно для отладки, но убедитесь, что Zint действительно завершается и не зависает."+"&""""+СтрЗаменить(СтрокаШК.ДатаМатрикс,"""","""""")+""""+"". Убедитесь, что результирующая строка для Zint корректно формирует аргументы, особенно если данные штрихкода (СтрокаШК.ДатаМатрикс) сами содержат кавычки. Функция СтрЗаменить(СтрокаШК.ДатаМатрикс,"""","""""") должна правильно преобразовывать внутренние кавычки.Как показывает опыт, после тщательной проверки этих пунктов, проблема с "не создает в темпе картинку" обычно решается. Пользователь в нашем случае подтвердил, что "с zintом разобрался. формирует датаматрикс. все супер." — это свидетельствует о том, что перечисленные шаги привели к успеху.
Одна из наиболее частых ошибок при генерации GS1 Data Matrix с помощью Zint — это сообщение invalid AI in input data (Неверный AI во входных данных). Данная ошибка указывает на проблему с синтаксисом или длиной идентификаторов применения (Application Identifiers, AI) в данных GS1.
Давайте проанализируем пример команды, вызвавшей эту ошибку:
C:\Users\f\AppData\Local\Temp\zint.exe -b 71 --gs1 -d "[01]02900000458659[21]TDGuv?[][]"
Здесь мы видим несколько потенциальных проблем:
[]. Это требование соблюдено в примере ([01], [21]). Однако, Zint может быть очень строг к их содержимому.(01) (GTIN) имеет фиксированную длину 14 цифр. (21) (Серийный номер) имеет переменную длину до 20 символов. Если Zint обнаруживает, что длина данных после AI не соответствует стандарту, он выдаст ошибку. В нашем примере [01]02900000458659 имеет 14 цифр, что корректно для GTIN. Однако, [21]TDGuv?[][] содержит странные символы и пустые квадратные скобки [][] в конце, что однозначно является некорректным синтаксисом или неверными данными для AI [21].TDGuv? содержит буквы и знак вопроса, что для серийного номера (AI 21) допустимо, но сами [][] в конце строки являются серьезной ошибкой.10 - номер партии, который должен быть буквенно-цифровым, но имеет определенные ограничения).Как исправить ошибку "Invalid AI in input data":
[21]TDGuv?[][], крайне вероятно, что [][] в конце строки являются ошибочными и должны быть удалены. Проверьте, что в конце вашей строки нет лишних символов, пустых скобок или неверно сформированных AI.GS1NOCHECK_MODE: Для обхода строгой проверки GS1 в Zint существует специальная опция GS1NOCHECK_MODE. Эта опция позволяет пропускать некоторые проверки валидности данных (например, неверную длину данных или использование букв там, где требуются цифры). Однако мы должны использовать эту опцию с осторожностью, поскольку она предназначена для совместимости с устаревшими приложениями, которые могут не полностью соответствовать стандарту GS1. Ее применение может привести к генерации штрихкодов, которые не будут корректно считываться или обрабатываться стандартным ПО. Мы рекомендуем использовать ее только после того, как все остальные методы проверки и исправления данных исчерпаны, и только если вы уверены в источнике данных.После устранения синтаксических ошибок в строке данных GS1, Zint должен успешно сгенерировать штрихкод без сообщения invalid AI in input data.
После того, как мы разобрались с генерацией изображения, может возникнуть следующая проблема, о которой сообщил пользователь: "не добавляет спец символ GS. При сканировании ДМ вначале есть спец символ FNC1, а перед кодом проверки GS нет". Давайте подробно разберем, как Zint работает с управляющими символами GS1 FNC1 и GS.
(21) или номер партии (10)), FNC1 ставится после него, чтобы указать конец этого поля и начало следующего.]d2. Это префикс, который указывает на тип штрихкода и его соответствие GS1.<GS> (Group Separator, ASCII 29, 1D в шестнадцатеричном формате).--gs1: Опция --gs1 (которую мы видели в примере команды) указывает Zint, что мы кодируем данные в формате GS1. В этом режиме Zint автоматически добавляет первый FNC1 как стартовый символ.~1 для FNC1: Для указания FNC1 в кодируемых данных как разделителя полей, Zint использует тильдовый код ~1. Например, если нам нужно закодировать GTIN и серийный номер, то строка может выглядеть так:
"[01]02900000458659~1[21]TDGuv?"
Здесь ~1 будет интерпретирован Zint как FNC1-разделитель.
--gssep: Zint также предоставляет опцию --gssep, которая указывает использовать разделитель <GS> (ASCII 29) для данных GS1 Data Matrix вместо FNC1. Это может быть полезно, если ваше сканирующее оборудование или принимающая система ожидает именно ASCII 29.<GS> (ASCII 29) как разделитель. Это связано с тем, что сканер всегда преобразует FNC1 (кроме первого) в <GS> при передаче данных. В некоторых случаях, из-за особенностей реализации в программном обеспечении для дизайна этикеток или в 1С, может быть проще закодировать <GS> напрямую, чем FNC1 в качестве разделителя. Для этого в 1С можно использовать функцию Символ(29):
СтрокаДляZint = "[01]02900000458659" + Символ(29) + "[21]TDGuv?";
// Далее используем СтрокаДляZint в команде zint.exe
Этот подход может быть более наглядным и предсказуемым, если возникают сложности с ~1.
Если пользователь говорит, что "перед кодом проверки GS нет", это, скорее всего, означает, что FNC1, который должен выступать в роли разделителя поля переменной длины, отсутствует в закодированных данных. Мы должны внимательно проверить структуру нашей входной строки для Zint и убедиться, что все необходимые разделители FNC1 (или их эквиваленты <GS>) присутствуют.
Для успешной и стабильной работы с Zint из 1С, мы рекомендуем придерживаться следующих практических советов:
\ как escape-символа (например, \n для новой строки) или тильдовых кодов (например, ~1 для FNC1).ЗапуститьПриложение, чтобы понимать, если Zint не запустился или вернул код ошибки.Хотя Zint является мощным и гибким инструментом с открытым исходным кодом, иногда его интеграция может быть сложной, особенно если требуются специфические настройки или высокая производительность. В обсуждении упоминается, что "Самая лучшая без zint Можно установить пустую конфу и пользоваться для распечатки. Очень удобно и без ошибок." Это намекает на существование других, возможно, более интегрированных или специализированных решений для 1С.
Давайте рассмотрим некоторые из них:
Эти решения часто более стабильны, имеют лучшую документацию и поддержку, но требуют дополнительных затрат.
При выборе альтернативного решения, мы должны учитывать следующие факторы:
Выбрав наиболее подходящее решение и следуя нашим рекомендациям, мы сможем успешно наладить процесс генерации Data Matrix штрихкодов в 1С.