Рассмотрим распространенную задачу при разработке мобильных приложений на платформе 1С: пользователю необходимо сделать фотографию (или выбрать ее из галереи мобильного устройства), задать ей имя и отправить в центральную базу или в определенную папку на сервере. Разберем по шагам, как правильно выстроить архитектуру такого решения, какие существуют подводные камни и как оптимизировать процесс передачи медиафайлов.
Самый простой и исторически первый подход, который часто приходит на ум разработчикам, — это создание стандартного SOAP Web-сервиса на стороне центральной базы. Проанализируем этот метод.
На сервере мы создаем Web-сервис, который принимает строковый параметр, переводит его обратно в двоичные данные и сохраняет на диск. В мобильном приложении мы пишем код для выбора картинки, затем берем двоичные данные файла, заворачиваем их в строку (обычно используется кодировка Base64) и вызываем метод Web-сервиса.
Однако здесь мы столкнемся с серьезной проблемой. На современных смартфонах камеры обладают очень высоким разрешением, и исходные фотографии получаются огромными по размеру. При конвертации двоичных данных картинки в формат Base64 для передачи через XML-пакет, итоговый размер данных увеличивается еще примерно на 30–40%. В результате стандартное время вызова Web-сервиса (таймаут которого по умолчанию составляет 20 секунд) может просто истечь, и мы получим ошибку соединения. Фотография не будет передана.
Посмотрим на более современное и эффективное решение. Гораздо быстрее передавать медиафайлы с помощью HTTP-сервисов. При таком подходе мы избавляемся от "раздувания" данных в XML-формате.
В мобильном приложении мы формируем POST-запрос к нашему HTTP-сервису, а двоичные данные картинки помещаем напрямую в тело запроса. Для этого мы применим метод УстановитьТелоИзДвоичныхДанных. На стороне сервера центральной базы мы легко примем эти данные с помощью метода ПолучитьТелоКакДвоичныеДанные. Это значительно ускорит процесс и поможет избежать проблемы с таймаутами.
Разберем, как получить саму картинку на стороне мобильного клиента. Нам не нужно изобретать сложные формы или писать внешние компоненты. Платформа 1С предоставляет готовый менеджер СредстваМультимедиа.
СделатьФотоснимок.ВыбратьФотоснимок.Эти методы обеспечивают штатное взаимодействие с операционной системой устройства (например, Android) и возвращают готовые данные, с которыми можно работать дальше.
Выясним причину частых сбоев в работе подобных приложений. Как мы уже отметили, оригинальные фото весят очень много. Для учетной системы (например, чтобы зафиксировать брак товара или подписанный документ) оригинальное качество в 10–20 Мегабайт абсолютно не требуется.
Решим эту проблему программно до начала передачи файла. В платформе 1С существует объект ОбрабатываемаяКартинка. С его помощью мы можем изменить масштаб изображения. Например, мы можем уменьшить разрешение до 1024 пикселей по большей стороне, используя метод УстановитьРазмер, а также снизить качество сжатия JPEG.
Выполнив эти манипуляции, мы кардинально уменьшим вес файла (например, с 10 МБ до 200–300 КБ) без визуальной потери информативности. Это гарантирует мгновенную отправку файла даже при плохом мобильном интернете.
Рассмотрим вопрос удобства пользователя. Если мы будем отправлять фотографию синхронно, интерфейс мобильного приложения "зависнет" на время передачи данных. Это может вызвать раздражение у пользователя, который подумает, что приложение зависло.
Обязательно делайте все запросы к серверу асинхронными. Использование асинхронных методов HTTP-соединения позволит пользователю продолжать работу с мобильным приложением (например, заполнять текстовые поля или переходить к следующему заданию), пока фотография спокойно отправляется в фоновом режиме.
Проанализируем ситуацию, когда бизнес-процесс строго требует передачи фотографий в исходном, максимальном качестве (например, для детальной страховой экспертизы повреждений).
В этом случае передавать такие тяжелые файлы через сервер 1С ресурсозатратно — это создаст лишнюю нагрузку на рабочий процесс базы. В качестве решения мобильное приложение может загружать файлы напрямую на выделенный файловый сервер. Для этого мы можем использовать объект платформы FTPСоединение или отправлять файлы по REST API прямо в облачное хранилище (например, Amazon S3 или Яндекс.Облако).
В саму же базу 1С мобильное приложение отправит только легкий текстовый запрос, содержащий имя файла, уникальный идентификатор и прямую ссылку на место его хранения на файловом сервере. Центральная база сохранит эту ссылку, и пользователи десктопной версии смогут открывать фотографии напрямую из хранилища.
Подведем итог: для успешной загрузки картинок с мобильного устройства необходимо отказаться от SOAP-сервисов в пользу HTTP-сервисов, обязательно проводить предварительное сжатие изображений перед отправкой с помощью ОбрабатываемаяКартинка и выполнять все сетевые вызовы асинхронно, чтобы обеспечить плавность интерфейса мобильного приложения.