В современной складской логистике и при работе с маркированными товарами (система «Честный знак») часто возникает задача мгновенной инвентаризации. Представим ситуацию: перед нами короб, в котором лежат десятки или сотни упаковок лекарств, табака или парфюмерии. Сканировать каждый код по отдельности обычным терминалом сбора данных (ТСД) — долго и трудозатратно. Гораздо эффективнее сделать одно качественное фото всей группы товаров и программно извлечь из него все коды Data Matrix (DM). Мы разберем, как реализовать такое решение в среде Windows и интегрировать его в 1С.
Основная сложность заключается в том, что стандартные библиотеки для работы со штрихкодами часто оптимизированы под поиск одного кода в центре кадра. Когда их на фото более 200, алгоритмы начинают «захлебываться» или пропускать объекты из-за перспективных искажений и бликов. Проанализируем инструменты, которые реально справляются с этой задачей под Windows:
Рассмотрим подробнее реализацию на базе бесплатных инструментов, так как они обеспечивают гибкость и высокую надежность при правильной настройке.
Хотя библиотека libdmtx часто ассоциируется с Linux-системами, она прекрасно работает и под Windows в виде скомпилированных исполняемых файлов (exe). Для распознавания множества кодов нам понадобится утилита dmtxread.exe.
Проанализируем ключевые параметры запуска:
-n — указывает на необходимость поиска нескольких кодов.-N200 — задает максимальное количество кодов, которые нужно найти (в нашем примере — 200).-p — позволяет управлять качеством сканирования (регулировка скорости и точности).Пример вызова из командной строки Windows:
dmtxread.exe -n -N200 -D ./photo_01.jpg > codes.txt
Для того чтобы 1С могла получить данные, мы воспользуемся методом запуска внешнего приложения с перенаправлением вывода. Разберем пример кода на языке 1С, который передает картинку на вход утилите и считывает результат:
Функция РаспознатьКодыНаФото(ПутьКФайлуИзображения) Экспорт
ПутьКУтилите = "C:\Tools\dmtxread.exe";
ПутьКРезультату = "C:\Temp\result_codes.txt";
// Формируем строку запуска
// -n: искать много кодов
// -N300: лимит поиска
// > перенаправление вывода в текстовый файл
СтрокаЗапуска = СтрШаблон("%1 -n -N300 ""%2"" > ""%3""", ПутьКУтилите, ПутьКФайлуИзображения, ПутьКРезультату);
// Запускаем через Windows Script Host для скрытия консольного окна
WshShell = Новый COMОбъект("WScript.Shell");
WshShell.Run(СтрокаЗапуска, 0, Истина);
// Читаем полученные данные
ТекстРезультат = Новый ТекстовыйДокумент;
ТекстРезультат.Прочитать(ПутьКРезультату, КодировкаТекста.UTF8);
МассивКодов = Новый Массив;
Для НомерСтроки = 1 По ТекстРезультат.КоличествоСтрок() Цикл
ТекКод = СокрЛП(ТекстРезультат.ПолучитьСтроку(НомерСтроки));
Если ЗначениеЗаполнено(ТекКод) Тогда
МассивКодов.Добавить(ТекКод);
КонецЕсли;
КонецЦикла;
Возврат МассивКодов;
КонецФункции
При распознавании 200+ кодов на одном фото критически важно разрешение снимка. Чтобы каждый Data Matrix имел достаточный размер в пикселях для декодирования, фото должно быть около 20–40 Мп. Однако при попытке обработать такое огромное изображение целиком, алгоритм может работать крайне медленно или вызывать ошибки памяти.
Проанализируем ситуацию: как ускорить процесс? Решением является сегментация изображения. Мы программно «разрезаем» исходное большое фото на 4, 9 или 16 перекрывающихся фрагментов (плиток). Рассмотрим, почему это эффективно:
dmtxread одновременно.Важно: При нарезке фрагменты должны перекрываться (нахлест примерно на 10-15%), чтобы коды, попавшие на линию разреза, не были потеряны.
Часто коды плохо читаются из-за бликов на прозрачной пленке коробок. Чтобы повысить процент распознавания до 99.9%, мы рекомендуем предварительную обработку изображения с помощью библиотеки OpenCV. Выясним причины, по которым это необходимо:
Работая с Data Matrix в РФ, мы должны помнить, что это не просто текст, а структура GS1. Внутри кода содержатся непечатные управляющие символы, такие как FNC1 (в начале кода) и разделители групп данных GS (ASCII 29).
Рассмотрим проблему: при выводе результата работы консольной утилиты в текстовый файл, кодировка Windows (ANSI/OEM) может некорректно сохранить эти символы. Чтобы избежать повреждения структуры кода, рекомендуется использовать утилиты, поддерживающие вывод в формате Base64 или Hex, либо настраивать 1С на чтение в кодировке UTF-8 и внимательно проверять наличие спецсимволов. Без них код не пройдет валидацию в ГИС МТ.
Если требования заказчика ограничивают использование сложных системных настроек, можно подготовить небольшую утилиту на Python, используя библиотеки pylibdmtx или zxing-cpp. Преимущество в том, что с помощью PyInstaller вы можете собрать всё решение в один автономный .exe файл.
Этот файл будет принимать путь к картинке, выполнять сегментацию, распознавание и возвращать массив кодов в формате JSON. Для 1С это самый удобный вариант взаимодействия, так как ЧтениеJSON — встроенный и быстрый механизм.
Посмотрим на структуру такого решения:
Утилита.exe --input image.jpg --output result.json.Такой подход позволяет обойти ограничения «ленивых админов» и строгие правила безопасности, так как решение не требует установки интерпретаторов или регистрации COM-компонент в системе.