Разработка мобильного приложения для складского учета
На складе с 15 000 позиций ручной учёт — это не просто медленно. Это ошибки в остатках, расхождение с 1С, инвентаризация по три дня. Мобильное приложение с интеграцией в WMS/ERP и поддержкой сканирования штрихкодов закрывает этот разрыв: кладовщик сканирует товар, данные уходят в систему мгновенно, остатки актуальны в реальном времени.
Сканирование: где чаще всего ломается
Первое, с чем сталкиваются при разработке — ненадёжность камерного сканирования в условиях склада. Плохое освещение, повреждённые этикетки, DataMatrix вместо привычного EAN-13. На Android CameraX + ML Kit Barcode Scanning закрывает большинство форматов (QR, Code128, Code39, DataMatrix, PDF417), но тонинг при ярком боковом свете даёт ложные срабатывания.
Решение — аппаратный сканер через Zebra DataWedge Intent API или Honeywell Mobility SDK. На устройствах Zebra TC-серии (TC21, TC52) DataWedge перехватывает скан и отправляет его как ACTION_BARCODE_DATA Intent. В приложении достаточно зарегистрировать BroadcastReceiver:
private val scanReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val barcode = intent.getStringExtra("com.symbol.datawedge.data_string")
val symbology = intent.getStringExtra("com.symbol.datawedge.label_type")
barcode?.let { viewModel.onBarcodeScanned(it, symbology) }
}
}
Камерное сканирование остаётся как fallback для обычных смартфонов. ZXing здесь хуже ML Kit — точность на PDF417 у зебры заметно ниже в реальных условиях.
Офлайн-режим и синхронизация
Складское приложение без офлайн-режима — нерабочее приложение. Зоны приёмки, стеллажи в дальних рядах, холодильные камеры — покрытие Wi-Fi нестабильно.
Архитектура: локальная база Room как источник истины, синхронизация через WorkManager при восстановлении соединения. Конфликты при мерже решаются по стратегии «последняя запись побеждает» с timestamp на сервере, либо через очередь операций с идемпотентными ключами.
Типичная проблема — транзакции при массовом приёме товара. Если пользователь отсканировал 200 позиций и приложение упало на 150-й, нужно либо откатить всё, либо продолжить с прерванной точки. Room поддерживает транзакции через @Transaction, но граница «что считать завершённой операцией» должна быть явно определена на уровне бизнес-логики.
Интеграция с 1С и WMS
REST API 1С через расширение конфигурации — самый частый сценарий. Формат обмена: JSON с типизированными полями для номенклатуры, складов, документов. На стороне мобильного приложения — Retrofit + OkHttp с interceptor для авторизации через Basic Auth или OAuth2.
Интеграция с промышленными WMS (SAP EWM, Manhattan, Solvo) чаще идёт через промежуточный брокер сообщений — RabbitMQ или Kafka. Мобильное приложение в этом случае работает с REST-фасадом, который скрывает специфику ERP.
Критичный момент: маппинг единиц измерения. В 1С «шт», «уп», «кор» — это строки, в ERP может быть числовой код. Ошибки в маппинге дают некорректные остатки, и это обнаруживается только при инвентаризации.
Функциональность типового складского приложения
- Приёмка товара по накладной с расхождением количества
- Перемещение между ячейками (адресное хранение)
- Подбор заказов (picking) с маршрутизацией по складу
- Инвентаризация — полная и выборочная по зонам
- Печать этикеток через Zebra ZPL или TSC TSPL на парный Bluetooth-принтер
- Просмотр остатков и истории движения по штрихкоду
Стек и подход
На Android — нативная разработка предпочтительна для работы с Zebra/Honeywell SDK. Kotlin + MVVM + Room + Retrofit. Для кросс-платформы: Flutter с flutter_barcode_sdk от Dynamsoft (поддерживает DataWedge intent) — жизнеспособный вариант, если нет жёсткой привязки к вендорскому SDK.
iOS используется значительно реже в складских сценариях из-за ограниченного выбора промышленных сканеров, но возможен через AVFoundation + Vision framework для камерного сканирования.
Сроки
Базовое приложение (приёмка + перемещение + инвентаризация + REST-интеграция): 6–10 недель. Полный цикл с кастомным WMS-бэкендом, адресным хранением и печатью: 3–5 месяцев. Стоимость зависит от объёма интеграций и числа поддерживаемых устройств.







