Как реализовать вывод звука в 1С:Предприятие при использовании движка WebKit?

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

С выходом новых версий платформы «1С:Предприятие» (начиная с 8.3.15) разработчики осуществили переход с устаревшего движка Internet Explorer на современный WebKit. Это принесло массу преимуществ в скорости отрисовки и поддержке современных стандартов, однако сломало многие привычные механизмы, включая воспроизведение звуковых оповещений. Рассмотрим подробнее, почему это произошло и как адаптировать ваш код под новые реалии.

Почему перестал работать стандартный механизм вывода звука?

Проанализируем ситуацию: раньше для воспроизведения звука часто использовался тег BGSOUND, который был специфичным для Internet Explorer. В WebKit (на котором основаны Chrome и Safari) этого тега просто не существует. Более того, современные браузеры придерживаются строгой политики Autoplay Policy.

Выясним причину ограничений: WebKit блокирует автоматическое воспроизведение звука до тех пор, пока пользователь не совершит какое-либо взаимодействие со страницей (клик, нажатие клавиши). Это сделано для того, чтобы сайты не оглушали пользователей рекламой при загрузке. В контексте 1С это означает, что простое присваивание строки HTML-полю с тегом audio и атрибутом autoplay может не сработать.

Способ 1. Программный вызов метода play через объектную модель HTML-документа

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

Во-первых, нам необходимо подготовить саму HTML-страницу, внутри которой будет находиться аудио-плеер и JavaScript-функция для его запуска. Важный нюанс: мы объявим функцию как свойство объекта document, чтобы 1С могла «дотянуться» до нее.


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Формируем текст HTML-документа
    ТекстHTML = 
    "<html>
    |<body>
    |   <audio id=""audio_player"" src=""##ПУТЬ_К_ФАЙЛУ##""></audio>
    |   <script>
    |       // Регистрируем функцию в объекте document для доступа извне
    |       document.playAudio = function() {
    |           var player = document.getElementById('audio_player');
    |           player.play();
    |       };
    |   </script>
    |</body>
    |</html>";
    
    // Помещаем текст в реквизит формы, связанный с Полем HTML документа
    ПолеHTMLПроигрыватель = ТекстHTML;
КонецПроцедуры

Во-вторых, когда нам нужно воспроизвести звук (например, при поступлении нового заказа), мы вызываем эту JavaScript-функцию из встроенного языка 1С. Рассмотрим, как это выглядит в коде:


&НаКлиенте
Процедура ВоспроизвестиСигнал()
    // Обращаемся к элементу формы «Поле HTML документа»
    ДокументHTML = Элементы.ПолеHTMLПроигрыватель.Документ;
    Если ДокументHTML <> Неопределено Тогда
        // Вызываем нашу функцию, которую мы привязали к документу
        ДокументHTML.playAudio();
    КонецЕсли;
КонецПроцедуры

Важно: этот метод сработает, если пользователь хотя бы один раз кликнул в интерфейсе формы после её открытия. Это «разблокирует» звуковой контекст для WebKit.

Способ 2. Использование временных файлов и корректных форматов

Проанализируем технические детали работы с файлами. WebKit в составе 1С чувствителен к путям. Рассмотрим пример, где мы извлекаем мелодию из макета, сохраняем её во временный файл и передаем путь в HTML.

Посмотрим на пример подготовки данных:


&НаКлиенте
Процедура ПодготовитьИВоспроизвести()
    // Получаем данные из макета обработки
    ДанныеЗвука = ПолучитьДанныеЗвукаНаСервере();
    
    // Создаем временный файл с расширением .wav или .mp3
    ИмяФайла = ПолучитьИмяВременногоФайла("wav");
    ДанныеЗвука.Записать(ИмяФайла);
    
    // Формируем путь для WebKit (необходимо заменить обратные слэши)
    ПутьДляHTML = "file:///" + СтрЗаменить(ИмяФайла, "\", "/");
    
    // Обновляем SRC у тега audio в нашем поле HTML
    ТекстСкрипта = "document.getElementById('audio_player').src = '" + ПутьДляHTML + "';
                   |document.playAudio();";
    
    // Для новых платформ рекомендуется использовать этот метод:
    Элементы.ПолеHTMLПроигрыватель.УстановитьТекстВыполняемогоСкрипта(ТекстСкрипта);
КонецПроцедуры

Обратите внимание на использование метода УстановитьТекстВыполняемогоСкрипта(). В современных версиях платформы 1С это более стабильный способ взаимодействия с WebKit, чем прямое обращение к Документ.playAudio().

Способ 3. Передача звука через Base64 (без временных файлов)

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

Проанализируем, как это реализовать:

  1. На сервере получаем двоичные данные звука.
  2. Преобразуем их в строку Base64 с помощью функции Base64Строка().
  3. Вставляем в тег source в формате data:audio/wav;base64, [Данные].

Пример формирования строки данных:


&НаСервере
Функция ПолучитьHTMLСЗвуком()
    Данные = Обработки.МояОбработка.ПолучитьМакет("ЗвукОповещения");
    СтрокаBase64 = Base64Строка(Данные);
    СтрокаBase64 = СтрЗаменить(СтрокаBase64, Символы.ПС, ""); // Убираем переносы
    
    Шаблон = 
    "<audio id='player'>
    |   <source src='data:audio/wav;base64,%1' type='audio/wav'>
    |</audio>";
    
    Возврат СтрШаблон(Шаблон, СтрокаBase64);
КонецФункции

Такой подход гарантирует, что звук будет доступен мгновенно, не требуя обращения к диску, и решит проблему «Loading...», которая часто возникает при попытке WebKit прочитать локальный файл по прямой ссылке.

Важные рекомендации при работе со звуком в WebKit

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

Подводя итог, можно сказать: переход на WebKit потребовал от программистов 1С более глубокого понимания работы браузерных технологий и JavaScript. Однако использование объектной модели DOM и корректная обработка политик безопасности позволяют реализовать надежное звуковое оповещение, которое будет работать бесперебойно во всех современных версиях платформы.

← На главную