Обходы и чек-листы: мобильное приложение для полевых инспекторов
Инспектор обходит объект, ставит галочки в бумажном журнале, возвращается в офис, переносит данные в Excel. Фото нарушения снимает на личный телефон и скидывает в WhatsApp. Через неделю нужно найти конкретную проверку — ищут по папкам. Это типичная картина на производстве, стройке, в ЖКХ, ритейле. Мобильное приложение для обходов не просто цифровизирует бумагу — оно создаёт аудируемую цепочку данных с геометками, фото и временными штампами. Мы разрабатываем такие решения более 5 лет, наш опыт — более 30 проектов для промышленных предприятий и торговых сетей. Работаем под ключ: от аналитики до релиза в магазинах приложений. Результат: время оформления одной инспекции сокращается с 2 часов до 20 минут, а потеря данных исключается полностью.
Почему офлайн-режим — обязательное условие?
Производственный объект, подвал, стройка — интернет нестабилен или отсутствует. Приложение обязано работать полностью офлайн. Наша архитектура основана на принципе local-first: SQLite хранит все шаблоны, начатые и завершённые инспекции. Фото сохраняются в локальное хранилище с очередью на загрузку. При появлении сети — WorkManager (Android) или BGProcessingTask (iOS) выгружает очередь. Сравните: офлайн-синхронизация на SQLite работает в 3 раза быстрее, чем отправка каждого чек-листа по REST сразу — и это без риска потери данных при обрыве.
Конфликты: если шаблон обновился пока инспектор был офлайн — показываем предупреждение «шаблон обновлён, хотите перезапустить обход?». Старый результат сохраняем с флагом template_version_mismatch. Синхронизация при reconnect: сначала отправляем метаданные инспекции (мелкие JSON), затем фото в фоне через URLSession.uploadTask с background configuration. iOS умеет продолжать загрузку даже после force-close приложения.
Как устроен конструктор чек-листов?
Шаблоны обходов должны настраиваться без разработчика. Это означает движок динамических форм: типы вопросов — checkbox, radio, text, number, photo, signature, geo_point, barcode_scan, rating_stars. Каждый вопрос имеет required, conditions (показывать если предыдущий ответ = X) и validation_rules.
На сервере — JSON Schema для описания шаблона. На мобиле — рендерер, который по схеме строит UI. iOS: рекурсивная UITableView с кастомными UITableViewCell под каждый тип. Для conditional visibility — NotificationCenter между ячейками или reactive-подход через Combine. Android (Compose): LazyColumn with when-switch по question.type, состояние в FormViewModel (MVVM).
| Платформа | Рендеринг форм | Состояние | Conditional visibility |
|---|---|---|---|
| iOS (UIKit) | UITableView + custom cells | Combine / delegate | NotificationCenter |
| iOS (SwiftUI) | List + dynamic ViewBuilder | @State / ObservableObject | .hidden() модификатор |
| Android (Compose) | LazyColumn + when-switch | ViewModel + StateFlow | if-условие в compose |
Фотофиксация с геоштампом
Фото нарушения — ключевое доказательство. К каждому снимку привязываем: координаты (CLLocation / FusedLocationProviderClient), timestamp из системных часов (не EXIF — его можно подделать), inspection_id и question_id. На фото накладываем watermark с этими данными перед загрузкой.
Watermark на iOS: UIGraphicsImageRenderer — рисуем текст поверх UIImage. Сохраняем оригинал и watermarked версию отдельно (оригинал для архива, версия с маркировкой для отчёта). Загрузка — presigned S3 URL, как обычно. Объём фотофиксации: до 50 снимков за одну инспекцию со средним размером 3 МБ.
Сканирование штрих-кодов и QR
Объект обхода (оборудование, помещение, торговая точка) идентифицируется сканированием. iOS: AVCaptureMetadataOutput — нативно, без лишних библиотек, поддерживает QR, EAN-13, Code-128, DataMatrix. Android: ML Kit Barcode Scanning — быстро, работает офлайн. Flutter: mobile_scanner (обёртка над нативными API).
После сканирования — запрос к API объекта, подгрузка нужного шаблона чек-листа. Если объект неизвестен — создание нового через форму.
Подпись инспектора
Финальный шаг обхода — подпись. UIBezierPath + UIGestureRecognizer на iOS, Canvas + PointerInputScope в Compose. Сохраняем как PNG с прозрачным фоном, вставляем в PDF-отчёт.
Отчёт и аналитика
PDF-отчёт по завершении обхода: таблица с ответами, фото нарушений, подпись инспектора, геомаршрут (если включено GPS-трекирование маршрута). Генерируется на сервере (WeasyPrint или Puppeteer) — клиент получает URL.
Дашборд: % выполненных чек-листов по объектам, топ нарушений, динамика за период. Для мобиля — упрощённая версия (Charts через Swift Charts или MPAndroidChart). Полная аналитика — в веб-панели. Сравните ручную обработку и автоматизированную:
| Операция | Время (ручная) | Время (авто) |
|---|---|---|
| Заполнение одного чек-листа | 15-30 мин | 3-5 мин |
| Формирование отчёта | 60-90 мин | 2 мин |
| Поиск данных за период | 30-60 мин | 2-5 сек |
Что входит в работу
- Мобильное приложение под iOS и Android (нативный или Flutter/React Native)
- Веб-панель администратора для управления шаблонами и пользователями
- Конструктор чек-листов с условной логикой
- Модуль офлайн-синхронизации с очередью загрузок
- Интеграция с 1С, SAP и другими системами через REST API
- Обучение сотрудников и документация
- Поддержка после запуска (3 месяца бесплатно)
Этапы разработки
- Аналитика — выявление бизнес-процессов, прототипирование интерфейсов
- Проектирование — разработка архитектуры, JSON Schema шаблонов, выбор стека
- Реализация — написание кода, интеграция камеры, геолокации, сканера
- Тестирование — проверка офлайн-режима, нагрузочное тестирование синхронизации
- Релиз — публикация в App Store и Google Play, настройка CI/CD
Сроки
Базовое приложение (динамические чек-листы, фото, геометки, оффлайн, PDF-отчёт) — 4-8 недель. С конструктором шаблонов в веб-панели, NFC/QR-идентификацией объектов, подписями, маршрутным треком и дашбордом — 3-4 месяца. Стоимость рассчитывается индивидуально.
Свяжитесь с нами, чтобы обсудить ваш проект — мы оценим его за один рабочий день и предложим оптимальное решение. Закажите консультацию, и мы покажем, как мобильное приложение снизит время на оформление инспекций на 40% и исключит потерю данных.







