Как организовать запись видео в 1С-клиенте на Android и передать его на сервер

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке мобильных решений на платформе 1С часто возникает задача фиксации событий с помощью видеокамеры. Это может быть видеоотчет со склада, запись процесса приемки товара или фиксация состояния оборудования. Рассмотрим подробно, как реализовать этот функционал, учитывая специфику мобильной платформы Android и ограничения веб-клиента.

Запись видео с помощью средств мультимедиа 1С

Для реализации записи видео в мобильном клиенте или на мобильной платформе мы используем встроенные возможности платформы, а именно объект СредстваМультимедиа. Основным инструментом здесь является метод СделатьВидеозапись(). Разберем по шагам, как это работает.

Важно понимать, что 1С не записывает видео «в фоне» своими силами. При вызове метода платформа передает управление системному приложению камеры Android. Проанализируем типичный сценарий использования этого метода:


// Пример вызова записи видео
ПараметрыЗаписи = Новый ПараметрыВидеозаписи;
ПараметрыЗаписи.Качество = КачествоВидеозаписи.Низкое; // Рекомендуется для экономии трафика
ПараметрыЗаписи.МаксимальнаяДлительность = 60; // Ограничение в секундах

ОписаниеОповещения = Новый ОписаниеОповещения("ПослеЗаписиВидео", ЭтотОбъект);

СредстваМультимедиа.СделатьВидеозапись(ОписаниеОповещения, ПараметрыЗаписи);

Рассмотрим параметры, которые мы можем настроить. Свойство Качество позволяет выбрать между Низкое, Среднее и Высокое. Для бизнес-задач чаще всего достаточно низкого или среднего качества, так как это значительно уменьшает размер файла, что критично для мобильного интернета. Свойство МаксимальнаяДлительность помогает предотвратить создание чрезмерно тяжелых роликов, которые будет сложно передать на сервер.

После того как пользователь закончит запись в интерфейсе камеры и нажмет кнопку сохранения, управление вернется в 1С, и сработает процедура обратного вызова (в нашем примере — ПослеЗаписиВидео). Выясним, что мы получаем на входе в эту процедуру:


Процедура ПослеЗаписиВидео(Результат, ДополнительныеПараметры) Экспорт
    Если Результат = Неопределено Тогда
        Возврат; // Пользователь отменил запись
    КонецЕсли;
    
    // Получаем объект ДанныеМультимедиа
    ВидеоДанные = Результат.Данные;
    Расширение = Результат.Расширение;
    
    // Теперь у нас есть ДвоичныеДанные файла в переменной ВидеоДанные
КонецПроцедуры

Проблема передачи больших файлов на сервер

Как только мы получили видеофайл в виде объекта ДвоичныеДанные, возникает вопрос его передачи на сервер. Если видео длится несколько минут и записано в хорошем качестве, его размер может достигать сотен мегабайт. Попытка передать такой объем «в лоб» через обычный параметр серверного метода приведет к ряду проблем:

  1. Превышение таймаута: Веб-сервер (IIS или Apache) может разорвать соединение по истечении времени ожидания.
  2. Ограничение размера запроса: Настройки веб-сервера часто ограничивают входящий пакет (например, 30 МБ).
  3. Потребление памяти: На мобильном устройстве попытка загрузить файл размером 1 ГБ в оперативную память может привести к принудительному закрытию приложения системой Android (Out of Memory).

Проанализируем способы решения этой задачи, начиная от самых простых и заканчивая профессиональными архитектурными подходами.

Решение 1: Использование асинхронного помещения файла

Для стандартных задач лучше всего использовать метод НачатьПомещениеФайлаНаСервер(). Это встроенный механизм платформы, который оптимизирован для передачи данных. Он позволяет загружать файл, не блокируя основной поток интерфейса, и даже выводить прогресс-бар пользователю.

Разберем пример реализации:


// Подготовим описание оповещения о завершении загрузки
ОповещениеЗавершения = Новый ОписаниеОповещения("ЗавершениеЗагрузкиНаСервер", ЭтотОбъект);

// Параметры помещения файла
ПараметрыПомещения = Новый ПараметрыПомещенияФайлаНаСервер;
ПараметрыПомещения.Интерактивно = Ложь;

// Передаем данные на сервер
НачатьПомещениеФайлаНаСервер(ОповещениеЗавершения, , , , ВидеоДанные, УникальныйИдентификатор);

Этот метод хорош тем, что платформа сама заботится о стабильности передачи в рамках сеанса. Однако для «гигантских» файлов этого может быть недостаточно.

Решение 2: Передача файла частями (Chunking)

Если нам необходимо передавать видеофайлы объемом в несколько гигабайт, рассмотрим стратегию разбивки файла на части (чанки). Это самый надежный способ, используемый в таких сервисах, как Telegram или WhatsApp.

Алгоритм действий будет следующим:

  1. На мобильном устройстве считываем файл порциями (например, по 1-2 МБ).
  2. Каждую порцию отправляем на сервер через специально созданный HTTP-сервис.
  3. На стороне сервера 1С принимаем части и последовательно записываем их в один файл во временном хранилище или на диск.
  4. После передачи последней части проверяем целостность файла.

Для разбивки и склеивания данных в 1С используем объекты ЧтениеДанных и ЗаписьДанных. Посмотрим на логику разделения файла:


// Пример логики на клиенте (схематично)
РазмерПорции = 1024 * 1024; // 1 МБ
Поток = ВидеоДанные.ОткрытьПотокДляЧтения();
Пока Поток.ТекущаяПозиция() < Поток.Размер() Цикл
    ЧастьДанных = Поток.Прочитать(РазмерПорции);
    // Отправляем ЧастьДанных через HTTP-запрос на сервер
КонецЦикла;

На сервере для восстановления файла мы используем метод ОбъединитьФайлы(), который позволяет собрать итоговый видеофайл из списка переданных фрагментов.

Настройка серверной инфраструктуры

Часто проблема передачи видео кроется не в коде 1С, а в настройках среды публикации. Разберем важные моменты настройки веб-серверов:

Если вы используете IIS (Internet Information Services), необходимо увеличить лимит maxAllowedContentLength в файле web.config. По умолчанию он часто составляет около 30 МБ, чего явно недостаточно для видео.

В случае с Apache следует обратить внимание на директиву LimitRequestBody. Также убедитесь, что таймауты (Timeout, KeepAliveTimeout) установлены с запасом, учитывая возможную низкую скорость мобильного интернета у пользователя.

Особенности фоновой работы на Android

Выясним важный нюанс: мобильный клиент 1С подчиняется правилам операционной системы Android. Если пользователь свернет приложение 1С во время долгой загрузки тяжелого видео, система может «заморозить» процесс отправки данных для экономии заряда батареи.

Чтобы избежать обрывов связи, рекомендуется:

Подводя итог, можно сказать, что 1С-тонкий клиент для Android успешно справляется с записью видео через СредстваМультимедиа. Основная сложность заключается в грамотной организации передачи данных. Использование асинхронных методов и, при необходимости, разбивка файлов на порции позволяют создать стабильное и удобное мобильное решение.

← На главную