Имя: Пароль:
1C
 
Воспроизведение звука HTML
☑
0 Shalun
 
naïve
01.10.26
✎
19:19
Всем привет! Второй день долблюлюсь с воспроизведением звука, но сцука молчит как партизан. Сразу скажу, опыта со звуком нет, по сему сильно не пеняйте.
Что сделал: В управляемую форму добавил реквизит АудиоПлеерHTML с типом Строка и элемент формы ПолеHTMLДокумента, связанный с этим реквизитом.
Создал макет двоичные данные, и загрузил в него звук.
Далее код:

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    ЗвуковыеСемплы = ПолучитьЗвукиВФорматеBase64();
    ЗвукУспехаBase64 = ЗвуковыеСемплы.Успех;
    ЗвукОшибкиBase64 = ЗвуковыеСемплы.Ошибка;
    АудиоПлеерHTML =
        "<!DOCTYPE html>
        |<html>
        |<head>
        |    <meta charset='utf-8'>
        |    <script>
        |        function playSound(base64Data, mimeType) {
        |            try {
        |                var audio = new Audio('data:' + mimeType + ';base64,' + base64Data);
        |                audio.play();
        |            } catch(e) {
        |                console.error('Audio playback error:', e);
        |            }
        |        }
        |    </script>
        |</head>
        |<body style='margin:0; padding:0; background:transparent;'></body>
        |</html>";
        
КонецПроцедуры

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

В общем, ошибки никакой не всплывает, но звука нет. Подскажите, что тут не так? Скажу сразу, скрипт взят с интернета, сам не пишу, по этому не спрашивайте что там зачем. Лучше подскажите что нужно делать? Заранее благодарю за конструктивные ответы!
1 Волшебник
 
01.10.26
✎
19:30
если это мобильный клиент (ТСД, например), то используйте:
 СредстваМультимедиа.ВоспроизвестиАудио(...)

или даже
СредстваМультимедиа.ВоспроизвестиТекст("Марка ОК")
2 sikuda
 
01.10.26
✎
19:38
(0) Статью десять лет назад написал, добрые люди уже добавил беслатную обработочку для старждущих и тонкости описали, но нет лень матушка у Вас?
https://infostart.ru/1c/tools/1259789/
3 Fragster
 
гуру
01.10.26
✎
21:02
с видео была тема, что autoplay в браузере срабатывал только "после первого интерактивного действия со страницей", может с аудио примерно то же самое
4 Shalun
 
naïve
02.10.26
✎
11:35
Парни, спасибо за подсказки! Уточню, работа на тонком клиенте. С HTML не разобрался, нашел другой рабочий метод:

spVoice = Новый COMОбъект("SAPI.SpVoice");
spfStream = Новый COMОбъект("SAPI.SpFileStream");
spfStream.Open(АдресФайла);
spVoice.SpeakStream(spfStream);
spfStream.Close();

Вроде работает, но воспроизводит стерео файл в моно режиме. Кто подскажет, как  воспроизвести стерео?
5 Волшебник
 
02.10.26
✎
11:48
(4) Это прямо критично важно для учёта?
6 Web00001
 
02.10.26
✎
18:10
(5)Кладовщик берет расходник и идет на склад собирать товар. Что то там собрал выставил на плафторму.  Перед тем как упаковать и перевести расходник в статус "собрано" он пикает каждую позицию. Бегать к монитору, смотреть как изменилась циферка в табличке после каждого сканирования вообще не вариант. Зато если звук орет ошибкой и моргает красным сразу все понятно. Или просто инвентаризация, чел ходит со сканером по складу и проверяет все этикетки. Если отсканировалось то, чего быть не должно, или отсканировалось не верно, звук соориентирует. Да для учета бывает нужно.
7 Shalun
 
naïve
02.10.26
✎
19:23
(5) Да, критично. У меня система обрабатывает 2 рабочих места, по этому для одного РМ левый канал, для другого РМ - правый.
8 Волшебник
 
02.10.26
✎
19:25
(6) Я про стерео спрашивал.
(7) Понял, что критично
9 Сергиус
 
02.10.26
✎
22:17
(0)https://disk.yandex.ru/d/ohFNsgrltjDKCQ

Проверено на платформе 8.5.1.1343, mp3 проигрывает.
10 Сергиус
 
02.10.26
✎
22:18
+(9)Код на основе вашего, только элемент Поле HTML на форме обязательно должен иметь Видимость = Истина, иначе не работает.
11 Shalun
 
naïve
03.10.26
✎
13:43
(9) Огромное тебе спасибо братан! Вот когда рабочий механизм покопаешь, сразу все понятно становится. Я так понял у меня не работало, из-за того что я wav файлы пытался воспроизвести. А так, с mp3 все работает, и стерео эффект есть. Еще раз СПАСИБО!!!
12 Garykom
 
гуру
04.10.26
✎
16:03
(0) Объясни зачем ты простейшую задачу пытаешься решать через жопу?
Зачем тут встроенный браузер в ПолеHTML?

Когда задачка банально (и универсально для такого класса задач выходящих за встроенные возможности платформы 1С) решается обычным ЗапуститьПриложение() или КомандаСистемы()...

Встроенный браузер нужен для отображения сложных интерфейсов.
Или подобных задач а не чтобы вывести звук.

Так сложно сделать приложение командной строки на чем угодно (на любом ЯП)?
Которое будет выводить нужный звук?
Причем можно аудиофайл как параметр указывать и запускать его из 1С!
13 Garykom
 
гуру
04.10.26
✎
16:04
(12)+ Случаи веб-клиента 1С не рассматриваем
Но и там можно либо через 1Сное расширение для браузера или другими способами, более сложными но и более универсальными
Ради одного звука тащить на форму встроенный браузер причем с отображением его на форме
Ибо скрытый не будет всегда работать
14 Garykom
 
гуру
04.10.26
✎
16:14
Еще более правильно принято подобные задачи решать через поднятие внешнего http-сервиса (сервера по сути)
Который решает требуемую задачу в требуемом месте

А из 1С использовать HTTPСоединение (клиента по сути) для вызова этого внешнего сервиса, передачи ему команд/параметров и получения результата
15 sikuda
 
04.10.26
✎
21:43
(14) Извините, но незадумывались ли Вы почему решение через html стало таким популярным?
Наверное потому, что встроенных средств в платформе нет и не предвидется!
А 1С нам давно твердит, что решения должны быть кросплатформенными! И что Вы предлагаете?
- ЗапуститьПриложение() на разных платформах?
- Использовать внешний сервис локально на компьютере?
Мне кажется именно подобные решения идут не прямым путем, а заходят сзади?🤦
16 Shalun
 
naïve
04.10.26
✎
21:53
(12) Пробовал. Возможно не правильно что то делал, но
1.Слишком большие задержки воспроизведения звука.
2.Всплывающие окна.
17 Garykom
 
гуру
04.10.26
✎
23:51
&НаКлиенте
Процедура ЗапуститьПлеер(ПутьКФайлуЗвука)
	// Путь к исполняемому файлу MPC-HC и видеофайлу
	ПутьКПлееру = """C:\Program Files (x86)\K-Lite Codec Pack\MPC-HC64\mpc-hc64.exe""";
	ПутьКФайлу  = """" + ПутьКФайлуЗвука + """";
	
	// Формируем строку команды с ключами MPC-HC:
	// /minimized - Запустить в минимизированном режиме
	// /nofocus - Открыть MPC-HC в фоне
	// /play - Начать воспроизведение файла сразу после запуска плеера
	// /close - Закрыть плеер после окончания воспроизведения (работает только в совокупности с /play)
	СтрокаКоманды = ПутьКПлееру + " " + ПутьКФайлу + " /minimized /play /close /nofocus";
	
	ЗапуститьПриложение(СтрокаКоманды);
КонецПроцедуры

&НаКлиенте
Процедура ВывестиЗвук(Команда)
	ПутьКФайлуЗвука = "D:\Работа\Базы 1С\Примеры звуков\buzzer_electric_02.mp3";
	ЗапуститьПлеер(ПутьКФайлуЗвука);
КонецПроцедуры

Никаких задержек нет.
Запускается в свернутом виде на фоне.
Чего еще надо?
18 Garykom
 
гуру
04.10.26
✎
23:36
(15)
- ЗапуститьПриложение() на разных платформах?

Да это самое универсальное
Определяем какая платформа и запускаем правильно по нужному пути
Либо сохраняем в Темп из макета нужный бинарник и запускаем...

- Использовать внешний сервис локально на компьютере?

Это лучше чем полагаться на COM/OLE или встроенный браузер
Который со временем может тупо перестать работать
Например переход с IE на WebKit хорошо помнят многие
19 sikuda
 
05.10.26
✎
09:31
(18) Да, запуск произвольного кода (Arbitrary Code Execution, ACE) — это одна из самых опасных и критических уязвимостей в безопасности информационных систем!
И даже для открытия в 1С html поля  в расширениях платформа каждый раз просит подтверждения...
Когда я 10 лет назад опубликовал запуск произвольного кода на клиенте через html поле мне вкатили бан на год. Когда Вы предлагаете впрямую использовать выполнение произвольного кода на клиенте это политика партии?
Пункт 4... Запрещена публикация алгоритмов взлома и ссылок на такие алгоритмы...
Вот почему Ваш метод по умолчанию плох!  

С другой стороны соглашусь, когда надо включать обучающие видео с настройками для пользователя другого метода и не найдешь. И тут точно костыль от которого не убежишь!
20 Garykom
 
гуру
05.10.26
✎
11:40
(19) >Пункт 4... Запрещена публикация алгоритмов взлома и ссылок на такие алгоритмы...
Издеваешься?
В типовой ДО есть вызов ImageMagick через ЗапуститьПриложение() например и т.д.
21 sikuda
 
05.10.26
✎
12:20
(20) ПроверитьФайлыПрограммойCheckUFA
ЗапуститьПриложение(КаталогПрограммы + "\Check.exe "+ """" + ПроверяемыйФайл + """", , Истина);

Так это не от хорошей жизни и констыли!
Кстати Image Magic в платформу засунули. О программе - Лицензии используемых компонентов - поиск © 1999-2017 ImageMagick Studio LLC но это не помогло🤦
22 Garykom
 
гуру
05.10.26
✎
12:22
(21) Ты предлагаешь внутри встроенного браузера на JS в песочнице запускать эмулятор Windows или Linux (DOS и старые Windows 95 уже можно да)
И там внутри выполнять ImageMagick и прочее ?

Зато безопасно...
23 sikuda
 
05.10.26
✎
13:29
(22) "Кто на ком стоял?" - Преображенский
Движок браузера работает на конкретной OC пытаясь сделать себе безопасную песочницу.
Движок браузера имея задокументированые функцию .play() вызывает через нее функции конкретной OC воспроизведения звука.
То что мы не знаем как OC воспроизводится звук
https://learn.microsoft.com/ru-ru/windows/win32/multimedia/the-playsound-function
- PlaySound
- API сеанса аудио Windows (WASAPI)
- Звуковые графы(Во хрень только что узнал)
Добавляет к нашей универсальности положительные баллы!
24 Shalun
 
naïve
05.10.26
✎
19:41
(17) Спасибо. У меня К-Lit не установлен, по этому я сделал так:
ПутьКПлееру = """C:\Program Files (x86)\Windows Media Player\wmplayer.exe""";
Запускается плеер, воспроизводит звук, плеер не закрывается.
Я так понимаю тут нужно что-то подправить?
СтрокаКоманды = ПутьКПлееру + " " + ПутьКФайлу + " /minimized /play /close /nofocus";
25 Garykom
 
гуру
05.10.26
✎
21:21
(24) эмм у тебя другой плеер
wmplayer.exe а не mpc-hc64.exe
я хз какие там ключи запуска есть

ЗЫ
https://share.google/aimode/0WHrU4LyuiGQDW4P2
надо юзать PS или другой плеер ставить
лично я бы поставил компактный портабле плеер
например https://github.com/clsid2/mpc-hc/releases/tag/2.8.2
или записал его в макет бинарный (можно как zip архив)
из макета его записывал в темп, оттуда запускал
и затем удалял
26 Garykom
 
гуру
05.10.26
✎
21:23
имхо чисто для проигрывания звуков можно компактнее плеер для командной строки поискать
но mpc-hc64.exe это универсальный комбайн
можно и видео не только аудио
27 Shalun
 
naïve
06.10.26
✎
19:45
(25) Спасибо за ссылочки. Но ты считаешь это проще, нежели написать HTML код? К тому же: "из макета его записывал в темп, оттуда запускал и затем удалял" - это все дополнительные ресурсы.
28 ptiz
 
06.10.26
✎
19:53
8ка ещё сырая - больше 20 лет платформе, а звук воспроизвести - это танцы с бубном:)
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший