Разработка мобильного приложения для сканирования и инвентаризации
Мы разрабатываем мобильные приложения для сканирования и инвентаризации, которые заменяют бумажные ведомости и Excel. Наши решения используют камеру смартфона или профессиональные сканеры для чтения штрихкодов, QR-кодов и RFID-меток. В отличие от традиционного подхода, где инвентаризация занимает три дня и чревата ошибками при переносе, автоматизированное приложение позволяет нескольким сотрудникам сканировать одновременно, а данные агрегируются в центральной базе в реальном времени.
Основные проблемы, с которыми сталкиваются компании при внедрении: плохая читаемость кодов в сложных условиях, отсутствие офлайн-режима, сложности интеграции с 1С и SAP. Опыт показывает, что правильный выбор стека (ML Kit, CameraX, Room, WorkManager) и архитектуры (MVVM с Clean Architecture) решает 90% этих проблем. Средняя экономия после внедрения — до 1,5 млн рублей в год для склада с 5000 SKU. Оценим ваш проект — свяжитесь с нами для консультации.
Почему камера смартфона не справляется с чтением кодов на складе?
Самое частое разочарование при первом запуске — камера смартфона плохо читает коды в реальных условиях. ML Kit Barcode Scanning от Google — хороший выбор для Android: поддерживает EAN-13, EAN-8, Code 128, Code 39, QR, DataMatrix, PDF417, Aztec. Но при плохом освещении, бликах на упаковке или повреждённых этикетках распознавание нестабильно. Более подробно — в Google ML Kit Barcode Scanning.
Параметры, которые реально влияют на точность:
- Разрешение превью:
CameraXсResolutionSelector— минимум 1080p для мелких кодов -
BarcodeScannerс включённымENABLE_ALL_POTENTIALSфлагом — агрессивный режим, находит частично перекрытые коды - Авто-фокус через
FocusMeteringActionна центральную зону — без явного запуска иногда не срабатывает на бюджетных устройствах
Для промышленной инвентаризации — Zebra TC21/TC52 или Honeywell CT45. На этих устройствах аппаратный лазерный сканер работает через DataWedge Intent API. Лазерный сканер обрабатывает до 200 кодов в минуту, что в 5–7 раз быстрее камеры смартфона (20–30). На складе это принципиально.
| Тип сканера | Скорость (кодов/мин) | Условия работы | Рекомендация |
|---|---|---|---|
| Камера смартфона | 20–30 | Чувствительна к свету, бликам | Для эпизодического использования |
| Лазерный сканер (Zebra) | 150–200 | Устойчив к любым условиям | Для промышленных складов |
| RFID-считыватель (Zebra RFD) | 300+ меток/сек | Зона ±3 м, не требует прямой видимости | Для массовой инвентаризации |
Как работает офлайн-режим в приложении для инвентаризации?
Зоны без Wi-Fi есть на любом складе. Архитектура: Room для локального хранения отсканированных позиций + WorkManager для фоновой синхронизации. Ключевой момент — детектирование конфликтов. Если два сотрудника отсканировали одну и ту же позицию в офлайн, у неё будет два локальных события. На сервере нужна логика дедупликации по document_id + sku + timestamp.
При большой инвентаризации (50 000+ позиций) Room-запросы на выборку с фильтрами нужно покрывать составными индексами. @Index(value = ["sku", "location_code"]) в Entity — иначе поиск по двум полям без индекса работает как full scan.
RFID-инвентаризация
Отдельная история — RFID. Считыватели Zebra RFD40/RFD90 подключаются к смартфону через Zebra RFID SDK (Android). API сессии:
val rfidReader = RFIDReader(activity, readerName, null) rfidReader.connect() rfidReader.Events.setInventoryScanEvent(true) rfidReader.Events.addEventsListener(object : RfidEventsListener { override fun eventReadNotify(event: RfidReadEvents) { event.ReadEventData.tagData?.forEach { tag -> viewModel.onTagRead(tag.tagID, tag.peakRSSI) } } override fun eventStatusNotify(event: RfidStatusEvents) {} }) rfidReader.Actions.Inventory.perform() Одна антенна читает до 300 меток в секунду. Погрешность по зоне — плюс-минус 3 метра, что нужно учитывать при инвентаризации по ячейкам хранения. Для склада с 10 000 SKU экономия составляет свыше 3 млн рублей в год.
Как интегрировать сканирование в приложение: пошаговая инструкция
-
Добавьте зависимость в build.gradle:
implementation 'com.google.mlkit:barcode-scanning:17.2.0'. -
Создайте экземпляр BarcodeScanner с опциями:
BarcodeScannerOptions.Builder().setBarcodeFormats(Barcode.FORMAT_ALL_FORMATS).enableAllPotentialBarcodes().build(). - Настройте CameraX с
PreviewViewи привяжитеImageAnalysis.Analyzerдля подачи кадров в сканер. - Запустите сканирование и обработайте результат в колбэке:
scanner.process(image).addOnSuccessListener { barcodes -> ... }. - Для офлайн-режима сохраняйте результаты в Room, а синхронизацию настройте через WorkManager.
Процесс инвентаризации в приложении
Типовой flow: создание документа инвентаризации на сервере → загрузка в приложение → сканирование по зонам → сравнение с учётными данными → фиксация расхождений → отправка результата.
Важная деталь: пересчёт. Когда обнаружено расхождение, кладовщик должен пересканировать зону. Приложение должно позволять редактировать уже занесённые позиции до закрытия документа, но фиксировать все изменения с timestamp и user_id для аудита.
Интеграция с учётными системами
Большинство WMS и ERP предоставляют REST API для документов инвентаризации. 1С — через HTTP-сервисы расширения. SAP — через OData или RFC. Нестандартные системы — через CSV/Excel экспорт по расписанию (медленно, но работает).
| Тип интеграции | Скорость | Сложность |
|---|---|---|
| REST API | Высокая (секунды) | Средняя |
| OData | Средняя | Высокая |
| CSV/Excel | Низкая (часы) | Низкая |
Что входит в разработку приложения для сканирования?
- Архитектурная документация и API-спецификация (OpenAPI)
- Исходный код под Android/iOS/Flutter с покрытием unit-тестов
- Настройка CI/CD для App Store и Google Play
- Доступы к сторам и документация по деплою
- Обучение сотрудников работе с приложением
- Техническая поддержка и гарантия 6 месяцев
Сроки и стоимость
Сроки разработки: приложение под один тип сканирования с REST-интеграцией — 4–7 недель. Полный цикл с RFID, офлайн-режимом, несколькими интеграциями — 2–4 месяца. Стоимость рассчитывается после анализа требований к интеграции и поддерживаемым устройствам. Закажите разработку индивидуального решения — мы подберём оптимальный стек.







