Полный модуль своего автономного мобильного Пульта: мобильная камера: настоящий режим, предпросмотр фото и свой ролик. Подготовка, действительные источники данных, отмена, границы контекста и контроль результата описаны отдельно.
Где и как запускать
Полный модуль управляемой формы Пульт собственного автономного мобильного приложения УчебноеМультимедиа85; здесь не выполнялся.
Подготовка
Создать НОВУЮ отдельную конфигурацию УчебноеМультимедиа85 для автономного мобильного приложения8.5.1.1343; совместимость Не использовать. Не рабочую базу. Для опытов нужен свой Android/iOS и соответствующая мобильная платформа, не Windows desktop и не подключенный мобильный клиент.
Конфигуратор → Обработки → УчебноеМультимедиа85 → Формы → Пульт: управляемая форма. Вставить ВЕСЬ модуль только одного урока. Его ПриОткрытии и ПередЗакрытием назначить событиям формы через конструктор. ПриОткрытии имеет Отказ; ПередЗакрытием — четыре аргумента Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка.
Реквизиты формы: Согласие — Булево, начальное значение Ложь; Итог — Строка неограниченной длины, многострочное поле только просмотра. Для камеры/документов дополнительно Предпросмотр — Картинка и поле картинки с этим путем к данным.
Создать команды СнятьФото, СнятьВидео, действия с точно теми же именами и кнопки. При снятом Согласие новая операция не начинается; результат сканирования также не принимается без согласия.
Для штрихкодового урока добавить РазрешенныйКод — Строка длины13 и поле ввода; до открытия сканера вписать цифры своей реальной упаковки. Для остальных уроков реквизит не нужен.
Сохранить свою конфигурацию, проверить и обновить собственную базу (F7). Включить требуемую функциональность мобильного приложения — камеру/микрофон для выбранного урока — и развернуть только собственный учебный пакет на своем устройстве обычным для вашей мобильной платформы способом. Здесь сборка пакета, установка и F7 не выполнялись.
На устройстве самостоятельно дать нужные разрешения ОС только перед своим опытом. Согласие на форме не заменяет разрешение ОС. Снимать только свою бумагу/упаковку, записывать свою короткую фразу; не чужие лица, разговоры, документы или экран.
Весь модуль содержит проверенные ветви препроцессора: мобильные API только в МобильноеПриложениеКлиент, имя базы — только в МобильноеПриложениеСервер. Проверка базы локальная для автономного приложения, не сетевой сервер. API также существует у мобильного клиента, но этот конкретный стенд намеренно автономный.
runtimeVerifiedScenarios=0. Проверена только установленная справка и исходный HTML/код. Камера, микрофон, голос, устройство, 1С и ОС-разрешения здесь не запускались; новых резервных копий не создано.
#Если МобильноеПриложениеКлиент Тогда
Перем СвойЗапуск, СвояОперация, СвояГотовность;
&НаКлиенте
Процедура ПриОткрытии(Отказ)
СвойЗапуск = Неопределено;
СвояОперация = "";
СвояГотовность = Ложь;
Согласие = Ложь;
Итог = "Установите согласие только перед собственным опытом";
Попытка
ПроверитьСвойМобильныйСтендНаСервере();
Если ТипЗнч(СредстваМультимедиа) <> Тип("СредстваМультимедиа") Тогда
ВызватьИсключение "Нужен реальный глобальный мобильный объект мультимедиа";
КонецЕсли;
СвояГотовность = Истина;
Исключение
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
СтандартнаяОбработка = Истина;
Если СвояОперация <> "" Тогда
Отказ = Истина;
ТекстПредупреждения = "Сначала завершите только свой опыт: " + СвояОперация;
Если Не ЗавершениеРаботы Тогда
Сообщить(ТекстПредупреждения);
КонецЕсли;
Возврат;
КонецЕсли;
СвояГотовность = Ложь;
СвойЗапуск = Неопределено;
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьСвоеСогласие()
Если Не СвояГотовность Или Не Согласие Тогда
ВызватьИсключение "Нужны открытое собственное окно и явное согласие на этот опыт";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция НачатьСвойОпыт(Операция)
ПроверитьСвоеСогласие();
Если СвояОперация <> "" Тогда
ВызватьИсключение "Не запускайте второй собственный опыт до завершения первого";
КонецЕсли;
СвойЗапуск = Новый УникальныйИдентификатор;
СвояОперация = Операция;
Итог = Операция;
Возврат СвойЗапуск;
КонецФункции
&НаКлиенте
Функция ЭтоСвойОпыт(Запуск)
Возврат СвояГотовность И СвойЗапуск <> Неопределено И Запуск = СвойЗапуск;
КонецФункции
&НаКлиенте
Процедура ЗавершитьСвойОпыт(Запуск)
Если ЭтоСвойОпыт(Запуск) Тогда
СвойЗапуск = Неопределено;
СвояОперация = "";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СнятьФото(Команда)
Запуск = НачатьСвойОпыт("Собственная фотография");
Предпросмотр = Неопределено;
Попытка
Если Не СредстваМультимедиа.ПоддерживаетсяФотоснимок(ТипКамерыУстройства.Задняя) Тогда
ВызватьИсключение "Для собственного опыта нужна доступная задняя камера";
КонецЕсли;
Разрешения = СредстваМультимедиа.ПолучитьПоддерживаемыеРазрешенияКамеры(ТипКамерыУстройства.Задняя);
Разрешение = ВыбратьСвоеРазрешение(Разрешения);
Если Разрешение = Неопределено Тогда
Данные = СредстваМультимедиа.СделатьФотоснимок(ТипКамерыУстройства.Задняя, , 85, Ложь);
Иначе
Данные = СредстваМультимедиа.СделатьФотоснимок(ТипКамерыУстройства.Задняя, Разрешение, 85, Ложь);
КонецЕсли;
Если Данные = Неопределено Тогда
Итог = "Фотографирование отменено; старый кадр не показывается";
Иначе
Двоичные = ПолучитьСвоиНебольшиеДанные(Данные, "image/");
Предпросмотр = Новый Картинка(Двоичные);
Итог = "Собственное фото: " + Данные.ТипСодержимого + "; " + Строка(Двоичные.Размер()) + " байт; " + Данные.РасширениеФайла;
КонецЕсли;
ЗавершитьСвойОпыт(Запуск);
Исключение
ЗавершитьСвойОпыт(Запуск);
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Функция ВыбратьСвоеРазрешение(Разрешения)
Если Разрешения = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
Если ТипЗнч(Разрешения) <> Тип("Массив") Или Разрешения.Количество() = 0 Тогда
ВызватьИсключение "Нужен фактический непустой перечень режимов камеры или Неопределено для iOS";
КонецЕсли;
Выбранное = Неопределено;
Для Каждого Кандидат Из Разрешения Цикл
Если ТипЗнч(Кандидат) <> Тип("РазрешениеКамерыУстройства")
Или Кандидат.Ширина <= 0 Или Кандидат.Высота <= 0 Тогда
ВызватьИсключение "Нужен реальный режим с положительными размерами";
КонецЕсли;
Если Выбранное = Неопределено Тогда
Выбранное = Кандидат;
ИначеЕсли Кандидат.Ширина * Кандидат.Высота < Выбранное.Ширина * Выбранное.Высота Тогда
Выбранное = Кандидат;
КонецЕсли;
КонецЦикла;
Сообщить("Из реального списка выбран наименьший кадр: " + Строка(Выбранное.Ширина) + "×" + Строка(Выбранное.Высота));
Возврат Выбранное;
КонецФункции
&НаКлиенте
Процедура СнятьВидео(Команда)
Запуск = НачатьСвойОпыт("Собственная видеозапись");
Попытка
Если Не СредстваМультимедиа.ПоддерживаетсяВидеозапись(ТипКамерыУстройства.Задняя) Тогда
ВызватьИсключение "Видеозапись задней камерой не поддерживается";
КонецЕсли;
Данные = СредстваМультимедиа.СделатьВидеозапись(ТипКамерыУстройства.Задняя);
Если Данные = Неопределено Тогда
Итог = "Видеозапись отменена";
Иначе
Двоичные = ПолучитьСвоиНебольшиеДанные(Данные, "video/");
Итог = "Собственное видео: " + Данные.ТипСодержимого + "; " + Строка(Двоичные.Размер()) + " байт; " + Данные.РасширениеФайла;
КонецЕсли;
ЗавершитьСвойОпыт(Запуск);
Исключение
ЗавершитьСвойОпыт(Запуск);
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Функция ПолучитьСвоиНебольшиеДанные(Данные, СемействоMIME)
Если ТипЗнч(Данные) <> Тип("ДанныеМультимедиа") Тогда
ВызватьИсключение "Нужен настоящий результат своего мобильного захвата";
КонецЕсли;
Если Лев(Данные.ТипСодержимого, СтрДлина(СемействоMIME)) <> СемействоMIME Тогда
ВызватьИсключение "Получен другой вид мультимедиа, не " + СемействоMIME;
КонецЕсли;
Двоичные = Данные.ПолучитьДвоичныеДанные();
Если Двоичные.Размер() = 0 Или Двоичные.Размер() > 33554432 Тогда
ВызватьИсключение "Для этого собственного опыта нужен непустой результат не более32МиБ";
КонецЕсли;
Возврат Двоичные;
КонецФункции
#Иначе
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Отказ = Истина;
Сообщить("Откройте свою отдельную автономную мобильную базу УчебноеМультимедиа85, не desktop или подключенный мобильный клиент");
КонецПроцедуры
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
Отказ = Ложь;
СтандартнаяОбработка = Истина;
КонецПроцедуры
&НаКлиенте
Процедура СнятьФото(Команда)
ВызватьИсключение "Этот собственный урок только для автономного мобильного приложения";
КонецПроцедуры
&НаКлиенте
Процедура СнятьВидео(Команда)
ВызватьИсключение "Этот собственный урок только для автономного мобильного приложения";
КонецПроцедуры
#КонецЕсли
&НаСервереБезКонтекста
Процедура ПроверитьСвойМобильныйСтендНаСервере()
#Если МобильноеПриложениеСервер Тогда
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Собственный опыт не запускается внутри чужой транзакции";
КонецЕсли;
#Иначе
ВызватьИсключение "Этот стенд требует локального сервера автономного мобильного приложения";
#КонецЕсли
КонецПроцедурыРазбор по шагам
Согласие относится только к своей учебной бумаге без лиц и чужих документов. Перед фото проверить поддержку Задней камеры; затем получить фактический список ее разрешений.
Из реального непустого массива выбрать режим с минимальным числом пикселей. Не создавать описание1920×1080 и не выдавать его за поддерживаемый режим. Для iOS Неопределено штатно: необязательный аргумент разрешения пропускается, применяется native-умолчание; сам параметр системой игнорируется.
СделатьФотоснимок получает выбранный реальный объект разрешения, качество85 из диапазона1..100 и ЧерноБелый=Ложь. Остальные параметры оставлены native-умолчаниями.
На отмене очищенный Предпросмотр остается пустым. У реального результата проверить MIMEimage/, непустые байты, лимит32МиБ; создать Картинка из этих же реальных двоичных данных и показать реквизит формы.
Отдельно проверить поддержку видеозаписи той же Задней камеры и снять свой ролик3–5 секунд. Качество не зашито как неподдерживаемое число: используется native-умолчание метода.
У ролика проверить настоящие данныеvideo/, размер и рекомендованное расширение. Этот урок не проигрывает видео через аудиоплеер и не утверждает, что строка MIME доказывает визуальное качество.
Ошибка разрешения ОС/занятой камеры освобождает свой сеанс и остается ошибкой. Код не сохраняет файл и не печатает; ограничения относятся к собственной короткой записи, не к безопасной загрузке произвольного большого видео.
Как проверить результат
Будущий ручной запуск должен получить настоящий результат выбранного API на своем устройстве и пройти условия своего урока. Положительный флаг поддержки или отсутствие исключения само по себе не означает, что данные получены.
Без согласия новая операция должна отказать. Отмена должна оставлять отмену, а ошибка запуска — ошибку; второе нажатие не должно подменять активный GUID собственного опыта.
Проверьте отдельный отрицательный опыт по шагам урока: отсутствие голосового пакета, отмену захвата, чужой код или низкое качество/лишнюю страницу. Не подставляйте фиктивный объект или ожидаемые байты вместо результата платформы.
После освобождения собственного сеанса форму можно закрыть. При собственном активном сеансе ПередЗакрытием должен предложить сначала завершить его; поздний callback другого GUID не должен изменить Итог.
runtimeVerifiedScenarios=0. Все аппаратные результаты, ошибки и проверки здесь — условия будущей ручной приемки, а не выполненный тест1С.
Ожидаемый результат
Подготовлен самостоятельный мобильный урок с собственным сеансом и действительными результатами платформы; аппаратно здесь не запускался.
На что обратить внимание
СредстваМультимедиа — глобальное readonly-свойство мобильного контекста. Не создавать этот объект через Новый, не передавать неизвестный ИсходныйОбъект и не переносить вызовы в серверный/desktop-код.
Этот полный стенд рассчитан на автономное мобильное приложение. Серверная проверка имени конфигурации работает локально на устройстве; Метаданные.Имя не читается в мобильной клиентской ветви.
Поддерживается... — проверка возможностей, не разрешений ОС, занятости камеры/микрофона, качества изображения или слышимости звука. Отказ ОС и отмена пользователя требуют отдельной проверки.
Имена публичных callback связаны с настоящими ОписаниеОповещения и проверяются по GUID. Для аудио, текста, страницы, завершения серии и штрихкода сигнатуры различны; их нельзя заменять одним универсальным обработчиком.
Код явно не сохраняет медиа, не вызывает HTTP, почту, печать или бизнес-запись. Платформа/ОС могут использовать свой временный кэш; очистка переменной не доказывает удаление этого кэша. Размер32МиБ проверяется после получения байтов и не обещает предотвратить их первоначальную аллокацию.
Нормированная оценка сканирования не является OCR, распознанным текстом или гарантией юридической пригодности документа. Строгая политика>=7 каждого показателя — решение этого собственного примера.
Callback остановки звука/текста не всегда означает окончательное завершение: уведомление может временно прервать звук с последующим возобновлением. В этих уроках владелец сеанса снимается явной собственной командой остановки, не предположением о причине callback.
ПередЗакрытием имеет четыре аргумента. При ЗавершениеРаботы=Истина нельзя открывать окна или вызывать сервер: заполняется ТекстПредупреждения. Пользователь или ОС могут принудительно завершить приложение; отказ от обычного закрытия не гарантирует запрет этого. Всегда явно остановите свой микрофон/звук до выхода.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.