Как воспроизвести звук в мобильном клиенте 1С:Предприятие

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

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

В этой статье мы подробно разберем, как реализовать воспроизведение звука, рассмотрим работу с системными ресурсами и научимся проигрывать собственные аудиофайлы, встроенные в конфигурацию.

Использование стандартных звуковых оповещений

Самый простой способ подать звуковой сигнал — использовать метод СредстваМультимедиа.ВоспроизвестиЗвуковоеОповещение(). Этот метод предназначен для проигрывания коротких системных звуков, которые предопределены в платформе.

Разберем пример кода:


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

Здесь используются следующие параметры:

  1. Тип оповещения: системное перечисление ЗвуковоеОповещение, которое может принимать значения Внимание, Информация, Ошибка или ПоУмолчанию.
  2. Игнорировать беззвучный режим: булево значение. Если установлено Истина, звук будет воспроизведен, даже если на устройстве включен режим «Без звука» (в зависимости от прав приложения и настроек ОС).

Важное ограничение: стандартный набор звуков крайне ограничен. Если вам нужен специфический звук, например, «щелчок» (click) или мелодия, стандартных средств будет недостаточно.

Воспроизведение системных звуков Android

Для воспроизведения конкретных системных файлов, таких как звук клавиш или уведомлений, можно обратиться напрямую к файловой системе устройства. В операционной системе Android системные звуки обычно располагаются по пути /system/media/audio/ui/.

Рассмотрим рабочее решение, которое позволяет воспроизвести стандартный «тик» (щелчок) Android:


#Если МобильныйКлиент Тогда
    Попытка
        // Указываем прямой путь к системному файлу Android
        ДД = Новый ДвоичныеДанные("/system/media/audio/ui/Effect_Tick.ogg");
        СредстваМультимедиа.ВоспроизвестиАудио(ДД, 0, Неопределено, Истина);
    Исключение
        // Обработка ситуации, если файл не найден или доступ запрещен
        ЗаписьЖурналаРегистрации("Ошибка воспроизведения звука", УровеньЖурналаРегистрации.Предупреждение,,, ПодробноеОписаниеОшибки(ИнформацияОбОшибке()));
    КонецПопытки;
#КонецЕсли

В данном примере мы используем объект ДвоичныеДанные для получения доступа к файлу и метод СредстваМультимедиа.ВоспроизвестиАудио(). Проанализируем параметры этого метода:

Внимание: этот метод нестабилен для тиражных решений, так как производители смартфонов (Samsung, Xiaomi, Huawei) могут изменять структуру папок или названия файлов (например, вместо Effect_Tick.ogg может быть KeypressStandard.ogg).

Универсальный способ: воспроизведение собственного аудиофайла

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

Шаг 1. Добавление файла в конфигурацию

Добавим аудиофайл (например, click.mp3) в Общие макеты с типом Двоичные данные. Назовем его ЗвукЩелчка.

Шаг 2. Код для воспроизведения

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

Проанализируем следующий код:


&НаКлиенте
Процедура ВоспроизвестиСвойЗвук()
    
    #Если МобильныйКлиент Или МобильноеПриложениеКлиент Тогда
        
        // Получаем двоичные данные из общего макета (требуется серверный вызов)
        ДанныеЗвука = ПолучитьМакетЗвукаНаСервере();
        
        // Формируем путь во временном каталоге устройства
        ИмяФайла = КаталогВременныхФайлов() + "click_temp.mp3";
        
        // Записываем данные в файл
        ДанныеЗвука.Записать(ИмяФайла);
        
        // Воспроизводим
        СредстваМультимедиа.ВоспроизвестиАудио(ИмяФайла, 0, Неопределено, Ложь);
        
    #КонецЕсли
    
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьМакетЗвукаНаСервере()
    Возврат БиблиотекаМакетов.ПолучитьМакет("ЗвукЩелчка");
КонецФункции

Важный нюанс: при частом воспроизведении (например, при каждом клике) не стоит каждый раз обращаться к серверу и записывать файл на диск. Рекомендуется один раз при старте сессии сохранить файл в локальную папку мобильного устройства и хранить путь к нему в глобальной переменной или параметре клиента.

Технические нюансы и форматы файлов

При выборе аудиоформата следует учитывать кроссплатформенность:

Выясним причину возможных задержек: в мобильном клиенте (в отличие от мобильного приложения) код часто исполняется на стороне сервера. Если вы вызываете ВоспроизвестиАудио в процедуре, которая выполняется на сервере, звук сработает только после того, как пакет данных вернется на мобильное устройство. Для мгновенной реакции (например, звук при нажатии кнопки) код воспроизведения должен находиться строго в &НаКлиенте процедуре и, по возможности, не содержать серверных вызовов в момент проигрывания.

Альтернатива: Использование поля HTML-документа

Если штатные СредстваМультимедиа не обеспечивают нужной скорости или функциональности (например, нужно наложить один звук на другой), программисты прибегают к использованию скрытого поля HTML-документа. В него загружается пустая страница с JavaScript-функцией, которая проигрывает аудио через тег <audio>. Данные звука в этом случае передаются внутри HTML-кода в формате Base64. Этот метод позволяет добиться практически мгновенного отклика, так как аудио-движок браузера (WebView) в мобильном клиенте всегда инициализирован и готов к работе.

Подведем итог. Для реализации звука в мобильном клиенте 1С наиболее надежным и профессиональным подходом является хранение аудиофайлов в макетах двоичных данных с последующим сохранением в КаталогВременныхФайлов() и вызовом метода СредстваМультимедиа.ВоспроизвестиАудио() на стороне клиента.

← На главную