При обновлении типовых конфигураций 1С (таких как «Бухгалтерия предприятия», «Управление торговлей», «ERP» и других) разработчики часто сталкиваются с неприятной проблемой: штрихкоды формата GS1-128 (или GS1 DataMatrix), которые ранее печатались без каких-либо нареканий, внезапно перестают выводиться на печать. Вместо графического штрихкода на этикетке или в печатной форме документа отображается пустая рамка с надписью «Invalid barcode» («Неверный штрихкод») или «Size too small».
В данной статье мы подробно проанализируем причины возникновения этой ошибки, разберем логику работы обновленных компонентов 1С и рассмотрим несколько практических способов решения проблемы.
Для генерации изображений штрихкодов в современных конфигурациях 1С используется библиотека стандартных подсистем (БСП) и входящая в её состав Библиотека подключаемого оборудования (БПО). Непосредственную визуализацию штрихкода выполняет внешняя компонента, которая хранится в общем макете под именем КомпонентаПечатиШтрихкодов.
Если мы сравним макеты из старых и новых релизов конфигураций, то увидим существенную разницу:
Основным камнем преткновения при переходе на новую компоненту становятся круглые скобки в строке штрихкода. В спецификации GS1 круглыми скобками выделяются идентификаторы применения (Application Identifiers, AI). Например, в строке (01)04631143159919(3102)000180 скобки указывают, что 01 — это GTIN товара, а 3102 — вес брутто.
Однако новая компонента пытается парсить эти скобки для преобразования их во внутренние управляющие символы (такие как FNC1 и групповой разделитель GS с кодом ASCII 29). Если в процессе парсинга компонента натыкается на скобки в полях переменной длины (например, внутри серийного номера или номера партии) либо длина фиксированных полей не соответствует стандарту, валидатор завершает работу аварийно.
---
Самый правильный и долгосрочный метод решения проблемы — передавать в компоненту печати «чистые» данные без скобок, разделенные правильными управляющими символами, а текстовую подпись для человека (HRI — Human Readable Interpretation) выводить отдельно.
Проанализируем ситуацию: если мы передаем код в формате GS1, нам необходимо заменить круглые скобки на разделители групп данных. Разделителем в стандарте GS1 служит символ с ASCII-кодом 29. Напишем функцию предварительной подготовки строки штрихкода перед передачей в менеджер оборудования:
Функция ПодготовитьШтрихкодGS1(ИсходныйШтрихкод) Экспорт
// Заменяем визуальные круглые скобки на правильные символы-разделители GS (ASCII 29)
// Символ GS устанавливается перед идентификаторами применения переменной длины,
// кроме самого первого идентификатора в строке.
СимволGS = Символ(29);
ОчищенныйКод = ИсходныйШтрихкод;
// Удаляем скобки у первого идентификатора применения
Если Лев(ОчищенныйКод, 1) = "(" Тогда
ОчищенныйКод = Сред(ОчищенныйКод, 2);
ОчищенныйКод = СтрЗаменить(ОчищенныйКод, ")", "", 1); // Удаляем только первую закрывающую скобку
КонецЕсли;
// Остальные скобки заменяем на разделитель групп GS
ОчищенныйКод = СтрЗаменить(ОчищенныйКод, ")(", СимволGS);
ОчищенныйКод = СтрЗаменить(ОчищенныйКод, "(", СимволGS);
ОчищенныйКод = СтрЗаменить(ОчищенныйКод, ")", "");
Возврат ОчищенныйКод;
КонецФункции
При использовании этого метода картинка штрихкода сформируется корректно. Чтобы под штрихкодом по-прежнему выводился привычный текст со скобками для сотрудников склада или покупателей, отключите автовывод текста в параметрах компоненты (установите свойство ОтображатьТекст = Ложь), а сам текст со скобками выводите в отдельную текстовую ячейку макета 1С под областью штрихкода.
---
Если на вашем предприятии штрихкод GS1-128 используется только для внутренних нужд (например, для локальной логистики и маркировки паллет) и жесткое соответствие стандартам ассоциации GS1 не проверяется внешними контрагентами, можно упростить задачу, переключив тип кодирования.
Обычный стандарт Code 128 (в отличие от GS1-128) не выполняет синтаксический разбор строки и позволяет кодировать абсолютно любые алфавитно-цифровые символы, включая круглые скобки, как простой текст.
Для реализации этого решения найдем в модуле печати место, где задаются параметры формирования штрихкода (обычно это вызов общего модуля МенеджерОборудованияВызовСервера или прямое заполнение структуры параметров), и заменим тип кода:
// Вместо типа кода GS1-128 (ТипКода = 2)
// Если ТипШтрихкода = Перечисления.ТипыШтрихкодов.GS1_128 Тогда
// ТипКода = 2;
// КонецЕсли;
// Устанавливаем тип кода обычный Code 128 (ТипКода = 4)
Если ТипШтрихкода = Перечисления.ТипыШтрихкодов.GS1_128 Тогда
ТипКода = 4; // Code 128
КонецЕсли;
После этого изменения новая компонента без проблем сгенерирует штрихкод, содержащий скобки. Сканеры на рабочих местах будут успешно считывать его, однако они вернут строку «как есть» — со скобками, без преобразования их в управляющие символы разделения GS1.
---
Если у вас нет возможности или времени оперативно переписывать программный код модулей печати (например, база находится на жесткой поддержке, или изменения нужно внести прямо сейчас в работающей системе), можно временно вернуть старую версию компоненты печати штрихкодов.
Для этого выполним следующие действия по шагам:
КомпонентаПечатиШтрихкодов.КомпонентаПечатиШтрихкодовСтарая и загрузите в него сохраненный файл.МенеджерОборудованияВызовСервера.
// Было в типовом коде:
// ОчиститьРабочееМестоComponent = ПолучитьОбщийМакет("КомпонентаПечатиШтрихкодов");
// Стало после изменения:
ОчиститьРабочееМестоComponent = ПолучитьОбщийМакет("КомпонентаПечатиШтрихкодовСтарая");
Этот способ быстро вернет работоспособность печати штрихкодов без изменения алгоритмов форматирования строк. Однако помните, что данный вариант является временным костылем. При переходе на обязательную государственную маркировку товаров (где строго требуется использование современных спецификаций GS1 DataMatrix и GS1-128 с корректной валидацией данных) настоятельно рекомендуется использовать Способ 1.