В процессе автоматизации склада мы часто сталкиваемся с необходимостью генерации уникальных штрихкодов для складских ячеек. Распространенным подходом является преобразование УникальныйИдентификатор ссылки на элемент справочника в числовой вид. Однако при внедрении этого решения нередко возникает проблема: часть сгенерированных штрихкодов успешно распознается терминалом сбора данных (ТСД), а другая часть — нет, вызывая ошибку «неверный штрихкод».
Давайте разберем, как происходит формирование штрихкода. Обычно используется стандартная логика преобразования 16-ричного представления GUID в десятичное число. Рассмотрим функцию, которая выполняет это преобразование:
Функция ЧисловойКодПоСсылке(Ссылка) Экспорт
ШестнадцатиричноеЧисло = СтрЗаменить(Строка(Ссылка.УникальныйИдентификатор()), "-", "");
Возврат ПреобразоватьИзШестнадцатиричнойСистемыСчисленияВДесятичноеЧисло(ШестнадцатиричноеЧисло);
КонецФункции
Функция ПреобразоватьИзШестнадцатиричнойСистемыСчисленияВДесятичноеЧисло(Знач Значение)
Значение = НРег(Значение);
ДлинаСтроки = СтрДлина(Значение);
Результат = 0;
Для НомерСимвола = 1 По ДлинаСтроки Цикл
Результат = Результат * 16 + СтрНайти("0123456789abcdef", Сред(Значение, НомерСимвола, 1)) - 1;
КонецЦикла;
Возврат Формат(Результат, "ЧГ=0");
КонецФункции
Эта функция на выходе дает длинную строку цифр. На этапе поиска ячейки в базе используется обратная функция ПолучитьСсылкуПоШтрихкодуТабличногоДокумента, которая восстанавливает GUID из числа и ищет объект. Если в отладчике обе функции работают корректно и находят нужную ссылку, значит, проблема кроется не в программной части 1С, а в физической реализации или настройках сканирования.
Рассмотрим основные факторы, которые мешают сканеру распознать штрихкод:
GUID, создает очень плотный рисунок штрихов. При печати на термопринтере с низким разрешением или при чрезмерном сжатии изображения тонкие линии «слипаются». Сканер ТСД физически не может различить границы между ними, что приводит к ошибке считывания.Code128. Хотя он поддерживает большое количество символов, его надежность при печати сверхдлинных последовательностей значительно ниже, чем у двухмерных кодов.Cleverence) может иметь встроенные фильтры или шаблоны. Если длина считанной строки не попадает в ожидаемый диапазон, система может отсекать часть данных или блокировать ввод.Число может терять незначащие нули в начале строки. Если база ожидает 32-значный идентификатор, а из-за потери нуля строка стала короче, алгоритм восстановления GUID не сработает корректно.Чтобы окончательно решить проблему, рекомендуем предпринять следующие шаги:
1. Смена формата штрихкода на DataMatrix. Это наиболее надежный путь. DataMatrix — это двухмерный код, который гораздо компактнее линейных форматов. Он позволяет закодировать тот же объем данных в маленьком квадрате, который легко считывается практически любым современным сканером, даже при неидеальной печати.
2. Проверка дополнения нулями. Всегда приводите строку к строго фиксированной длине перед преобразованием. В коде поиска объекта в базе 1С уже реализована логика дополнения нулями, убедитесь, что при печати этикетки вы используете аналогичный подход:
// Пример дополнения строки до 32 символов
Пока СтрДлина(ШтрихкодВШестнадцатиричномВиде) < 32 Цикл
ШтрихкодВШестнадцатиричномВиде = "0" + ШтрихкодВШестнадцатиричномВиде;
КонецЦикла;
3. Тестирование «сырого» ввода. Если вы подозреваете программный сбой, попробуйте отсканировать проблемный штрихкод в «Блокнот» на ТСД или ПК. Если в блокноте вы видите полную и верную строку цифр — значит, сканер работает исправно, и искать причину нужно в настройках обработки Cleverence или другой системы, которая обрабатывает событие сканирования.
4. Настройки принтера. Попробуйте принудительно увеличить размер этикетки в макете печатной формы, чтобы дать штрихкоду больше физического пространства. Убедитесь, что скорость печати принтера не слишком высока, что может приводить к смазыванию мелких элементов кода.
Проанализировав ситуацию, можно сделать вывод: при работе с GUID в качестве штрихкода, критически важно контролировать не только сам код, но и способ его визуализации. Переход на двухмерные коды и строгое соблюдение длины строки помогут вам избавиться от ошибок сканирования раз и навсегда.