Добрый день!
Был у меня работающий механизм по выводу звука на управляемых формах в конфигурации УТ11.4: на поле документа располагалось "Поле HTML документа" с типом строка в которое я передавал строку, при этом проигрывалась мелодия. Мелодию, а это был трехсекундный mp3, я хранил в макете обработки.
Все работало на платформе 8.3.13. Но разработчики платформы перешли с InternetExplorer на WebKit. Вот что они написали
При разработке прикладных решений следует учитывать, что элемент управления ПолеHTMLДокумента (в обычном режиме) и поле формы вида Поле HTML документа (в управляемом режиме) реализовано на основе библиотеки WebKit вместо Internet Explorer. В связи с этим следует учитывать, что внешний вид и объектная модель HTML-документа (DOM-модель), доступ к которому осуществляется с помощью свойства ПолеHTMLДокумента.Документ, могут отличаться от таковых при работе в клиентском приложении, работающего на ОС Windows.

Т.е. после перехода на платформу 8.3.15 у меня все перестало работать. Подскажите что и как нужно исправить, или скажите что можно почитать. В интернете на эту тему ничего нет. Предполагаю что спецу по JawaScript не составит труда поправить, но я такого не нашел.
Привожу код, который работал на платформе 8.3.13

```1c
    &НаСервере
    Функция ПолучитьАдресФайла()
    Возврат ПоместитьВоВременноеХранилище(Обработки.РМКСклада.ПолучитьМакет("Sound"));
    КонецФункции

    &НаКлиенте
    Процедура СпетьПесню()
    мФайл = ПолучитьАдресФайла();

    ПолеHTML = "
    | <HT ML>
    | <BODY scroll='no'>
    | <BGSOUND id='sound_think' balance=0 volume='-1000'></BGSOUND>
    | <div id=paperRaphael></div>
    | <sc ript>
    | function PlaySound() {
    | if (!window.HTMLAudioElement) {
    | document.all.sound_think.volume=0;
    | document.all.sound_think.src = '"+мФайл+"';
    | }
    | }
    | window.on load = function(){
    | PlaySound();
    | }
    | </sc ript>
    | </BODY>
    | </HTML>";
    ЭтаФорма.Проигрыватель = ПолеHTML;
    КонецПроцедуры
```
---
Эксперименты с WebKit закончены. Восстановить прежний функционал не получилось. С помощью участника форума laperuz удалось вывести звук с помощью Webkit, но для этого нужно было нажать мышкой в определенном месте. А в условиях задачи нужно было проигрывать музыку без участия пользователя.
Поэтому вернулся к одному из прежних решений которое проигрывает wav файлы. Причем можно передавать текст, и он будет произнесен голосом, смешным и не очень внятным.
Метод рабочий, но и у него есть минусы: пока играет музыка, 1С заблокирована. Победить не удалось. Время мелодии 4сек, поэтому оставил как есть.

```1c
    spVoice = Новый COMОбъект("SAPI.SpVoice");
    spfStream = Новый COMОбъект("SAPI.SpFileStream");

    spfStream.Open("c:\sound.wav");
    spVoice.SpeakStream(spfStream);

    spfStream.Close();
```

Всем помогавшим спасибо!!!
---
document.all.sound_think
вместо ол советуют использовать гетбайид
document.all vs. document.getElementById
https://stackoverflow.com/questions/2408424/document-all-vs-document-getelementbyid/21841490
---
Вот что еще я вспомнил: нет никакой разницы при использовании document.all или document.getElementById. На платформе 8.3.15 прикрыли IE, а тег BGSOUND это как раз детище IE, причем самое древнее.
---
BGSOUND
кстати очень может быть
http://htmlbook.ru/html/bgsound
значит надо пробовать другой вариант не через этот тег
---
значит надо пробовать другой вариант не через этот тег

Собственно для этого тему и создал :)
К решению вроде как подошли, но для начала звучания требуется дополнительное нажатие.
---
Во-первых, лучше использовать html5 тэг <audio>
Во-вторых, есть большая вероятность, что не получится реализовать по загрузке страницы, т.к. в хроме автопроигрывание сейчас отключено.

А так примерно так:

```1c
    мФайл = ПолучитьАдресФайла();
    файл = ПолучитьИзВременногоХранилища(мФайл);
    ВременныйФайл = ПолучитьИмяВременногоФайла("mp3");
    файл.Записать(ВременныйФайл);
    Проигрыватель = "<ht ml>
    |<head><title>Sound</title></head>
    |<BODY>
    |<audio controls> <source src='" + ВременныйФайл + "' type='audio/mp3'></audio>
    |</BODY>
    |</html>";
```

P.S. Да, на onLoad сейчас нельзя повесить, теперь хрому нужно, чтобы пользователь как-то взаимодействовал со страницей (клик мышкой, просто перемещение не считается) и только после этого разрешен вызов play().
---
Кстати, если в системе есть проигрыватель, можно сделать так:

```1c
    мФайл = ПолучитьАдресФайла();
    файл = ПолучитьИзВременногоХранилища(мФайл);
    ВременныйФайл = ПолучитьИмяВременногоФайла("mp3");
    файл.Записать(ВременныйФайл);
    ЗапуститьПриложение(ВременныйФайл);
```
---
Конечно же это заработало :) Открылся проигрыватель, поиграл мелодию, и остался висеть поверх всех окон.
Это не совсем то что хотелось бы.
---
Спасибо, но не получилось. В настройках хрома посмотрел: вывод звука разрешен. В настройках браузера "Воспроизводить звуки на веб-страницах" флаг тоже стоит.
(2)
Строки

```1c
    document.all.sound_think.volume=0;
    document.all.sound_think.src = '"+мФайл+"';
```

Заменил на

```1c
    document.getElementById.sound_think.volume=0;
    document.getElementById.sound_think.src = '"+мФайл+"';
```

Не заработало. Проверял и на платформе 8.3.15 и на 8.3.13 Причем на 8.3.13 хоть какие то ошибки пишет "Не удалось задать свойство volume ссылки, значение которой не определено или является NULL"

А когда сделал так, заработало, но только на платформе 8.3.13

```1c
    document.getElementById("sound_think").volume=0;
    document.getElementById("sound_think").src = '"+мФайл+"';
```

Но мне нужно чтобы заработало на 8.3.15. Может еще можно что то написать?
---
Какой у вас юзер-кейс?
Как я уже написал, на хроме сейчас не получится сделать при загрузке страницы
Но например вот так будет работать, если нажать в любое место HTML документа

```1c
    мФайл = ПолучитьАдресФайла();
    файл = ПолучитьИзВременногоХранилища(мФайл);
    ВременныйФайл = ПолучитьИмяВременногоФайла("mp3");
    файл.Записать(ВременныйФайл);
    Проигрыватель = "<ht ml>
    |<head><title>Sound</title></head>
    |<sc ript>function PlayAudio(){var x = document.getElementById('player'); x.play()}</sc ript>
    |<BODY on click = 'PlayAudio()'>
    |<audio id = 'player' controls> <source src='" + ВременныйФайл + "' type='audio/mp3'></audio>
    |</BODY>
    |</html>";
```
---
Этот код тоже заработал. Но как то неожиданно. Впервые я увидел текст, но это не беда, его можно сделать белым. И появилась черная полоса, которая оказалась менюшкой плеера. Звук играет только при нажатии на "Play"
Юзер-кейс, если я правильно понял это слово :) такой: кладовщики работают на складе, для них поступает срочный документ. Для привлечения внимания проигрывается мелодия. Они подходят к рабочему месту, видят эти документы(на экране они выделены цветом), печатают, идут их обрабатывать.
---
Текста не должно быть, вы где-то тег script не до конца отформатировали.
Поэтому скрипт не работает и поэтому только по кнопке play, а не по произвольному нажатию.
Но, да, в вашем случае в любом случае не вариант, это ограничение хрома(
Возможно все-таки стоит посмотреть в сторону запуска приложения локального, например найти плеер, который умеет запускаться в фоне, без открытия интерфейса.
---
Действительно, при размещении кода на инфостарте, теги "html" и "script" становятся "ht ml" и "sc ript".
Исправил, текст пропал, но для проигрывания все равно потребовалось нажимать именно "Play"

Что получается, если ограничение хрома это приговор окончательный, нужно прекращать эксперименты с WebKit.
Следующая по очереди идея реализации вывода звука, это использовать компоненту DynamicWrapper. Жаль, хотелось без нее сделать. Если и эта идея с dll не поможет, значит будем открывать внешний проигрыватель.
Спасибо!!!
---
А почему именно на хроме? Сейчас все браузеры используют движок хрома? Или это Webkit использует движок хрома?
---
Я пишу хром и подразумеваю WebKit, да) Это ограничение WebKit, конечно же
---
Хочу реализовать прослушивание записей телефонных звонков.
АТС Билайн, нехитрыми манипуляциями запихиваю данный код в поле html, но возникает проблема.
В веб-клиенте всё отлично и воспроизводится по кнопке Play (так и задумано), но в тонком клиенте на поле появляется объект аудио с надписью Loading, и ничего не происходит.
---
Эксперименты с WebKit закончены. Восстановить прежний функционал не получилось. С помощью участника форума laperuz удалось вывести звук с помощью Webkit, но для этого нужно было нажать мышкой в определенном месте. А в условиях задачи нужно было проигрывать музыку без участия пользователя.
Поэтому вернулся к одному из прежних решений которое проигрывает wav файлы. Причем можно передавать текст, и он будет произнесен голосом, смешным и не очень внятным.
Метод рабочий, но и у него есть минусы: пока играет музыка, 1С заблокирована. Победить не удалось. Время мелодии 4сек, поэтому оставил как есть.

```1c
    spVoice = Новый COMОбъект("SAPI.SpVoice");
    spfStream = Новый COMОбъект("SAPI.SpFileStream");

    spfStream.Open("c:\sound.wav");
    spVoice.SpeakStream(spfStream);

    spfStream.Close();
```

Всем помогавшим спасибо!!!
---
Если еще актуально, то есть один способ, согласно кейсу задачи - работает через поле html..

```1c
    &НаКлиенте
    Процедура ПриОткрытии(Отказ)

    ПолеHTML = "http://www.radiorecord.ru/player-mini/?st=rr";

    КонецПроцедуры
```

Плюсы:
Включается автоматически без каких либо нажатий
Пока играет музыка - 1С не заблокирована

Минусы:
Нужен интернет для проигрывания
---
```1c
    &НаСервере
    Функция ПолучитьАдресФайла()

    Возврат ПоместитьВоВременноеХранилище(Обработки.РМКСклада.ПолучитьМакет("Sound"));

    КонецФункции

    &НаКлиенте
    Процедура ВоспроизвестиMP3()

    мФайл = ПолучитьАдресФайла();

    Файл = ПолучитьИзВременногоХранилища(мФайл);
    АдресЗвука = ПолучитьИмяВременногоФайла("mp3");
    Файл.Записать(АдресЗвука);

    ПолеHTML = "
    | <HT ML>
    |<head><title>Sound</title></head>
    |<BODY>
    |<audio id='player' autoplay loop>
    |<source src='" + АдресЗвука + "' type='audio/wav'>
    |</audio>
    |</BODY>
    |</html>";

    КонецПроцедуры
```
---
Коллеги, привет всем. НАШЕЛ РЕШЕНИЕ!!! )))
Сам несколько дней голову ломал, а оказалось то не так сложно.

В скрипте объявляем функцию, как переменную документа

```1c
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Реквизит1 = "
    |<!do ctype html>
    |<ht ml>
    | <head>
    | <sc ript language='JavaScript' type='text/javascript'>
    |
    | document.play = function() {play()};
    |
    | function play() {
    | var audio = document.getElementById("audio");
    | audio.play();
    | }
    |
    | </sc ript>
    | </head>
    | <body>
    | <audio id="audio" src="" + Файл + ""></audio>
    | </body>
    |</html>";
    КонецПроцедуры
```

А потом можно ее вызывать в любой момент с помощью:
```1c
    Элементы.Реквизит1.Документ.play();
```

Единственное, вызывать можно только после инициализации на форме. То есть, если надо, что бы сразу при создании формы сигнал сработал, то надо вешать обработчик ожидания.

P.S. У меня заработало с WAV файлами (при чем именно с wav, нельзя просто mp3 переименовать в wav). MP3 почему-то не взлетело. Другие не пробовал.
---
У меня mp3 заработало. Единственное что работает через временные файлы. Интересно можно ли сделать через ПоместитьВоВременноеХранилище? Обработка приложена
---
Допустим еще актуально.
Чтобы аудио проигрывалось сразу нужно поставить тег autoplay

```1c
    <audio autoplay>
```