Как исправить ошибку «Invalid barcode» при печати штрихкода GS1-128 в 1С?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При обновлении типовых конфигураций 1С (таких как «Бухгалтерия предприятия», «Управление торговлей», «ERP» и других) разработчики часто сталкиваются с неприятной проблемой: штрихкоды формата GS1-128 (или GS1 DataMatrix), которые ранее печатались без каких-либо нареканий, внезапно перестают выводиться на печать. Вместо графического штрихкода на этикетке или в печатной форме документа отображается пустая рамка с надписью «Invalid barcode» («Неверный штрихкод») или «Size too small».

В данной статье мы подробно проанализируем причины возникновения этой ошибки, разберем логику работы обновленных компонентов 1С и рассмотрим несколько практических способов решения проблемы.

Выясняем причину: что изменилось в обновлениях 1С?

Для генерации изображений штрихкодов в современных конфигурациях 1С используется библиотека стандартных подсистем (БСП) и входящая в её состав Библиотека подключаемого оборудования (БПО). Непосредственную визуализацию штрихкода выполняет внешняя компонента, которая хранится в общем макете под именем КомпонентаПечатиШтрихкодов.

Если мы сравним макеты из старых и новых релизов конфигураций, то увидим существенную разницу:

  1. Старая версия компоненты (размером около 2.8 МБ) была крайне «лояльна» к передаваемым данным. Она не выполняла глубокий синтаксический анализ структуры стандартов GS1 и генерировала картинку штрихкода даже в том случае, если строка была сформирована с небольшими отклонениями от спецификации.
  2. Новая версия компоненты (размером от 6.5 МБ и выше) получила полноценный строгий валидатор стандартов GS1. Теперь, если передаваемая строка не соответствует международным правилам кодирования GS1-128, компонента наотрез отказывается формировать изображение и возвращает ошибку «Invalid barcode».

Основным камнем преткновения при переходе на новую компоненту становятся круглые скобки в строке штрихкода. В спецификации GS1 круглыми скобками выделяются идентификаторы применения (Application Identifiers, AI). Например, в строке (01)04631143159919(3102)000180 скобки указывают, что 01 — это GTIN товара, а 3102 — вес брутто.

Однако новая компонента пытается парсить эти скобки для преобразования их во внутренние управляющие символы (такие как FNC1 и групповой разделитель GS с кодом ASCII 29). Если в процессе парсинга компонента натыкается на скобки в полях переменной длины (например, внутри серийного номера или номера партии) либо длина фиксированных полей не соответствует стандарту, валидатор завершает работу аварийно.

---

Способ 1. Программное форматирование строки (Рекомендуемый)

Самый правильный и долгосрочный метод решения проблемы — передавать в компоненту печати «чистые» данные без скобок, разделенные правильными управляющими символами, а текстовую подпись для человека (HRI — Human Readable Interpretation) выводить отдельно.

Проанализируем ситуацию: если мы передаем код в формате GS1, нам необходимо заменить круглые скобки на разделители групп данных. Разделителем в стандарте GS1 служит символ с ASCII-кодом 29. Напишем функцию предварительной подготовки строки штрихкода перед передачей в менеджер оборудования:


Функция ПодготовитьШтрихкодGS1(ИсходныйШтрихкод) Экспорт
    
    // Заменяем визуальные круглые скобки на правильные символы-разделители GS (ASCII 29)
    // Символ GS устанавливается перед идентификаторами применения переменной длины,
    // кроме самого первого идентификатора в строке.
    
    СимволGS = Символ(29);
    ОчищенныйКод = ИсходныйШтрихкод;
    
    // Удаляем скобки у первого идентификатора применения
    Если Лев(ОчищенныйКод, 1) = "(" Тогда
        ОчищенныйКод = Сред(ОчищенныйКод, 2);
        ОчищенныйКод = СтрЗаменить(ОчищенныйКод, ")", "", 1); // Удаляем только первую закрывающую скобку
    КонецЕсли;
    
    // Остальные скобки заменяем на разделитель групп GS
    ОчищенныйКод = СтрЗаменить(ОчищенныйКод, ")(", СимволGS);
    ОчищенныйКод = СтрЗаменить(ОчищенныйКод, "(", СимволGS);
    ОчищенныйКод = СтрЗаменить(ОчищенныйКод, ")", "");
    
    Возврат ОчищенныйКод;
    
КонецФункции

При использовании этого метода картинка штрихкода сформируется корректно. Чтобы под штрихкодом по-прежнему выводился привычный текст со скобками для сотрудников склада или покупателей, отключите автовывод текста в параметрах компоненты (установите свойство ОтображатьТекст = Ложь), а сам текст со скобками выводите в отдельную текстовую ячейку макета 1С под областью штрихкода.

---

Способ 2. Изменение типа штрихкода на обычный Code 128

Если на вашем предприятии штрихкод GS1-128 используется только для внутренних нужд (например, для локальной логистики и маркировки паллет) и жесткое соответствие стандартам ассоциации GS1 не проверяется внешними контрагентами, можно упростить задачу, переключив тип кодирования.

Обычный стандарт Code 128 (в отличие от GS1-128) не выполняет синтаксический разбор строки и позволяет кодировать абсолютно любые алфавитно-цифровые символы, включая круглые скобки, как простой текст.

Для реализации этого решения найдем в модуле печати место, где задаются параметры формирования штрихкода (обычно это вызов общего модуля МенеджерОборудованияВызовСервера или прямое заполнение структуры параметров), и заменим тип кода:


// Вместо типа кода GS1-128 (ТипКода = 2)
// Если ТипШтрихкода = Перечисления.ТипыШтрихкодов.GS1_128 Тогда
//     ТипКода = 2;
// КонецЕсли;

// Устанавливаем тип кода обычный Code 128 (ТипКода = 4)
Если ТипШтрихкода = Перечисления.ТипыШтрихкодов.GS1_128 Тогда
    ТипКода = 4; // Code 128
КонецЕсли;

После этого изменения новая компонента без проблем сгенерирует штрихкод, содержащий скобки. Сканеры на рабочих местах будут успешно считывать его, однако они вернут строку «как есть» — со скобками, без преобразования их в управляющие символы разделения GS1.

---

Способ 3. Временный откат на старую версию компоненты (Обходной путь)

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

Для этого выполним следующие действия по шагам:

  1. Откройте в конфигураторе старую резервную копию базы данных (до обновления конфигурации).
  2. Найдите в ветке метаданных Общие макеты макет с именем КомпонентаПечатиШтрихкодов.
  3. Нажмите на него правой кнопкой мыши и выберите пункт «Сохранить в файл...». Сохраните архив (обычно это zip-архив) на диск. Его размер должен быть в пределах 2.5–2.9 МБ.
  4. Откройте обновленную рабочую базу в конфигураторе. В целях безопасности не перезаписывайте типовой макет, чтобы не нарушать обновление. Вместо этого добавьте новый общий макет, назовите его, например, КомпонентаПечатиШтрихкодовСтарая и загрузите в него сохраненный файл.
  5. С помощью глобального поиска найдите в модулях конфигурации обращение к системному макету. Как правило, инициализация происходит в общем модуле МенеджерОборудованияВызовСервера.
  6. Внесите изменение в процедуру подключения компоненты, перенаправив её на ваш новый макет:

// Было в типовом коде:
// ОчиститьРабочееМестоComponent = ПолучитьОбщийМакет("КомпонентаПечатиШтрихкодов");

// Стало после изменения:
ОчиститьРабочееМестоComponent = ПолучитьОбщийМакет("КомпонентаПечатиШтрихкодовСтарая");

Этот способ быстро вернет работоспособность печати штрихкодов без изменения алгоритмов форматирования строк. Однако помните, что данный вариант является временным костылем. При переходе на обязательную государственную маркировку товаров (где строго требуется использование современных спецификаций GS1 DataMatrix и GS1-128 с корректной валидацией данных) настоятельно рекомендуется использовать Способ 1.

← На главную