Интеграция с аппаратными возможностями мобильного устройства — одна из важнейших задач при разработке мобильных решений на платформе «1С:Предприятие 8». Работа с камерой позволяет автоматизировать ввод данных, фиксировать состояние объектов или создавать фотоотчеты. Рассмотрим подробно, как реализовать этот функционал, начиная от классических методов и заканчивая современными стандартами разработки.
Начиная с версии платформы 8.3.3, разработчикам стал доступен специализированный объект СредстваМультимедиа. Он предоставляет прямой доступ к камере устройства без необходимости глубокого изучения API операционных систем Android или iOS. Проанализируем пример кода, который позволяет сделать снимок:
&НаКлиенте
Процедура СделатьФотоснимок(Команда)
#Если МобильноеПриложениеКлиент Тогда
Если СредстваМультимедиа.ПоддерживаетсяФотоснимок() Тогда
// Вызываем диалог камеры
ДанныеМультимедиа = СредстваМультимедиа.СделатьФотоснимок();
Если ДанныеМультимедиа <> Неопределено Тогда
// Помещаем полученные данные во временное хранилище
АдресКартинки = ПоместитьВоВременноеХранилище(ДанныеМультимедиа.ПолучитьДвоичныеДанные());
// Дальнейшая логика обработки снимка
КонецЕсли;
Иначе
Сообщить("Съемка фото на данном устройстве не поддерживается.");
КонецЕсли;
#КонецЕсли
КонецПроцедуры
Разберем этот фрагмент подробнее. Прежде всего, мы используем директиву препроцессора #Если МобильноеПриложениеКлиент, так как методы работы с камерой недоступны в обычном тонком или толстом клиенте. Метод ПоддерживаетсяФотоснимок() позволяет избежать ошибок на устройствах, где камера отсутствует или заблокирована политиками безопасности.
Важно отметить, что метод СделатьФотоснимок() является синхронным. Это означает, что выполнение кода 1С приостанавливается до тех пор, пока пользователь не сделает снимок или не закроет приложение камеры. Несмотря на простоту, в ранних версиях платформы (как упоминалось в обсуждении) этот метод мог приводить к нестабильной работе на специфических моделях смартфонов, например, с несколькими модулями камер.
В современных версиях платформы (8.3.10 и выше) крайне рекомендуется использовать асинхронные методы. Это позволяет приложению оставаться отзывчивым и соответствует актуальным требованиям мобильных ОС. Вместо ожидания результата, мы передаем описание оповещения, которое сработает после завершения съемки.
Рассмотрим, как это выглядит на практике:
&НаКлиенте
Процедура НачатьСъемку(Команда)
Оповещение = Новый ОписаниеОповещения("ЗавершитьСъемку", ЭтотОбъект);
СредстваМультимедиа.ПоказатьСканированиеШтрихКодов("Наведите камеру на объект", Оповещение);
// Или для фото:
СредстваМультимедиа.НачатьФотоснимок(Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ЗавершитьСъемку(Результат, ДополнительныеПараметры) Экспорт
Если Результат <> Неопределено Тогда
// Результат — это объект ДанныеМультимедиа
ДвоичныеДанные = Результат.ПолучитьДвоичныеДанные();
// Сохраняем или отображаем фото
КонецЕсли;
КонецПроцедуры
Этот метод гораздо надежнее, так как он корректно обрабатывает жизненный цикл мобильного приложения и минимизирует риск «падения» интерфейса при нехватке оперативной памяти.
Выясним причину, по которой иногда стандартных средств 1С бывает недостаточно. Например, если требуется специфическое поведение приложения камеры или работа на очень старых версиях платформы. В таких случаях можно воспользоваться объектом ЗапускПриложенияМобильногоУстройства, который отправляет системный запрос (Intent) операционной системе Android.
Посмотрим на пример реализации через системный вызов:
// Подготовим путь к файлу, куда камера должна сохранить снимок
ПутьКФайлу = "file://" + КаталогДокументов() + "temp_photo.jpg";
НовВз = Новый ЗапускПриложенияМобильногоУстройства("android.media.action.IMAGE_CAPTURE");
// Указываем параметр output, чтобы получить полноразмерное фото, а не превью
НовВз.ДополнительныеДанные.Добавить("output", ПутьКФайлу, "Uri");
Если НовВз.Запустить(Истина) <> 0 Тогда
// Если результат не 0, значит фото сделано успешно
Картинка = Новый Картинка(ПутьКФайлу);
// Обработка полученного файла
КонецЕсли;
Преимущество данного метода заключается в том, что вы используете родное приложение камеры устройства со всеми его настройками (фокус, HDR, вспышка). Однако стоит помнить, что этот код будет работать только на Android. Для кроссплатформенной разработки (iOS + Android) лучше придерживаться объекта СредстваМультимедиа.
Проанализируем важный аспект, который часто упускают начинающие разработчики. В современных версиях Android и iOS приложение обязано явно запрашивать доступ к аппаратным функциям. Если вы просто вызовете метод камеры, и у приложения не будет соответствующих прав, система может его принудительно закрыть.
Перед началом работы с камерой выполним следующие шаги:
СредстваМультимедиа.ПроверитьРазрешение().СредстваМультимедиа.ЗапроситьРазрешение().Фотографии с современных смартфонов могут весить 10 МБ и более. Если сохранять такие файлы напрямую в информационную базу (ИБ), она очень быстро разрастется до критических размеров. Рекомендуем следующий алгоритм работы:
ДанныеМультимедиа.Картинка.Преобразовать()) для уменьшения разрешения и качества перед отправкой на сервер.ПоместитьВоВременноеХранилище() при передаче данных между клиентом и сервером.Подводя итог, можно сказать, что 1С прошла большой путь в развитии мобильной платформы. Если раньше разработчикам приходилось искать внешние компоненты или использовать сложные системные вызовы, то сегодня объект СредстваМультимедиа предоставляет стабильный и удобный инструмент для решения 99% задач, связанных с камерой. При необходимости можно воспользоваться готовым мобильным приложением для быстрой отправки фотографий в 1С.