Сканирование DataMatrix в мобильной 1С без ТСД: свой Android-сканер на Google ML Kit через Intent
Интеграция - Сканер штрих-кода
Привет, сообщество! Хочу поделиться подходом, который помог заставить обычный Android-смартфон быстро и стабильно сканировать коды маркировки DataMatrix в мобильной 1С без покупки ТСД. Идея простая: вместо штатного сканера платформы используется свое небольшое Android-приложение на Google ML Kit, которое 1С вызывает через Intent и получает от него считанный код. В статье — как я к этому пришел, как устроена связка с обеих сторон и что показала эксплуатация.
Сразу оговорюсь: это не единственно правильный путь, а один из вариантов. Решение выросло из конкретной задачи в конкретных условиях, и я делюсь опытом, который сработал у меня. Если вы решали похожую задачу по-другому, буду рад сравнить подходы в комментариях.
Почему DataMatrix - это боль
С приходом обязательной маркировки («Честный знак», «Электронный знак» и т. п.) сканирование DataMatrix стало обязательной частью учета. При этом код капризный:
• Емкий: помимо GTIN и серийного номера несет криптохвост — данных много, модули мелкие.
• Требовательный: нужны хорошее разрешение и четкий фокус.
• Неудобно расположен: бликующая пленка, мятые коробки, скошенные углы упаковок.
Классическое решение для склада — ТСД с аппаратными сканирующими модулями. Но когда сканировать нужно не только на складе, а "в полях" — у сотен курьеров, на приемке в магазинах, на выездной инвентаризации, — выдавать ТСД каждому становится дорого. Поэтому к идее "смартфон есть у каждого — пусть им и сканируют" приходит не только мелкий опт, но и крупный бизнес.
От штатного сканера 1С к ZXing
Штатный механизм работы с камерой в мобильной 1С с использованием команды
СредстваМультимедиа.ПоказатьСканированиеШтрихКодов()
на практике оказался ненадежен для Datamatrix: сканирование долгое, результат непредсказуем, а иногда не распознаются даже идеально напечатанные коды. Когда курьеру или кладовщику нужно "пикнуть" сотню позиций, это ощутимо тормозит работу.
Первое решение было: стороннее приложение-сканер на открытой библиотеке ZXing, вызываемый из 1С через Android Intent, о котором прочел в одной из статей. Суть заключается в том, чтобы на телефон дополнительно установить приложение, которое содержит intent-filter, по которому можно вызвать сканирование из 1С. Такой intent-filter = "com.google.zxing.client.android.SCAN" поддерживает приложение Binary eye. Его удалось найти в результате анализа различных сканеров для Android. И какое-то время связка работала без претензий. Потом у части поставщиков упало качество печати, и доля нераспознанных кодов резко выросла. Начались жалобы работников склада на нераспознанные коды маркировки. Приходилось перепечатывать коды маркировки на своих принтерах и наклеивать их на товары.
В результате анализа обнаружил:
• Принтер слегка недопечатал — код не читается.
• Этикетку потерли при транспортировке — тоже.
При этом многие другие сканеры из Google Play такие коды читали без проблем. Они явно использовали не только Zxing. Мне оставалось найти тот, который умеет отдавать результат в 1С.
Помню, как вечерами сидел и разбирал AndroidManifest.xml разных сканеров в надежде найти заветный intent-filter, который можно было бы дернуть из 1С. Перелопатил немало приложений, но подходящего так и не нашел. И в какой-то момент пришла мысль: а что, если сделать самому? Так я открыл Android Studio и взялся за попытку создать свою утилиту под мобильную 1С.
Суть подхода
Вместо поиска готового сканера, который случайно умеет работать с 1С, можно сделать свой — минимальный и заточенный под одну задачу. Схема такая:
- Мобильное приложение на 1С вызывает Activity сканера через Intent с заранее известным действием (action).
- Сканер сразу открывает камеру и распознает код через доступную библиотеку.
- Результат возвращается в 1С в дополнительных данных Intent, и пользователь снова оказывается на форме 1С.
Вся "тяжелая" работа с камерой и распознаванием уходит в нативный Android-код, а интеграция с 1С остается стандартной — без внешних компонент и больших доработок.
Обмен идет через стандартный механизм Android Intent. В общих чертах выглядит таким образом:

Под капотом: Google ML Kit
В качестве движка я выбрал бесплатный Google ML Kit, а конкретно Google code scanner (GmsBarcodeScanning). Анализируя чужие приложения, я увидел, что многие популярные сканеры используют, кроме коммерческих библиотек, и эту технологию. Разница с ZXing заметная; к тому же сам ZXing находится в режиме поддержки (maintenance mode) и активно не развивается.
Вот небольшая сравнительная таблица Zxing и Google ML Kit:
| Критерий | ZXing | Google ML Kit |
|---|---|---|
| Распознавание | Классические алгоритмы: грязь, блики и дефекты печати сбивают с толку | ML-модели прямо на телефоне, без интернета: читают затертые и помятые коды |
| Фокусировка | Зависит от камеры и прошивки конкретного телефона | Быстрый фокус и автозум, если код далеко |
| Угол съемки | Телефон нужно держать ровно над кодом | Любое положение: боком, вверх ногами, по диагонали |
| Железо | Качество упирается в камеру | Стабильно работает даже на бюджетных смартфонах |
Android-сторона
Код своего приложения я не публикую, но сама конструкция несложная, и ее несложно повторить. По сути, сканеру нужно всего три вещи:
• Activity с intent-filter на свое действие (action) в AndroidManifest.xml — именно по нему 1С находит сканер на телефоне.
• Запуск Google code scanner (библиотека play-services-code-scanner) с ограничением на формат DataMatrix.
• Возврат результата: считанный код кладется в дополнительные данные Intent под заранее оговоренным ключом (у меня это SCAN_RESULT), после чего Activity закрывается и управление возвращается в 1С.
Пара практических решений, которые стоит заложить сразу:
• Без лишнего интерфейса. При вызове из 1С показывать пользователю какие-либо экраны нет смысла: задача сканера — отсканировать код, быстро вернуть результат и отдать фокус обратно форме 1С. Поэтому сразу открывается камера. У меня отдельная ветка для запуска через Intent без интерфейса и с открытием интерфейса, если запуск приложения без Intent.
• Только нужный формат. Когда ML Kit заранее знает, что искать DataMatrix, алгоритмы не перебирают остальные форматы (EAN, Code 128 и т. д.) и работают быстрее. Универсальный режим для сканирования всех штрихкодов можно вынести в настройки приложения, я так и сделал.
Код на стороне 1С
Интеграция укладывается в десяток строк. Пример обработчика кнопки сканиварования:
НаКлиенте
Процедура СканироватьDataMatrix(Команда)
#Если МобильноеПриложениеКлиент Или МобильныйКлиент Тогда
Запуск = Новый ЗапускПриложенияМобильногоУстройства();
// Действие Intent, на которое откликается QRazyScan
Запуск.Действие = "com.skrobot.QRazy.SCAN_BARCODE";
// Android находит QRazyScan на смартфоне и запускает его
РезультатОтвета = Запуск.Запустить(Истина);
// Код 0 означает успех (Activity.RESULT_OK)
Если РезультатОтвета = 0 Тогда
// Читаем результат по ключу SCAN_RESULT
Штрихкод = Запуск.ДополнительныеДанные.Получить("SCAN_RESULT");
Если ЗначениеЗаполнено(Штрихкод) Тогда
ОбработатьПолученныйШтрихкод(Штрихкод);
КонецЕсли;
КонецЕсли;
#КонецЕсли
КонецПроцедуры
Результаты
Приложение уже около года работает на рабочих смартфонах нескольких десятков или даже сотен сотрудников, которые ежедневно сканируют сотни кодов.
• Скорость. Распознавание заметно ускорилось: автофокус ловит код раньше, чем пользователь успевает выровнять телефон. Плохо напечатанные коды читаются стабильно, и складу больше не приходится перепечатывать этикетки перед отгрузкой.
• Надежность. Интеграция через Intent работает без сбоев. QRazyScan изолирован от 1С, проблем с памятью не замечено, а делает приложение ровно одну вещь — быстро считывает код.
• Удобство. Вместо игры "приблизь-отдали-поймай штрикход" — простой сценарий: нажал, пикнул, код записался в табличную часть.
Свой вариант я написал на Kotlin около года назад, за несколько вечеров и без платных подписок на AI, почти по старинке 🙂 Процесс оказался неожиданно увлекательным: для 1С-ника это был хороший повод выглянуть за пределы привычного конфигуратора.
Изначально сканер распространялся как обычный .apk-файл, который ставили пользователям вручную. Уже спустя несколько месяцев стало любопытно пройти закрытое тестирование и опубликовать его в Google Play. Поэтому, я привел код в порядок и прошел процедуру публикации в Google Play, чтоб упростить распространение и подвердить надежность проверками Google. Сейчас приложение называется QRazyScan: оно бесплатное, без рекламы и регистрации, и его можно взять как есть QRazyScan в Google Play, если не хочется собирать свой сканер
Регулярного развития не обещаю: обновлять буду по мере необходимости — например, если очередная версия Android что-то сломает.
Но главная цель статьи — поделиться самой идеей. Сегодня при желании вполне можно собрать подобный инструмент под свои задачи. Хотя путь от идеи до приложения, которое каждый день сканирует сотни кодов маркировки и прошло публикацию в Google Play, — это все-таки отдельная история.
Буду рад, если этот опыт будет кому-то полезен.
Спасибо, что дочитали! Всем кодов, которые читаются с первого раза🙂
Вступайте в нашу телеграмм-группу Инфостарт
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
5185 руб.
29.07.2020 46902 248 194
3050 руб.
22.04.2019 124914 739 207
24400 руб.
19.04.2021 31068 70 59
07.07.2023 7015 4 alfanika 2
7320 руб.
28.07.2020 33368 88 37
2196 руб.
18.01.2017 152653 235 237