С выходом новых версий платформы «1С:Предприятие» (начиная с 8.3.15) разработчики осуществили переход с устаревшего движка Internet Explorer на современный WebKit. Это принесло массу преимуществ в скорости отрисовки и поддержке современных стандартов, однако сломало многие привычные механизмы, включая воспроизведение звуковых оповещений. Рассмотрим подробнее, почему это произошло и как адаптировать ваш код под новые реалии.
Проанализируем ситуацию: раньше для воспроизведения звука часто использовался тег BGSOUND, который был специфичным для Internet Explorer. В WebKit (на котором основаны Chrome и Safari) этого тега просто не существует. Более того, современные браузеры придерживаются строгой политики Autoplay Policy.
Выясним причину ограничений: WebKit блокирует автоматическое воспроизведение звука до тех пор, пока пользователь не совершит какое-либо взаимодействие со страницей (клик, нажатие клавиши). Это сделано для того, чтобы сайты не оглушали пользователей рекламой при загрузке. В контексте 1С это означает, что простое присваивание строки HTML-полю с тегом audio и атрибутом autoplay может не сработать.
Это наиболее эффективный метод, который позволяет «обмануть» систему и инициировать проигрывание. Разберем по шагам, как это реализовать.
Во-первых, нам необходимо подготовить саму 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.
Проанализируем технические детали работы с файлами. WebKit в составе 1С чувствителен к путям. Рассмотрим пример, где мы извлекаем мелодию из макета, сохраняем её во временный файл и передаем путь в HTML.
Посмотрим на пример подготовки данных:
&НаКлиенте
Процедура ПодготовитьИВоспроизвести()
// Получаем данные из макета обработки
ДанныеЗвука = ПолучитьДанныеЗвукаНаСервере();
// Создаем временный файл с расширением .wav или .mp3
ИмяФайла = ПолучитьИмяВременногоФайла("wav");
ДанныеЗвука.Записать(ИмяФайла);
// Формируем путь для WebKit (необходимо заменить обратные слэши)
ПутьДляHTML = "file:///" + СтрЗаменить(ИмяФайла, "\", "/");
// Обновляем SRC у тега audio в нашем поле HTML
ТекстСкрипта = "document.getElementById('audio_player').src = '" + ПутьДляHTML + "';
|document.playAudio();";
// Для новых платформ рекомендуется использовать этот метод:
Элементы.ПолеHTMLПроигрыватель.УстановитьТекстВыполняемогоСкрипта(ТекстСкрипта);
КонецПроцедуры
Обратите внимание на использование метода УстановитьТекстВыполняемогоСкрипта(). В современных версиях платформы 1С это более стабильный способ взаимодействия с WebKit, чем прямое обращение к Документ.playAudio().
Рассмотрим ситуацию, когда работа с файловой системой нежелательна (например, из-за прав доступа или при работе в веб-клиенте). В этом случае мы можем закодировать аудиофайл в строку Base64 и вставить его прямо в HTML-код.
Проанализируем, как это реализовать:
Base64Строка().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 прочитать локальный файл по прямой ссылке.
При разработке системы оповещений стоит учитывать следующие моменты:
loop в тег audio.volume (значение от 0.0 до 1.0) вашего аудио-объекта в JavaScript.controls в тег audio и убедитесь, что само «Поле HTML документа» имеет минимальный размер или скрыто (хотя некоторые версии WebKit могут приостанавливать скрипты в невидимых полях, поэтому лучше сделать поле размером 1x1 пиксель).Подводя итог, можно сказать: переход на WebKit потребовал от программистов 1С более глубокого понимания работы браузерных технологий и JavaScript. Однако использование объектной модели DOM и корректная обработка политик безопасности позволяют реализовать надежное звуковое оповещение, которое будет работать бесперебойно во всех современных версиях платформы.