Как в 1С организовать распознавание штрихкодов по фотографии или файлу?

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

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

1. Использование встроенных средств мобильной платформы

Для начала проанализируем штатные возможности 1С. Если ваша задача решается в рамках мобильного приложения или мобильного клиента, платформа предоставляет встроенный механизм СредстваМультимедиа. Этот метод позволяет задействовать камеру устройства для сканирования кода в реальном времени.

Рассмотрим пример использования метода ПоказатьСканированиеШтрихКодов. Этот метод вызывает стандартный интерфейс сканирования, который обрабатывает видеопоток с камеры и возвращает результат распознавания.


&НаКлиенте
Процедура СканироватьШтрихкод(Команда)
    Обработчик = Новый ОписаниеОповещения("ОбработкаСканирования", ЭтотОбъект);
    СредстваМультимедиа.ПоказатьСканированиеШтрихКодов("Наведите камеру на код", Обработчик);
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаСканирования(Результат, ДополнительныеПараметры) Экспорт
    Если Результат <> Неопределено Тогда
        Сообщить("Распознан код: " + Результат.Значение);
    КонецЕсли;
КонецПроцедуры

Важно понимать ограничение этого метода: он предназначен для интерактивной работы пользователя с камерой. Если же нам нужно распознать штрихкод из уже готового файла (например, присланного в Telegram-бот), этот метод не подойдет, так как он не принимает файл в качестве входного параметра.

2. Распознавание через внешние компоненты (Native API)

Для серверного распознавания или работы в обычном сеансе 1С на компьютере наиболее эффективным способом является использование внешних компонент. Самые популярные библиотеки для этих целей — ZBar и ZXing (Zebra Crossing). Существуют готовые реализации этих библиотек в виде Native API компонент для 1С.

Выясним алгоритм работы с такой компонентой. Как правило, она загружается в память 1С, после чего ей передаются ДвоичныеДанные картинки. Компонента анализирует изображение и возвращает строку кода или массив структур, если кодов на фото несколько.

Посмотрим на примерный код подключения и использования такой компоненты:


&НаСервере
Функция РаспознатьШтрихкодИзФайла(ПутьКФайлу)
    Результат = "";
    // Подключаем компоненту, предварительно загруженную в общий макет
    УстановитьРасширениеРаботыФайлами();
    Если ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаZBar", "BarcodeReader", ТипВнешнейКомпоненты.Native) Тогда
        ОбъектРаспознавания = Новый ("AddIn.BarcodeReader.BarcodeScanner");
        
        // Читаем файл в двоичные данные
        КартинкаДанные = Новый ДвоичныеДанные(ПутьКФайлу);
        
        // Вызываем метод распознавания
        Результат = ОбъектРаспознавания.Распознать(КартинкаДанные);
    Иначе
        ЗаписьЖурналаРегистрации("Ошибка подключения компоненты", УровеньЖурналаРегистрации.Ошибка);
    КонецЕсли;
    
    Возврат Результат;
КонецФункции

Преимущество этого метода заключается в высокой скорости работы и отсутствии зависимости от интернет-соединения, так как все вычисления происходят локально на сервере или клиенте.

3. Интеграция с внешними сервисами и микросервисами

Проанализируем ситуацию, когда фотографии имеют низкое качество, сделаны при плохом освещении или под углом. В таких случаях обычные библиотеки могут не справиться. Здесь на помощь приходят специализированные OCR-сервисы или собственные микросервисы на языках программирования, имеющих мощные библиотеки для компьютерного зрения (например, Python с библиотеками OpenCV и PyZbar).

Разберем вариант создания промежуточного звена. Вы можете поднять веб-сервис (на Python/FastAPI или Node.js), который будет принимать изображение, проводить его предварительную обработку (изменение контрастности, перевод в ч/б, обрезка) и возвращать результат.

Пример структуры HTTP-запроса из 1С к такому сервису:


&НаСервере
Функция ПолучитьКодЧерезВнешнийСервис(ДвоичныеДанныеКартинки)
    Сервер = "barcode-service.local";
    Порт = 8080;
    
    HTTPСоединение = Новый HTTPСоединение(Сервер, Порт);
    HTTPЗапрос = Новый HTTPЗапрос("/decode");
    HTTPЗапрос.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанныеКартинки);
    HTTPЗапрос.Заголовки.Вставить("Content-Type", "image/jpeg");
    
    Попытка
        HTTPОтвет = HTTPСоединение.ОтправитьДляОбъекта(HTTPЗапрос);
        Если HTTPОтвет.КодСостояния = 200 Тогда
            Возврат HTTPОтвет.ПолучитьТелоКакСтроку();
        КонецЕсли;
    Исключение
        Возврат "Ошибка связи с сервисом";
    КонецПопытки;
КонецФункции

Также можно использовать готовые облачные API, такие как Yandex Vision или Google Cloud Vision. Они обладают крайне высокой точностью распознавания, но требуют оплаты за каждый запрос и стабильного интернета.

4. Предварительная обработка изображений в 1С

Чтобы повысить вероятность успешного распознавания штрихкода (особенно при использовании внешних компонент), проанализируем методы улучшения картинки. Сама платформа 1С версии 8.3.х позволяет выполнять базовые операции с изображениями через объект Картинка.

Рассмотрим, что мы можем сделать средствами 1С:

  1. Преобразование формата: Часто штрихкоды лучше распознаются в формате BMP или PNG без сжатия.
  2. Изменение размера: Слишком большие фото от современных смартфонов замедляют обработку, их целесообразно уменьшать до разумных пределов.
  3. Использование внешних утилит: Можно вызвать командную строку с утилитой ImageMagick для нормализации фото (повышение контрастности, удаление шумов).

Пример вызова утилиты обработки через ЗапуститьПриложение:


КомандаОбработки = "magick convert input.jpg -colorspace Gray -contrast-stretch 0x50% output.png";
ЗапуститьПриложение(КомандаОбработки, , Истина);

5. Особенности реализации для Telegram-ботов

Если мы разрабатываем функционал для Telegram-бота на базе 1С, процесс будет выглядеть следующим образом. Выясним основные этапы:

  1. Получение сообщения: 1С через регламентное задание или Webhook получает JSON от Telegram API.
  2. Загрузка файла: Если в сообщении есть photo, 1С должна получить file_id и через метод getFile скачать само изображение с серверов Telegram.
  3. Важный нюанс: Telegram сжимает фотографии. Для улучшения распознавания просите пользователей отправлять фото "как файл" (без сжатия).
  4. Обработка: Скачанный файл передается в один из механизмов, описанных выше (компонента или сервис).
  5. Ответ пользователю: Полученный штрихкод используется для поиска товара в базе (Справочник.Штрихкоды), после чего информация отправляется обратно в чат.

Резюмируем: Для быстрого старта и простых задач в мобильном приложении используйте ПоказатьСканированиеШтрихКодов. Для серверных задач и ботов оптимальным выбором будет внешняя компонента на базе ZBar. Если же требуется максимальная точность на плохих фото — внедряйте микросервис на Python или используйте облачные OCR-решения.

← На главную