Как решить проблемы с генерацией Data Matrix кодов в 1С с помощью Zint, включая ошибки "invalid AI" и обработку символов GS1 FNC1/GS?

Программист 1С v8.3 (Управляемые формы)
← На главную

При автоматизации различных процессов в 1С часто возникает необходимость в генерации штрихкодов, и Data Matrix является одним из самых востребованных форматов, особенно в контексте маркировки товаров. Интеграция внешних генераторов штрихкодов, таких как Zint, с 1С может вызывать определенные сложности. В этой статье мы подробно разберем типичные проблемы, с которыми сталкиваются разработчики, и предложим решения на основе опыта коллег и дополнительной информации.

Почему Zint не создает изображение или выдает ошибки при запуске из 1С?

Давайте рассмотрим ситуацию, когда при попытке вызвать zint.exe из 1С через функцию ЗапуститьПриложение, как показано в примере:


ЗапуститьПриложение(КаталогВременныхФайлов+"zint.exe -b 71 --gs1 -d "+""""+СтрЗаменить(СтрокаШК.ДатаМатрикс,"""","""""")+"""",КаталогВременныхФайлов,Истина);

у нас не формируется изображение. Это распространенная проблема, которая может быть вызвана несколькими причинами. Проанализируем возможные шаги для диагностики и устранения.

  1. Проверка наличия и пути к исполняемому файлу Zint: Первым делом, убедитесь, что файл zint.exe действительно находится в указанном каталоге (в нашем случае, КаталогВременныхФайлов). Часто файл может быть помещен в макет обработки, а затем извлечен в временный каталог. Если вы вызываете Zint и в этом каталоге появляется файл, это подтверждает, что исполняемый файл доступен и запускается.
  2. Запуск из командной строки Windows: Критически важно проверить, работает ли команда Zint напрямую из командной строки Windows, независимо от 1С. Откройте командную строку (желательно от имени администратора) и попробуйте выполнить ту же команду, что передаете в ЗапуститьПриложение. Например:
    
    C:\Users\f\AppData\Local\Temp\zint.exe -b 71 --gs1 -d "[01]02900000458659[21]TDGuv?[][]"
    

    Если команда работает, и изображение генерируется, значит проблема кроется в особенностях вызова из 1С или в передаче параметров. Если же командная строка выдает ошибку, как в примере invalid AI in input data, мы переходим к следующему пункту.

  3. Права доступа и каталог: Убедитесь, что у пользователя, под которым запускается 1С (или веб-сервер, если это серверный вызов), есть достаточные права для записи в КаталогВременныхФайлов и запуска zint.exe. Иногда помогает перемещение исполняемого файла Zint в более доступный каталог, например, в домашнюю папку пользователя, а также использование пути, содержащего только латинские символы, чтобы избежать проблем с кодировкой.
  4. Параметр Истина в ЗапуститьПриложение: Параметр Истина в функции ЗапуститьПриложение указывает на синхронный запуск, то есть 1С будет ждать завершения выполнения Zint. Это может быть полезно для отладки, но убедитесь, что Zint действительно завершается и не зависает.
  5. Экранирование кавычек: В приведенном примере мы видим двойное экранирование кавычек: "+"&""""+СтрЗаменить(СтрокаШК.ДатаМатрикс,"""","""""")+""""+"". Убедитесь, что результирующая строка для Zint корректно формирует аргументы, особенно если данные штрихкода (СтрокаШК.ДатаМатрикс) сами содержат кавычки. Функция СтрЗаменить(СтрокаШК.ДатаМатрикс,"""","""""") должна правильно преобразовывать внутренние кавычки.

Как показывает опыт, после тщательной проверки этих пунктов, проблема с "не создает в темпе картинку" обычно решается. Пользователь в нашем случае подтвердил, что "с zintом разобрался. формирует датаматрикс. все супер." — это свидетельствует о том, что перечисленные шаги привели к успеху.

Разбираемся с ошибкой "Invalid AI in input data" в 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?[][]"

Здесь мы видим несколько потенциальных проблем:

  1. Формат Идентификаторов Применения (AI): В GS1 Data Matrix идентификаторы применения (AI) должны быть заключены в квадратные скобки []. Это требование соблюдено в примере ([01], [21]). Однако, Zint может быть очень строг к их содержимому.
  2. Длина данных для AI: Каждый AI имеет фиксированную или переменную длину данных. Например, (01) (GTIN) имеет фиксированную длину 14 цифр. (21) (Серийный номер) имеет переменную длину до 20 символов. Если Zint обнаруживает, что длина данных после AI не соответствует стандарту, он выдаст ошибку. В нашем примере [01]02900000458659 имеет 14 цифр, что корректно для GTIN. Однако, [21]TDGuv?[][] содержит странные символы и пустые квадратные скобки [][] в конце, что однозначно является некорректным синтаксисом или неверными данными для AI [21].
  3. Содержимое данных для AI: Некоторые AI требуют строго цифровых данных, другие допускают буквенно-цифровые. Zint проверяет это соответствие. В примере TDGuv? содержит буквы и знак вопроса, что для серийного номера (AI 21) допустимо, но сами [][] в конце строки являются серьезной ошибкой.
  4. Строгая проверка GS1: Zint обладает довольно строгой проверкой данных GS1. Он может выдавать ошибки, если AI слишком короткий, имеет неверную длину данных или используются буквы там, где требуются цифры (например, для AI 10 - номер партии, который должен быть буквенно-цифровым, но имеет определенные ограничения).

Как исправить ошибку "Invalid AI in input data":

  1. Тщательная проверка данных GS1: Самый главный шаг — это убедиться, что строка данных, передаваемая в Zint, полностью соответствует спецификации GS1 Data Matrix. Проверьте каждый AI и его соответствующее значение: его длину, тип символов и правильное расположение разделителей.
  2. Удаление некорректных символов: В приведенном примере [21]TDGuv?[][], крайне вероятно, что [][] в конце строки являются ошибочными и должны быть удалены. Проверьте, что в конце вашей строки нет лишних символов, пустых скобок или неверно сформированных AI.
  3. Использование опции GS1NOCHECK_MODE: Для обхода строгой проверки GS1 в Zint существует специальная опция GS1NOCHECK_MODE. Эта опция позволяет пропускать некоторые проверки валидности данных (например, неверную длину данных или использование букв там, где требуются цифры). Однако мы должны использовать эту опцию с осторожностью, поскольку она предназначена для совместимости с устаревшими приложениями, которые могут не полностью соответствовать стандарту GS1. Ее применение может привести к генерации штрихкодов, которые не будут корректно считываться или обрабатываться стандартным ПО. Мы рекомендуем использовать ее только после того, как все остальные методы проверки и исправления данных исчерпаны, и только если вы уверены в источнике данных.
  4. Обновление Zint: Убедитесь, что вы используете последнюю версию Zint, так как ошибки в реализации GS1 Data Matrix могли быть исправлены в более новых версиях.

После устранения синтаксических ошибок в строке данных GS1, Zint должен успешно сгенерировать штрихкод без сообщения invalid AI in input data.

Особенности использования символов FNC1 и GS (Group Separator) в GS1 Data Matrix с Zint

После того, как мы разобрались с генерацией изображения, может возникнуть следующая проблема, о которой сообщил пользователь: "не добавляет спец символ GS. При сканировании ДМ вначале есть спец символ FNC1, а перед кодом проверки GS нет". Давайте подробно разберем, как Zint работает с управляющими символами GS1 FNC1 и GS.

  1. Роль FNC1 в GS1 Data Matrix:
    • Стартовый символ: В GS1 Data Matrix управляющий символ FNC1 используется сразу после стартового символа для уникальной идентификации. Он служит признаком того, что штрихкод соответствует стандартам GS1.
    • Разделитель полей: FNC1 также используется как разделитель полей для строк элементов переменной длины. Например, если у вас есть AI с переменной длиной (такие как серийный номер (21) или номер партии (10)), FNC1 ставится после него, чтобы указать конец этого поля и начало следующего.
  2. Декодирование FNC1 сканером:
    • Первый FNC1: Первый символ FNC1 в Data Matrix, соответствующем стандарту GS1, декодируется сканером как ]d2. Это префикс, который указывает на тип штрихкода и его соответствие GS1.
    • Последующие FNC1: Все последующие символы FNC1, используемые как разделители полей переменной длины, декодируются сканером как управляющий символ <GS> (Group Separator, ASCII 29, 1D в шестнадцатеричном формате).
  3. Работа с FNC1 и GS в Zint:
    • Использование --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): Несмотря на то, что стандарт GS1 требует использования FNC1, передаваемые данные будут одинаковыми, если вместо FNC1 будет закодирован <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С

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

  1. Актуальная версия Zint: Всегда используйте последнюю стабильную версию Zint. Разработчики постоянно исправляют ошибки и добавляют новые функции, что может решить многие проблемы, с которыми вы сталкиваетесь.
  2. Экранирование специальных символов: Если ваши данные для кодирования содержат непечатаемые или специальные символы (например, символ перевода строки, символ табуляции), Zint позволяет вводить их с помощью обратной косой черты \ как escape-символа (например, \n для новой строки) или тильдовых кодов (например, ~1 для FNC1).
  3. Кодировка входных данных: По умолчанию Zint ожидает, что входные данные закодированы в UTF-8. Если вы передаете данные в другой кодировке (например, CP1251), Zint может некорректно их интерпретировать, что приведет к ошибкам или неправильному штрихкоду. Убедитесь, что строка, формируемая в 1С, передается в Zint в корректной кодировке, или явно укажите ее с помощью опций Zint (если такие предусмотрены для Data Matrix).
  4. Тестирование вне 1С: Прежде чем интегрировать Zint в 1С, всегда тестируйте команду Zint в командной строке Windows. Это позволяет исключить проблемы, связанные с 1С, и сосредоточиться на правильности параметров и данных для Zint.
  5. Обработка ошибок: В 1С рекомендуется добавлять обработку ошибок для вызова ЗапуститьПриложение, чтобы понимать, если Zint не запустился или вернул код ошибки.

Альтернативные решения для генерации Data Matrix в 1С

Хотя Zint является мощным и гибким инструментом с открытым исходным кодом, иногда его интеграция может быть сложной, особенно если требуются специфические настройки или высокая производительность. В обсуждении упоминается, что "Самая лучшая без zint Можно установить пустую конфу и пользоваться для распечатки. Очень удобно и без ошибок." Это намекает на существование других, возможно, более интегрированных или специализированных решений для 1С.

Давайте рассмотрим некоторые из них:

  1. Встроенные механизмы 1С: В некоторых конфигурациях 1С (особенно в последних версиях) могут быть предусмотрены встроенные библиотеки или компоненты для генерации штрихкодов, которые не требуют внешних исполняемых файлов. Мы можем проверить документацию к нашей конфигурации или типовые обработки.
  2. Коммерческие библиотеки и компоненты: На рынке существует множество сторонних коммерческих продуктов и библиотек для генерации штрихкодов, которые предлагают SDK или COM-объекты для интеграции в 1С. Среди них:
    • TEC-IT Barcode Generator: Предлагает как онлайн-генераторы, так и SDK для интеграции, поддерживает Data Matrix и GS1 DataBar.
    • IDAutomation Data Matrix products: Известны своей поддержкой GS1 AI (Application Identifiers) и FNC1, что критически важно для маркировки.
    • Morovia products: Также способны генерировать ECC200 Data Matrix с различными опциями.

    Эти решения часто более стабильны, имеют лучшую документацию и поддержку, но требуют дополнительных затрат.

  3. Библиотеки с открытым исходным кодом (кроме Zint): Некоторые другие библиотеки, такие как Okapi Barcode, упоминаются как хорошо работающие альтернативы для генерации GS1 Data Matrix, в отличие от некоторых других (например, ZXing), которые могут быть не полностью совместимы с GS1. Мы можем рассмотреть возможность их обертки в COM-обпонент или DLL для использования из 1С.

При выборе альтернативного решения, мы должны учитывать следующие факторы:

Выбрав наиболее подходящее решение и следуя нашим рекомендациям, мы сможем успешно наладить процесс генерации Data Matrix штрихкодов в 1С.

← На главную