Почему распечатанный из 1С штрихкод Code 128 / GS1-128 не читается сканером и как убрать лишние пробелы и символы при сканировании?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При внедрении складского штрихкодирования на автозапчастях или в логистических центрах ИТ-специалисты часто сталкиваются со следующей проблемой: при сканировании оригинального заводского кода детали к основному номеру добавляются несколько пробелов и суффикс (например, " 001"). Если попытаться записать этот штрихкод в карточку номенклатуры в 1С «как есть» и затем распечатать этикетку на принтере, то распечатанный штрихкод перестает считываться сканером. При этом обычные потребительские штрихкоды типа EAN-13 сканируются, печатаются и находятся в системе без каких-либо сложностей.

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

Причина №1: Анатомия стандарта GS1-128 (UCC/EAN-128)

Оригинальные штрихкоды на коробках автозапчастей (особенно оригинальных деталей брендов Hyundai, Kia, VAG, Toyota) практически никогда не шифруются в простом формате EAN-13. В логистической сфере повсеместно применяется стандарт GS1-128 (ранее известный как UCC/EAN-128), базирующийся на линейном коде Code 128.

Этот стандарт позволяет кодировать в одной графической области не только артикул товара, но и сопутствующие данные: партию, дату производства, серийный номер, вес, а также количество единиц товара в упаковке. Для разделения этих данных используются специальные идентификаторы применения (Application Identifiers — AI), которые берутся в круглые скобки в текстовом представлении под штрихкодом.

В рассматриваемой нами ситуации штрихкод имеет структуру: КодДетали + Разделитель + КоличествоВУпаковке. Когда сканер считывает оригинальный код "2630035505 001", цифры "2630035505" означают каталожный номер (артикул) запчасти, а суффикс "001" указывает на то, что в данной упаковке находится ровно одна штука детали. Между ними стоит специальный непечатный символ-разделитель.

Причина №2: Проблема эмуляции клавиатуры (USB HID) на сканерах Honeywell

В стандарте GS1-128 для отделения полей переменной длины применяется управляющий символ группового разделителя GS (Group Separator, соответствующий ASCII-коду 29). По умолчанию большинство ручных сканеров (включая популярную модель Honeywell MS5145 Eclipse) из коробки подключены по интерфейсу USB в режиме эмуляции клавиатуры (USB Keyboard Emulation / HID).

Поскольку символ с ASCII-кодом 29 не имеет физической клавиши на клавиатуре, драйвер сканера при передаче данных в операционную систему пытается его интерпретировать. В зависимости от прошивки и настроек сканера этот управляющий символ заменяется на серию пробелов (от 1 до 5) или символ табуляции. В итоге в текстовое поле поиска 1С или в Блокнот попадает искаженная строка вида "2630035505 001".

Причина №3: Нарушение структуры кода при печати и проблемы с DPI принтера

Если записать штрихкод в карточку товара вместе с пробелами и суффиксом "2630035505 001" и отправить на печать, внешняя компонента «1С:Печать штрихкодов» попытается сформировать стандартный Code 128. Однако при генерации обычного Code 128 система не встраивает обязательные для GS1-128 маркеры (такие как служебный символ FNC1 и стартовые/стоповые знаки структуры данных). В результате получается некорректная последовательность черных и белых полос, которую сканеры распознать не могут.

Дополнительно накладывается техническая проблема качества печати этикеток:

  1. Несоответствие разрешения печати: Линейный штрихкод Code 128 обладает высокой плотностью. При печати на дешевых термопринтерах с разрешением 203 DPI тонкие штрихи и пробелы сливаются из-за теплового расплывания термоголовки.
  2. Размытие и сглаживание: При отправке макета на печать драйвер принтера часто пытается применить алгоритмы сглаживания шрифтов и графики, что полностью разрушает точные пропорции штрихов.
  3. Произвольное масштабирование: Если растягивать штрихкод в табличном документе 1С вручную мышкой, его линии масштабируются некратно физической точке принтера. Это приводит к математическим ошибкам округления ширины полос при генерации растра.

Шаг 1: Правильная аппаратная настройка сканера Honeywell

Чтобы сканер корректно передавал данные в 1С без искажения управляющих символов разделителей GS1, крайне рекомендуется перевести его из режима эмуляции клавиатуры в режим эмуляции COM-порта (Virtual COM Port). В этом режиме сканер передает чистый поток байтов, который перехватывается специализированным драйвером торгового оборудования 1С.

Проанализируем шаги настройки сканера Honeywell 5145:

  1. Скачайте официальное руководство по программированию сканера Honeywell MetroSelect Single-Line Configuration Guide.
  2. Найдите и последовательно считайте управляющие штрихкоды для сброса на заводские настройки: Recall Defaults.
  3. Считайте штрихкод перевода интерфейса в режим виртуального COM-порта: Enable Uni-Directional USB Serial Emulation Mode.
  4. Установите на компьютер официальный драйвер виртуального COM-порта от Honeywell (Honeywell HSM USB Serial Driver).
  5. В диспетчере устройств Windows проверьте, какой именно номер порта (например, COM3) назначился сканеру.
  6. В настройках торгового оборудования 1С добавьте новое сканирующее устройство, выберите обработку драйвера "1С:Сканеры штрихкода (COM)", укажите соответствующий порт и скорость обмена данными.

Если переключение на COM-порт по какой-то причине невозможно, найдите в руководстве Honeywell раздел настройки форматирования UCC/EAN-128 и считайте управляющий штрихкод Enable UCC/EAN-128 Formatting. Это позволит сканеру корректно отрабатывать суффиксы и префиксы в режиме HID клавиатуры.

Шаг 2: Устранение дефектов печати штрихкода из 1С

Выясним, как добиться стопроцентной читаемости распечатанных штрихкодов со сложных этикеток. Рассмотрим правила подготовки макета к печати:

  1. Откройте свойства принтера этикеток в операционной системе Windows через «Панель управления -> Устройства и принтеры».
  2. Перейдите во вкладку настроек печати (Параметры графики) и отключите любые виды сглаживания (дизеринга). Установите параметр "Сглаживание (Dithering)" в значение "Нет" (None).
  3. В макете этикетки 1С используйте специализированный тип кода GS1-128 (если позволяет компонента) либо генерируйте чистый Code 128 без лишних знаков разметки, содержащий только код детали.
  4. Не изменяйте размеры графического объекта штрихкода в 1С произвольно. Используйте фиксированные размеры, рекомендуемые для разрешения вашего принтера (203 DPI или 300 DPI). Изменение размеров должно происходить кратно целым пикселям.
  5. Располагайте штрихкод на этикетке так, чтобы его штрихи были направлены вдоль движения ленты при печати (так называемая печать «забором»). Это минимизирует смазывание из-за инерции нагревательных элементов термоголовки принтера.

Шаг 3: Программная обработка штрихкодов и очистка от суффиксов в 1С

Самое эффективное и гибкое решение проблемы на складе — это программная отсечка хвостовой части штрихкода (пробелов и количества 001) непосредственно в кодовой базе 1С при приеме данных от сканера. Это избавит вас от необходимости перепечатывать заводские этикетки и забивать базу данных дублирующимися штрихкодами с суффиксами.

Рассмотрим по шагам реализацию этой логики. Нам потребуется написать функцию очистки строки штрихкода от суффиксов количества и доработать процедуру поиска номенклатуры.

Для начала создадим вспомогательную функцию проверки, является ли переданная строка числом, так как количество деталей в конце кода всегда выражено цифрами:


Функция СтрокаЯвляетсяЧислом(Знач ПроверяемаяСтрока) Экспорт
    
    ПроверяемаяСтрока = СокрЛП(ПроверяемаяСтрока);
    Если ПустаяСтрока(ПроверяемаяСтрока) Тогда
        Возврат Ложь;
    КонецЕсли;
    
    // Пытаемся преобразовать строку в числовой тип данных
    Попытка
        ЧисловоеЗначение = Число(ПроверяемаяСтрока);
        Возврат Истина;
    Исключение
        Возврат Ложь;
    КонецПопытки;
    
КонецФункции

Теперь разработаем основную функцию очистки входящего штрихкода от лишних пробелов и суффикса количества. Функция будет анализировать штрихкод на наличие разделителей и удалять правую часть, если она соответствует логистическому суффиксу количества товара в упаковке (например, " 001", " 010"):


Функция ОчиститьШтрихкодОтСуффиксаКоличества(Знач ВходящийШтрихкод) Экспорт
    
    // Очищаем от концевых пробелов
    ВходящийШтрихкод = СокрЛП(ВходящийШтрихкод);
    
    // Заменяем неразрывные пробелы ASCII 160 на стандартные ASCII 32
    ВходящийШтрихкод = СтрЗаменить(ВходящийШтрихкод, Символ(160), " ");
    
    ДлинаКода = СтрДлина(ВходящийШтрихкод);
    ПозицияРазделителя = 0;
    
    // Ищем последний пробел в строке справа налево
    Для СимволИндекс = 1 По ДлинаКода Цикл
        ТекущийСимвол = Сред(ВходящийШтрихкод, СимволИндекс, 1);
        Если ТекущийСимвол = " " Тогда
            ПозицияРазделителя = СимволИндекс;
        КонецЕсли;
    КонецЦикла;
    
    // Если пробел-разделитель найден, анализируем правую часть
    Если ПозицияРазделителя > 0 Тогда
        
        ЛеваяЧасть  = СокрЛП(Лев(ВходящийШтрихкод, ПозицияРазделителя - 1));
        ПраваяЧасть = СокрЛП(Сред(ВходящийШтрихкод, ПозицияРазделителя + 1));
        
        // Если справа находится числовой суффикс количества (длиной от 1 до 4 символов)
        Если СтрокаЯвляетсяЧислом(ПраваяЧасть) И СтрДлина(ПраваяЧасть) <= 4 Тогда
            // Возвращаем чистый код детали без суффикса количества
            Возврат ЛеваяЧасть;
        КонецЕсли;
        
    КонецЕсли;
    
    // Если структура не похожа на GS1-128, возвращаем исходный код
    Возврат ВходящийШтрихкод;
    
КонецФункции

Шаг 4: Интеграция очистки в обработку внешнего события сканера

Проанализируем интеграцию разработанного алгоритма в типовой механизм обработки сигналов торгового оборудования 1С. В модуле формы документа или в общем модуле работы с подключаемым оборудованием найдем предопределенную процедуру ВнешнееСобытие и внедрим туда вызов нашей функции очистки.


Процедура ОбработатьСканирование(ДанныеШтрихкода)
    
    // Проводим предварительную очистку штрихкода от суффиксов GS1-128
    ЧистыйШтрихкод = ОчиститьШтрихкодОтСуффиксаКоличества(ДанныеШтрихкода);
    
    // Выполняем поиск по регистру сведений "Штрихкоды номенклатуры"
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	РегШтрихкоды.Номенклатура КАК Номенклатура,
        |	РегШтрихкоды.ХарактеристикаНоменклатуры КАК Характеристика,
        |	РегШтрихкоды.ЕдиницаИзмерения КАК ЕдиницаИзмерения
        |ИЗ
        |	РегистрСведений.Штрихкоды КАК РегШтрихкоды
        |ГДЕ
        |	РегШтрихкоды.Штрихкод = &Штрихкод";
        
    Запрос.УстановитьПараметр("Штрихкод", ЧистыйШтрихкод);
    РезультатЗапроса = Запрос.Выполнить();
    
    Если Не РезультатЗапроса.Пустой() Тогда
        
        Выборка = РезультатЗапроса.Выбрать();
        Выборка.Следующий();
        
        // Добавляем найденную номенклатуру в табличную часть документа
        ДобавитьНоменклатуруВТабличнуюЧасть(Выборка.Номенклатура, Выборка.Характеристика, Выборка.ЕдиницаИзмерения);
        Сообщить("Товар успешно добавлен по штрихкоду: " + ЧистыйШтрихкод);
        
    Иначе
        
        // Дополнительный поиск по артикулу (каталожному номеру), если штрихкод не найден напрямую
        НайденнаяСсылка = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", ЧистыйШтрихкод);
        Если ЗначениеЗаполнено(НайденнаяСсылка) Тогда
            ДобавитьНоменклатуруВТабличнуюЧасть(НайденнаяСсылка);
            Сообщить("Товар найден по каталожному номеру (артикулу): " + ЧистыйШтрихкод);
        Иначе
            Сообщить("Штрихкод или артикул " + ДанныеШтрихкода + " не зарегистрирован в системе!", СтатусСообщения.Важное);
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

Резюме и рекомендации для администратора склада

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

  1. Не храните мусор в базе данных: Записывать штрихкоды вместе с количеством упаковочной тары (суффиксами типа 001) — тупиковый путь. Это приведет к лавинообразному росту дублей штрихкодов в регистре при смене логистической партии или изменении упаковки производителем. Очищайте штрихкоды программно при вводе в систему.
  2. Используйте Virtual COM Port: По возможности переведите все складские сканеры с режима клавиатуры на режим эмуляции COM-порта. Это исключит влияние раскладки клавиатуры оператора (русская/английская) и предотвратит искажение спецсимволов.
  3. Разделяйте складской и бухгалтерский учет: Полки на складе должны маркироваться штрихкодами ячеек хранения (адресами), а не штрихкодами лежащего на них товара. Если требуется распечатать штрихкод карточки товара для размещения на полке — печатайте чистый Code 128, содержащий только артикул детали, без лишней логистической информации.
← На главную