Как распознать множество Data Matrix кодов на одной фотографии для 1С?

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

В современной складской логистике и при работе с маркированными товарами (система «Честный знак») часто возникает задача мгновенной инвентаризации. Представим ситуацию: перед нами короб, в котором лежат десятки или сотни упаковок лекарств, табака или парфюмерии. Сканировать каждый код по отдельности обычным терминалом сбора данных (ТСД) — долго и трудозатратно. Гораздо эффективнее сделать одно качественное фото всей группы товаров и программно извлечь из него все коды Data Matrix (DM). Мы разберем, как реализовать такое решение в среде Windows и интегрировать его в 1С.

Постановка задачи и выбор технологии

Основная сложность заключается в том, что стандартные библиотеки для работы со штрихкодами часто оптимизированы под поиск одного кода в центре кадра. Когда их на фото более 200, алгоритмы начинают «захлебываться» или пропускать объекты из-за перспективных искажений и бликов. Проанализируем инструменты, которые реально справляются с этой задачей под Windows:

  1. Libdmtx (утилита dmtxread): Это признанный стандарт для работы с кодами Data Matrix. Она умеет искать несколько кодов на одном изображении при использовании специальных параметров.
  2. ZXing-C++: Современный и очень быстрый порт библиотеки Zebra Crossing. В отличие от Java-версии, он крайне производителен и отлично подходит для многопоточной обработки под Windows.
  3. Специализированные SDK (Vintasoft, ByteScout): Платные решения, которые предоставляют готовые COM-объекты для 1С, что упрощает разработку, но требует лицензионных отчислений.

Рассмотрим подробнее реализацию на базе бесплатных инструментов, так как они обеспечивают гибкость и высокую надежность при правильной настройке.

Использование Libdmtx в среде Windows

Хотя библиотека libdmtx часто ассоциируется с Linux-системами, она прекрасно работает и под Windows в виде скомпилированных исполняемых файлов (exe). Для распознавания множества кодов нам понадобится утилита dmtxread.exe.

Проанализируем ключевые параметры запуска:

Пример вызова из командной строки Windows:

dmtxread.exe -n -N200 -D ./photo_01.jpg > codes.txt

Интеграция с 1С: вызов внешнего распознавателя

Для того чтобы 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 По ТекстРезультат.КоличествоСтрок() Цикл
        ТекКод = СокрЛП(ТекстРезультат.ПолучитьСтроку(НомерСтроки));
        Если ЗначениеЗаполнено(ТекКод) Тогда
            МассивКодов.Добавить(ТекКод);
        КонецЕсли;
    КонецЦикла;
    
    Возврат МассивКодов;
    
КонецФункции

Проблема высокого разрешения: метод сегментации (Tiling)

При распознавании 200+ кодов на одном фото критически важно разрешение снимка. Чтобы каждый Data Matrix имел достаточный размер в пикселях для декодирования, фото должно быть около 20–40 Мп. Однако при попытке обработать такое огромное изображение целиком, алгоритм может работать крайне медленно или вызывать ошибки памяти.

Проанализируем ситуацию: как ускорить процесс? Решением является сегментация изображения. Мы программно «разрезаем» исходное большое фото на 4, 9 или 16 перекрывающихся фрагментов (плиток). Рассмотрим, почему это эффективно:

  1. Алгоритм фокусируется на меньшем объеме данных в конкретный момент времени.
  2. Вероятность правильной бинаризации (перевода в ч/б) в локальной области выше, так как освещение на фрагменте более равномерное, чем на всем фото.
  3. Процесс можно распараллелить, запустив несколько экземпляров dmtxread одновременно.

Важно: При нарезке фрагменты должны перекрываться (нахлест примерно на 10-15%), чтобы коды, попавшие на линию разреза, не были потеряны.

Предварительная обработка (OpenCV)

Часто коды плохо читаются из-за бликов на прозрачной пленке коробок. Чтобы повысить процент распознавания до 99.9%, мы рекомендуем предварительную обработку изображения с помощью библиотеки OpenCV. Выясним причины, по которым это необходимо:

Нюансы «Честного знака» и спецсимволы

Работая с Data Matrix в РФ, мы должны помнить, что это не просто текст, а структура GS1. Внутри кода содержатся непечатные управляющие символы, такие как FNC1 (в начале кода) и разделители групп данных GS (ASCII 29).

Рассмотрим проблему: при выводе результата работы консольной утилиты в текстовый файл, кодировка Windows (ANSI/OEM) может некорректно сохранить эти символы. Чтобы избежать повреждения структуры кода, рекомендуется использовать утилиты, поддерживающие вывод в формате Base64 или Hex, либо настраивать 1С на чтение в кодировке UTF-8 и внимательно проверять наличие спецсимволов. Без них код не пройдет валидацию в ГИС МТ.

Альтернативный путь: Python как «прослойка»

Если требования заказчика ограничивают использование сложных системных настроек, можно подготовить небольшую утилиту на Python, используя библиотеки pylibdmtx или zxing-cpp. Преимущество в том, что с помощью PyInstaller вы можете собрать всё решение в один автономный .exe файл.

Этот файл будет принимать путь к картинке, выполнять сегментацию, распознавание и возвращать массив кодов в формате JSON. Для 1С это самый удобный вариант взаимодействия, так как ЧтениеJSON — встроенный и быстрый механизм.

Посмотрим на структуру такого решения:

Такой подход позволяет обойти ограничения «ленивых админов» и строгие правила безопасности, так как решение не требует установки интерпретаторов или регистрации COM-компонент в системе.

← На главную