В современных версиях платформы «1С:Предприятие 8.3», работающих на движке WebKit, разработчики часто сталкиваются с проблемой: старые методы воспроизведения звука (например, через тег bgsound в Internet Explorer) больше не работают. Использование внешних компонент (COM-объектов) затруднено из-за «зоопарка» операционных систем, так как решение должно одинаково стабильно работать на Windows и Linux. Рассмотрим подробнее, как реализовать качественное звуковое оповещение (например, сирену для кладовщика при ошибке сканирования), используя стандартные средства платформы и возможности HTML5.
Разберем базовый механизм. Основная идея заключается в том, чтобы разместить на управляемой форме невидимый элемент ПолеHTMLДокумента и передать в него HTML-код, содержащий стандартный тег audio. Проанализируем важный нюанс: современные браузерные движки блокируют прямые ссылки 1С (вида e1c://) для мультимедийного контента. Поэтому звук необходимо предварительно сохранить во временный файл.
Рассмотрим пошагово программную реализацию этой задачи. Предположим, что файл со звуком сирены хранится в макете конфигурации как Двоичные данные.
&НаКлиенте
Процедура ВоспроизвестиЗвуковойСигнал()
// 1. Получаем двоичные данные из макета (через серверный вызов)
ДвоичныеДанныеЗвука = ПолучитьЗвукИзМакетаСервер();
// 2. Формируем путь к временному файлу
ПутьКФайлу = ПолучитьИмяВременногоФайла("mp3");
ДвоичныеДанныеЗвука.Записать(ПутьКФайлу);
// 3. Формируем HTML-текст с тегом audio
// Добавляем случайный параметр в путь к файлу, чтобы избежать кэширования движком
ИдентификаторОбновления = СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
ТекстHTML =
"<!DOCTYPE html>
|<html>
|<head><meta charset='UTF-8'></head>
|<body>
|<audio id='player' autoplay>
| <source src='file:///" + ПутьКФайлу + "?v=" + ИдентификаторОбновления + "' type='audio/mpeg'>
|</audio>
|</body>
|</html>";
// 4. Присваиваем текст реквизиту, связанному с Полем HTML документа
ПолеHTML_Звук = ТекстHTML;
// Рекомендуется добавить путь к файлу в список для последующего удаления
ДобавитьФайлВСписокОчистки(ПутьКФайлу);
КонецПроцедуры
Иногда простого изменения текста HTML недостаточно, так как политики безопасности WebKit могут блокировать autoplay (автовоспроизведение) без прямого взаимодействия пользователя с формой. Выясним причину: это сделано для защиты пользователей от нежелательного шума. Чтобы гарантированно «продавить» звук из кода 1С, мы можем вызвать метод play() объекта мультимедиа через объектную модель документа.
Рассмотрим, как модифицировать код для управления плеером:
// В HTML-коде добавим функцию запуска
// <script> function playSound() { document.getElementById('player').play(); } </script>
&НаКлиенте
Процедура ЗапуститьЗвукПринудительно()
// Обращаемся к документу внутри Поля HTML
ДокументHTML = Элементы.ПолеHTML_Звук.Документ;
Если ДокументHTML <> Неопределено Тогда
// Вызываем JS-функцию play() напрямую
ДокументHTML.getElementById("player").play();
КонецЕсли;
КонецПроцедуры
Посмотрим на ситуацию с точки зрения оптимизации дискового пространства. Чтобы не плодить временные файлы и не заниматься их очисткой, мы можем внедрить звук прямо в тело HTML в виде строки Base64 (Data URI). Это идеальный способ для коротких звуковых сигналов (до 100-200 Кб).
Разберем пример реализации:
&НаКлиенте
Процедура ВоспроизвестиBase64()
ДвоичныеДанные = ПолучитьЗвукИзМакетаСервер();
СтрокаBase64 = Base64Строка(ДвоичныеДанные);
// Удаляем переносы строк, которые может добавить 1С
СтрокаBase64 = СтрЗаменить(СтрокаBase64, Символы.ПС, "");
СтрокаBase64 = СтрЗаменить(СтрокаBase64, Символы.ВК, "");
ТекстHTML = "
|<html>
|<body>
|<audio autoplay src='data:audio/mpeg;base64," + СтрокаBase64 + "'></audio>
|</body>
|</html>";
ПолеHTML_Звук = ТекстHTML;
КонецПроцедуры
Проанализируем ситуацию, когда ПолеHTMLДокумента по каким-то причинам недоступно или не подходит. Мы можем использовать штатные средства операционной системы. Это решение особенно эффективно для терминалов сбора данных (ТСД) на базе Linux или macOS.
Выясним, как написать универсальную процедуру запуска внешнего плеера:
&НаКлиенте
Процедура СистемныйЗвук(ПутьКФайлу)
Инфо = Новый СистемнаяИнформация;
Если Инфо.ТипПлатформы = ТипПлатформы.Windows_x86 Или Инфо.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда
// Используем PowerShell (есть во всех современных Windows)
Команда = "powershell -c ""(New-Object Media.SoundPlayer '" + ПутьКФайлу + "').PlaySync()""";
ЗапуститьПриложение(Команда, , Ложь);
ИначеЕсли Инфо.ТипПлатформы = ТипПлатформы.Linux_x86 Или Инфо.ТипПлатформы = ТипПлатформы.Linux_x86_64 Тогда
// Используем aplay (стандарт для Linux ALSA)
ЗапуститьПриложение("aplay " + ПутьКФайлу, , Ложь);
КонецЕсли;
КонецПроцедуры
Разберем еще одну интересную возможность WebKit — Web Speech API. Если кладовщику нужно не просто «пищать», а сообщать конкретную проблему (например, «Товар просрочен!»), мы можем использовать синтез речи. Для этого вообще не нужны аудиофайлы.
Пример кода внутри ПолеHTMLДокумента:
<script>
function speak(text) {
var msg = new SpeechSynthesisUtterance();
msg.text = text;
msg.lang = 'ru-RU';
window.speechSynthesis.speak(msg);
}
</script>
В коде 1С достаточно будет вызвать: Элементы.ПолеHTML_Звук.Документ.defaultView.speak("Ошибка сборки заказа");. Это решение максимально современное и не требует хранения звуковых ресурсов в конфигурации.
Подводя итог, выделим несколько ключевых моментов для стабильной работы:
Таким образом, использование Поля HTML документа в связке с Base64 или временными файлами является наиболее универсальным способом воспроизведения звуков в «1С:Предприятии 8.3» без привлечения сторонних инструментов.