Задача распознавания штрихкодов по фотографии часто возникает при автоматизации бизнес-процессов, связанных с мобильными рабочими местами или интеграцией с мессенджерами, например, при создании Telegram-ботов для склада или логистики. В отличие от стандартного сканирования штрихкода в торговом зале, где используется специализированное оборудование, работа с фотографиями требует иного подхода. Разберем детально, какие механизмы существуют в экосистеме 1С для решения этой задачи.
Для начала проанализируем штатные возможности 1С. Если ваша задача решается в рамках мобильного приложения или мобильного клиента, платформа предоставляет встроенный механизм СредстваМультимедиа. Этот метод позволяет задействовать камеру устройства для сканирования кода в реальном времени.
Рассмотрим пример использования метода ПоказатьСканированиеШтрихКодов. Этот метод вызывает стандартный интерфейс сканирования, который обрабатывает видеопоток с камеры и возвращает результат распознавания.
&НаКлиенте
Процедура СканироватьШтрихкод(Команда)
Обработчик = Новый ОписаниеОповещения("ОбработкаСканирования", ЭтотОбъект);
СредстваМультимедиа.ПоказатьСканированиеШтрихКодов("Наведите камеру на код", Обработчик);
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаСканирования(Результат, ДополнительныеПараметры) Экспорт
Если Результат <> Неопределено Тогда
Сообщить("Распознан код: " + Результат.Значение);
КонецЕсли;
КонецПроцедуры
Важно понимать ограничение этого метода: он предназначен для интерактивной работы пользователя с камерой. Если же нам нужно распознать штрихкод из уже готового файла (например, присланного в Telegram-бот), этот метод не подойдет, так как он не принимает файл в качестве входного параметра.
Для серверного распознавания или работы в обычном сеансе 1С на компьютере наиболее эффективным способом является использование внешних компонент. Самые популярные библиотеки для этих целей — ZBar и ZXing (Zebra Crossing). Существуют готовые реализации этих библиотек в виде Native API компонент для 1С.
Выясним алгоритм работы с такой компонентой. Как правило, она загружается в память 1С, после чего ей передаются ДвоичныеДанные картинки. Компонента анализирует изображение и возвращает строку кода или массив структур, если кодов на фото несколько.
Посмотрим на примерный код подключения и использования такой компоненты:
&НаСервере
Функция РаспознатьШтрихкодИзФайла(ПутьКФайлу)
Результат = "";
// Подключаем компоненту, предварительно загруженную в общий макет
УстановитьРасширениеРаботыФайлами();
Если ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаZBar", "BarcodeReader", ТипВнешнейКомпоненты.Native) Тогда
ОбъектРаспознавания = Новый ("AddIn.BarcodeReader.BarcodeScanner");
// Читаем файл в двоичные данные
КартинкаДанные = Новый ДвоичныеДанные(ПутьКФайлу);
// Вызываем метод распознавания
Результат = ОбъектРаспознавания.Распознать(КартинкаДанные);
Иначе
ЗаписьЖурналаРегистрации("Ошибка подключения компоненты", УровеньЖурналаРегистрации.Ошибка);
КонецЕсли;
Возврат Результат;
КонецФункции
Преимущество этого метода заключается в высокой скорости работы и отсутствии зависимости от интернет-соединения, так как все вычисления происходят локально на сервере или клиенте.
Проанализируем ситуацию, когда фотографии имеют низкое качество, сделаны при плохом освещении или под углом. В таких случаях обычные библиотеки могут не справиться. Здесь на помощь приходят специализированные 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. Они обладают крайне высокой точностью распознавания, но требуют оплаты за каждый запрос и стабильного интернета.
Чтобы повысить вероятность успешного распознавания штрихкода (особенно при использовании внешних компонент), проанализируем методы улучшения картинки. Сама платформа 1С версии 8.3.х позволяет выполнять базовые операции с изображениями через объект Картинка.
Рассмотрим, что мы можем сделать средствами 1С:
ImageMagick для нормализации фото (повышение контрастности, удаление шумов).Пример вызова утилиты обработки через ЗапуститьПриложение:
КомандаОбработки = "magick convert input.jpg -colorspace Gray -contrast-stretch 0x50% output.png";
ЗапуститьПриложение(КомандаОбработки, , Истина);
Если мы разрабатываем функционал для Telegram-бота на базе 1С, процесс будет выглядеть следующим образом. Выясним основные этапы:
photo, 1С должна получить file_id и через метод getFile скачать само изображение с серверов Telegram.Справочник.Штрихкоды), после чего информация отправляется обратно в чат.Резюмируем: Для быстрого старта и простых задач в мобильном приложении используйте ПоказатьСканированиеШтрихКодов. Для серверных задач и ботов оптимальным выбором будет внешняя компонента на базе ZBar. Если же требуется максимальная точность на плохих фото — внедряйте микросервис на Python или используйте облачные OCR-решения.