Как воспроизвести звуковой сигнал в тонком клиенте 1С с помощью HTML?

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

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

Однако на практике разработчики часто сталкиваются с ситуацией, когда код написан без синтаксических ошибок, но звук не проигрывается. Разберем по шагам, почему возникает эта проблема, как правильно настроить HTML-плеер и какие существуют альтернативные способы воспроизведения аудиосигналов.

Анализ причин отсутствия звука при использовании поля HTML

Выясним основные причины, из-за которых встроенный браузер платформы может блокировать воспроизведение аудио:

  1. Невидимость элемента формы. Если реквизит формы выведен в элемент с типом Поле HTML-документа, но у элемента установлено свойство Видимость = Ложь (или элемент свернут до нулевых размеров), встроенный браузерный движок оптимизирует ресурсы и полностью приостанавливает выполнение медиа-контента. Элемент обязательно должен иметь Видимость = Истина.
  2. Несоответствие формата файла и MIME-типа. Если в макете сохранен файл формата WAV, а в теге <source> указан тип audio/mpeg (или наоборот), плеер не сможет декодировать поток. Для файлов MP3 следует использовать audio/mpeg, а для WAV — audio/wav.
  3. Переносы строк в Base64-строке. Стандартный метод Base64Строка() разбивает результат на строки символами перевода строки через каждые 72 символа. Разрывы внутри Data URI (data:audio/mp3;base64,...) часто приводят к тому, что браузер считает ссылку поврежденной. Рекомендуется использовать функцию ПолучитьBase64СтрокуИзДвоичныхДанных(), которая формирует непрерывный поток данных.
  4. Политика автовоспроизведения (Autoplay Policy). Современные браузерные движки блокируют автозапуск звука без предварительного действия пользователя на странице. Перезапись всего HTML-документа при каждом сигнале сбрасывает контекст страницы и приводит к задержкам.

Рабочий пример: воспроизведение звука через поле HTML

Рассмотрим правильную реализацию механизма на управляемой форме. Добавим реквизит формы АудиоПлеерHTML с типом Строка и свяжем его с элементом формы Поле HTML-документа. Зададим элементу минимальные размеры (например, высоту 1), но оставим свойство Видимость = Истина.

Разберем код модуля управляемой формы:


&НаСервере
Функция ПолучитьЗвуковыеДанныеВBase64()
    Результат = Новый Структура;
    
    // Получаем двоичные данные из общих макетов
    ДД_Успех = ПолучитьОбщийМакет("ЗвукУспеха");
    ДД_Ошибка = ПолучитьОбщийМакет("ЗвукОшибки");
    
    // Формируем непрерывные строки Base64 без переводов строк
    Результат.Вставить("Успех", ПолучитьBase64СтрокуИзДвоичныхДанных(ДД_Успех));
    Результат.Вставить("Ошибка", ПолучитьBase64СтрокуИзДвоичныхДанных(ДД_Ошибка));
    
    Возврат Результат;
КонецФункции

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ЗвуковыеСемплы = ПолучитьЗвуковыеДанныеВBase64();
    ЗвукУспехаBase64 = ЗвуковыеСемплы.Успех;
    ЗвукОшибкиBase64 = ЗвуковыеСемплы.Ошибка;
КонецПроцедуры

&НаКлиенте
Процедура ВоспроизвестиЗвуковойСигнал(ТипСигнала = "Успех")
    СтрокаBase64 = ?(ТипСигнала = "Успех", ЗвукУспехаBase64, ЗвукОшибкиBase64);
    МеткаВремени = Формат(ТекущаяУниверсальнаяДатаВМиллисекундах(), "ЧГ=0");
    
    // Генерируем разметку с уникальным комментарием для принудительного обновления
    АудиоПлеерHTML = 
        "<!DOCTYPE html>
        |<html>
        |<head><meta charset='utf-8'></head>
        |<body style='margin:0; padding:0; background:transparent;'>
        |   <!-- " + МеткаВремени + " -->
        |   <audio autoplay='autoplay'>
        |       <source src='data:audio/mpeg;base64," + СтрокаBase64 + "' type='audio/mpeg'>
        |   </audio>
        |</body>
        |</html>";
КонецПроцедуры

Альтернатива 1: Использование COM-объекта Windows Media Player

Если задача выполняется исключительно на клиентах под управлением ОС Windows, и требуется расширенное управление звуком (например, регулировка стереобаланса по каналам для двух независимых рабочих мест), рассмотрим использование штатного компонента WMPlayer.OCX:


&НаКлиенте
Процедура ВоспроизвестиЧерезWMPlayer(ПутьКФайлу, Канал = "Центр")
    Попытка
        Плеер = Новый COMОбъект("WMPlayer.OCX");
        
        // Настройка баланса: -100 (только левый канал), 100 (только правый канал), 0 (стереоцентр)
        Если Канал = "Левый" Тогда
            Плеер.settings.balance = -100;
        ИначеЕсли Канал = "Правый" Тогда
            Плеер.settings.balance = 100;
        Иначе
            Плеер.settings.balance = 0;
        КонецЕсли;
        
        Плеер.URL = ПутьКФайлу;
        Плеер.controls.play();
    Исключение
        Сообщить("Не удалось инициализировать медиаплеер: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

Альтернатива 2: Воспроизведение через консольный плеер

В случаях, когда использование встроенного браузера нежелательно из-за потребления памяти, а COM-объекты заблокированы политиками безопасности, можно применить метод ЗапуститьПриложение(). Для этого используется внешняя легковесная консольная утилита или плеер с поддержкой фонового запуска.

Посмотрим на пример запуска через плеер командной строки:


&НаКлиенте
Процедура ЗапуститьВнешнийПлеер(ПутьКФайлуЗвука)
    ПутьКПлееру = """C:\Program Files\MPC-HC\mpc-hc64.exe""";
    ПутьКФайлу  = """" + ПутьКФайлуЗвука + """";
    
    // Ключи запуска:
    // /minimized - запуск в минимизированном окне
    // /nofocus - не перехватывать фокус ввода у 1С
    // /play - начать воспроизведение
    // /close - закрыть процесс после завершения звука
    СтрокаКоманды = ПутьКПлееру + " " + ПутьКФайлу + " /minimized /play /close /nofocus";
    
    ЗапуститьПриложение(СтрокаКоманды);
КонецПроцедуры

Особенности мобильных клиентов

Если конфигурация разрабатывается под мобильный клиент или мобильное приложение (например, для ТСД под управлением Android), обращаться к HTML-полю или внешним утилитам не требуется. В платформе предусмотрен штатный объект СредстваМультимедиа:


// Воспроизведение заранее подготовленного аудиофайла
СредстваМультимедиа.ВоспроизвестиАудио(ПутьКАудиофайлу);

// Синтез голосового оповещения
СредстваМультимедиа.ВоспроизвестиТекст("Товар успешно добавлен");

Сравнение методов воспроизведения звука

Проанализируем плюсы и минусы рассмотренных подходов:

  1. Поле HTML-документа: не требует установки дополнительного ПО на рабочие станции, файлы звуков хранятся внутри базы (в макетах). Главные требования — обязательная видимость элемента формы и правильное совпадение MIME-типа с форматом аудио.
  2. COM-объекты (WMPlayer): обеспечивают тонкий контроль над воспроизведением (панорамирование, громкость), но работают только в среде Windows и требуют локального файла на диске.
  3. Запуск внешних приложений: высокая надежность для нестандартных форматов, но требует предварительной установки утилиты на каждое рабочее место и контроля прав доступа.
  4. СредстваМультимедиа: наилучший и нативный выбор, но поддерживается исключительно на мобильной платформе 1С.
← На главную