При разработке мобильных решений на платформе 1С часто возникает задача фиксации событий с помощью видеокамеры. Это может быть видеоотчет со склада, запись процесса приемки товара или фиксация состояния оборудования. Рассмотрим подробно, как реализовать этот функционал, учитывая специфику мобильной платформы Android и ограничения веб-клиента.
Для реализации записи видео в мобильном клиенте или на мобильной платформе мы используем встроенные возможности платформы, а именно объект СредстваМультимедиа. Основным инструментом здесь является метод СделатьВидеозапись(). Разберем по шагам, как это работает.
Важно понимать, что 1С не записывает видео «в фоне» своими силами. При вызове метода платформа передает управление системному приложению камеры Android. Проанализируем типичный сценарий использования этого метода:
// Пример вызова записи видео
ПараметрыЗаписи = Новый ПараметрыВидеозаписи;
ПараметрыЗаписи.Качество = КачествоВидеозаписи.Низкое; // Рекомендуется для экономии трафика
ПараметрыЗаписи.МаксимальнаяДлительность = 60; // Ограничение в секундах
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеЗаписиВидео", ЭтотОбъект);
СредстваМультимедиа.СделатьВидеозапись(ОписаниеОповещения, ПараметрыЗаписи);
Рассмотрим параметры, которые мы можем настроить. Свойство Качество позволяет выбрать между Низкое, Среднее и Высокое. Для бизнес-задач чаще всего достаточно низкого или среднего качества, так как это значительно уменьшает размер файла, что критично для мобильного интернета. Свойство МаксимальнаяДлительность помогает предотвратить создание чрезмерно тяжелых роликов, которые будет сложно передать на сервер.
После того как пользователь закончит запись в интерфейсе камеры и нажмет кнопку сохранения, управление вернется в 1С, и сработает процедура обратного вызова (в нашем примере — ПослеЗаписиВидео). Выясним, что мы получаем на входе в эту процедуру:
Процедура ПослеЗаписиВидео(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат; // Пользователь отменил запись
КонецЕсли;
// Получаем объект ДанныеМультимедиа
ВидеоДанные = Результат.Данные;
Расширение = Результат.Расширение;
// Теперь у нас есть ДвоичныеДанные файла в переменной ВидеоДанные
КонецПроцедуры
Как только мы получили видеофайл в виде объекта ДвоичныеДанные, возникает вопрос его передачи на сервер. Если видео длится несколько минут и записано в хорошем качестве, его размер может достигать сотен мегабайт. Попытка передать такой объем «в лоб» через обычный параметр серверного метода приведет к ряду проблем:
Проанализируем способы решения этой задачи, начиная от самых простых и заканчивая профессиональными архитектурными подходами.
Для стандартных задач лучше всего использовать метод НачатьПомещениеФайлаНаСервер(). Это встроенный механизм платформы, который оптимизирован для передачи данных. Он позволяет загружать файл, не блокируя основной поток интерфейса, и даже выводить прогресс-бар пользователю.
Разберем пример реализации:
// Подготовим описание оповещения о завершении загрузки
ОповещениеЗавершения = Новый ОписаниеОповещения("ЗавершениеЗагрузкиНаСервер", ЭтотОбъект);
// Параметры помещения файла
ПараметрыПомещения = Новый ПараметрыПомещенияФайлаНаСервер;
ПараметрыПомещения.Интерактивно = Ложь;
// Передаем данные на сервер
НачатьПомещениеФайлаНаСервер(ОповещениеЗавершения, , , , ВидеоДанные, УникальныйИдентификатор);
Этот метод хорош тем, что платформа сама заботится о стабильности передачи в рамках сеанса. Однако для «гигантских» файлов этого может быть недостаточно.
Если нам необходимо передавать видеофайлы объемом в несколько гигабайт, рассмотрим стратегию разбивки файла на части (чанки). Это самый надежный способ, используемый в таких сервисах, как Telegram или WhatsApp.
Алгоритм действий будет следующим:
HTTP-сервис.Для разбивки и склеивания данных в 1С используем объекты ЧтениеДанных и ЗаписьДанных. Посмотрим на логику разделения файла:
// Пример логики на клиенте (схематично)
РазмерПорции = 1024 * 1024; // 1 МБ
Поток = ВидеоДанные.ОткрытьПотокДляЧтения();
Пока Поток.ТекущаяПозиция() < Поток.Размер() Цикл
ЧастьДанных = Поток.Прочитать(РазмерПорции);
// Отправляем ЧастьДанных через HTTP-запрос на сервер
КонецЦикла;
На сервере для восстановления файла мы используем метод ОбъединитьФайлы(), который позволяет собрать итоговый видеофайл из списка переданных фрагментов.
Часто проблема передачи видео кроется не в коде 1С, а в настройках среды публикации. Разберем важные моменты настройки веб-серверов:
Если вы используете IIS (Internet Information Services), необходимо увеличить лимит maxAllowedContentLength в файле web.config. По умолчанию он часто составляет около 30 МБ, чего явно недостаточно для видео.
В случае с Apache следует обратить внимание на директиву LimitRequestBody. Также убедитесь, что таймауты (Timeout, KeepAliveTimeout) установлены с запасом, учитывая возможную низкую скорость мобильного интернета у пользователя.
Выясним важный нюанс: мобильный клиент 1С подчиняется правилам операционной системы Android. Если пользователь свернет приложение 1С во время долгой загрузки тяжелого видео, система может «заморозить» процесс отправки данных для экономии заряда батареи.
Чтобы избежать обрывов связи, рекомендуется:
Систему взаимодействия для уведомления пользователя о том, что файл успешно обработан на сервере.Подводя итог, можно сказать, что 1С-тонкий клиент для Android успешно справляется с записью видео через СредстваМультимедиа. Основная сложность заключается в грамотной организации передачи данных. Использование асинхронных методов и, при необходимости, разбивка файлов на порции позволяют создать стабильное и удобное мобильное решение.