Воспроизведение звука средствами Windows

14.03.13

Разработка - Механизмы платформы 1С

Еще один способ воспроизводить звуки из 1С, средствами Windows без использования внешних программ.

Всем привет! Давно ничего не писал. Хочу поделиться найденным, на просторах интернета, способом воспроизведения звука. Но обо всем по порядку.

Я часто делаю воспроизведение звука в 1С, когда стоит вопрос о сканировании штрих-кодов, чтобы подтвердить факт добавления товара в документ, или сообщить об ошибке. Эта необходимость возникла при большом потоке товаров и работе в терминальном режиме со сканерами через эмуляцию клавиатуры. Дело в том, что из-за проблем с задержками, например WiFi, сканированный код может доходить с задержками до двух секунд, и драйвер некорректно распознает код. Если никак не сообщать об этом менеджеру, то в потоке товаров они не замечают, что товар не был добавлен в документ.

Собственно никогда проблем, с воспроизведением звуков, у меня не возникало. Я использовал встроенный в Windows плеер mplay32.exe и скрипты WScript. Однако в новых версиях Windows этого плеера нет, копирование его ни к чему хорошему не приводит, приходится полностью отключать защиту на уровне пользователей и другие сложности с ошибкой 0x80070002 при работе в терминале на Windows Server 2008 R2.
Были опробованы варианты с проигрыванием через ActiveX или в поле HTML документа. С ними проблема в том, что звук не воспроизводится, если форма с полем не видна. А мне надо звук воспроизводить фоном. Вставлять ActiveX на каждую форму работающую с штрих-кодом не вариант.

Наконец, решение было найдено, простое и 100% работающее. Проверено на Windows 7/2008R2:

oVoice = Новый COMObject("SAPI.SpVoice");

oSpFileStream = Новый COMObject("SAPI.SpFileStream");
oSpFileStream.Open(ПутьДоФайла);
oVoice.SpeakStream(oSpFileStream);
oSpFileStream.Close();

Для 1С 7-ки:

oVoice = СоздатьОбъект("SAPI.SpVoice");
oSpFileStream = СоздатьОбъект("SAPI.SpFileStream");
oSpFileStream.Open(ПутьДоФайла);
oVoice.SpeakStream(oSpFileStream);
oSpFileStream.Close();

Visual Basic (Excel, Word и т.п.)

Dim oVoice As Object
Dim oSpFileStream As Object
Set oVoice = CreateObject("SAPI.SpVoice")
Set oSpFileStream = CreateObject("SAPI.SpFileStream")
oSpFileStream.Open ПутьДоФайла
oVoice.SpeakStream oSpFileStream
oSpFileStream.Close

Проверял на WAV файлах, на счет mp3 сказать не могу, не тестировал.

Сам интерфейс используется для проговаривания строк, поэтому можно пользоваться и основной его функцией:

oVoice.Speak("Hello!");

Вступайте в нашу телеграмм-группу Инфостарт

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Механизмы платформы 1С Программист Бесплатно (free)

Разберем 15 мифов о работе платформы «1С:Предприятие 8» – как распространенных, так и малоизвестных. Начнем с классики: «Код, написанный в одну строку, работает быстрее, чем многострочный». Так ли это на самом деле?

16.07.2025    32032    TitanLuchs    108    

149

Механизмы платформы 1С Работа с интерфейсом Программист Стажер 1С:Предприятие 8 Бесплатно (free)

Про ООП в 1С и о том, как сделать свой код более кратким и выразительным при помощи использования текучего интерфейса (fluent interface).

03.02.2025    17524    bayselonarrend    127    

68

Механизмы платформы 1С Программист 1С:Предприятие 8 Бесплатно (free)

В этой статье подробно рассматривается работа с JSON в XDTO в 1С:Предприятие. Вы узнаете, как сериализовать и десериализовать объекты XDTO в JSON, интегрировать 1С с веб-сервисами и API, а также корректно обрабатывать данные при обмене. Разбираются особенности работы с коллекциями, использование функций восстановления и частые ошибки при работе с JSON и XDTO.

30.01.2025    21612    user2122906    9    

66

Механизмы платформы 1С Файловый обмен (TXT, XML, DBF), FTP Программист 1С:Предприятие 8 Бесплатно (free)

Этот материал познакомит вас с механизмом XDTO (XML Data Transfer Objects) в 1С и научит эффективно использовать его возможности. Мы разберёмся, как работать с XML-схемами, создавать модели данных, манипулировать объектами XDTO, а также сериализовать и десериализовать их в XML. Вы узнаете, как использовать XDTO для интеграции с внешними системами, избегать типичных ошибок и оптимизировать код. К концу вы будете уверенно применять XDTO для решения сложных задач обмена данными и автоматизации процессов.

17.01.2025    37888    user2122906    12    

62

Механизмы платформы 1С WEB-интеграция Программист 1С:Предприятие 8 Бесплатно (free)

В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.

14.01.2025    32784    dsdred    106    

148

Механизмы платформы 1С Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    28668    bayselonarrend    22    

177

Механизмы платформы 1С Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    15544    dsdred    22    

87
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. andrewks 1383 14.03.13 10:22 Сейчас в теме
уже есть публикация по SAPI.SpVoice, и, по-моему, даже не одна
2. zsrg 346 14.03.13 10:38 Сейчас в теме
1, Все верно. Но в этих публикациях ничего не сказано про воспроизведение WAV файлов, только про говорилку...
7. andrewks 1383 14.03.13 12:35 Сейчас в теме
(2) zsrg, ну дык есть же оф.описание объектной модели http://msdn.microsoft.com/en-us/library/ms722561%28v=vs.85%29.aspx
12. Milokko 14.03.13 14:22 Сейчас в теме
(2) zsrg, Шпарит WAV-ки как миленький
3. orefkov 1158 14.03.13 12:21 Сейчас в теме
Все таки "Новый COMObject" и "без ActiveX" - взаимоисключающие параграфы.
Я бы "без ActiveX" убрал из названия публикации.
А то такое чувство, что повелся на "без голоданий и диет", но понял, что чудес не бывает.
cool.vlad4; +1 Ответить
9. zsrg 346 14.03.13 12:36 Сейчас в теме
(3) orefkov, Новый COMObject прямого отношения к ActiveX не имеет, но раз смущает, то уберу :)
11. cool.vlad4 2 14.03.13 13:58 Сейчас в теме
(9)как бы имеет. ActiveX суть ком сервер, просто реализующий в довесок пару дополнительных интерфейсов.
24. sikuda 685 09.01.14 09:48 Сейчас в теме
(3)orefkov,
Без ActiveX можно через html bgsound http://infostart.ru/public/248770/
4. yuraos 1008 14.03.13 12:26 Сейчас в теме
Клево!!!

Сам интерфейс используется для проговаривания строк, поэтому можно пользоваться и основной его функцией:
oVoice.Speak("Hello!");

Что напишешь - то комп и скажет????
5. andrewks 1383 14.03.13 12:30 Сейчас в теме
(4) yuraos, а что в этом сверхординарного? ещё под DOS, помню, была прога, принимающая с ком.строки текст, и озвучивающая его на PC Speaker :-)
6. yuraos 1008 14.03.13 12:33 Сейчас в теме
(4)
А русский язык понимает? И в частности не нормативную лексику???

А то я нарулю в 1С-ке всяких проверок,
если юзер чё не то нажмет -
- она его тремя буквами и тремя этажами!!!!!

Нет, на нынешней работе не прокатит - тогда придется на все компы колонки покупать...
Фин.директор - удавится.
Он и так всех заставил печатать договора с двух сторон печатать,
не взирая на замяте бумаги и повышенный износ принтеров.
;))))
8. andrewks 1383 14.03.13 12:36 Сейчас в теме
(6) yuraos,
А русский язык понимает? И в частности не нормативную лексику???

она и английский-то понимает с трудом, куда уж русский :-)
10. zsrg 346 14.03.13 12:38 Сейчас в теме
(6) yuraos, у меня русский не держит, на Windows Server, только по английски. Но у меня просто русский MUI установлен. Возможно на полной русской версии и заговорит по русски. Должен, по идее, так как говорилка встроена для поддержки людей с ограниченными возможностями.
18. AlexO 136 26.03.13 13:17 Сейчас в теме
(4) yuraos,
Что напишешь - то комп и скажет????

А то! Сейчас такие студенты пошли, что ого-го! Что напишут на русском - то комп и выполняет.
Без дураков.
(9) zsrg,
Новый COMObject прямого отношения к ActiveX не имеет

Браво!
БравО!!!
А к чему COM, реализованный в 1С, имеет отношение?
Автор, а что "опустил", что этот "SAPI.SpVoice" должен быть установлен прежде всего?
И, наконец, "решение простое и 100% работающее" - это воспроизведение звуковых файлов посредством открытия через 1С.
И как в анекдоте с динозавром: "50 на 50 - либо заиграет (если есть драйвера и звуковуха), либо нет" :)
13. Dnki 4 20.03.13 20:51 Сейчас в теме
Проверил. WAV воспроизводит. MP3 - нет. Что-то смешное говорит.
14. zsrg 346 21.03.13 07:37 Сейчас в теме
Не удивительно. WAV родной форматы винды, а mp3 уже расширение кодека для мультимедиа плеера.
15. Кошки рулят 25.03.13 11:45 Сейчас в теме
Так чисто для прикола, наверное можно поюзать, но в реальных базах врядли.
Говорилку пользователи отключают или сразу или максимум через день - мешает работать.
Звуковые файлы можно проигрывать
ЗапуститьПриложение(ПутьДоФайла)
и не надо думать какой виндовс, какой формат файла ...
А вот подать сигнал (не работающая почему-то нигде и никогда Сигнал()) я предпочитаю баяном. Например:
Баян=CreateObject("DynamicWrapper");
Баян.Register("KERNEL32.DLL", "Beep", "i=ll", "f=s", "r=l");
Баян.Beep(330*4,300);
Баян.Beep(494*4,200);

Работает тоже в любом виндовсе, звучать будет через все, что сможет, даже через динамик системного блока ...
Не полифония, конечно, но можно довольно затейливые рулады воспроизвести ...
Lapitskiy; +1 Ответить
16. Aleks1973 25.03.13 11:52 Сейчас в теме
(15) {Форма.Форма.Форма(3,6)}: Процедура или функция с указанным именем не определена (CreateObject)
Баян=<<?>>CreateObject("DynamicWrapper"); (Проверка: Толстый клиент (обычное приложение))
17. Кошки рулят 25.03.13 11:54 Сейчас в теме
(16) Aleks1973, Забудь про снеговик ...
29. Lapitskiy 1064 12.08.18 19:18 Сейчас в теме
(15)
Для восьмерки:

DW = Новый COMОбъект("DynamicWrapper");
DW.Register("KERNEL32.DLL", "Beep", "i=ll", "f=s", "r=l");

DW.Beep(330*4,300);
DW.Beep(494*4,200);
19. Vovus 4 12.09.13 17:25 Сейчас в теме
На сервере Управляемые Формы не воспроизводить звук Выдает ошибку что oSpFileStream.Open не определено
20. zsrg 346 12.09.13 20:32 Сейчас в теме
Все правильно и не должно воспроизводить. Звук должен воспроизводиться на клиенте, а не на сервере!
21. Vovus 4 15.09.13 16:56 Сейчас в теме
(20) zsrg,
Скрипт = Новый COMОбъект("MSScriptControl.ScriptControl");
Скрипт.Language="vbscript";
Скрипт.AddCode("
|Function Main()
|Set oVoice = CreateObject(""SAPI.SpVoice"")
|set oSpFileStream = CreateObject(""SAPI.SpFileStream"")
|oSpFileStream.Open ""D:\Muz\1.wav""
|oVoice.SpeakStream oSpFileStream
|End Function");
Скрипт.Run("Main");
Так работает на сервере но вопрос как записать в место жесткой привязки к пути значение например реквизита или константы!?
22. zsrg 346 15.09.13 17:59 Сейчас в теме
Если я правильно понял:

|oSpFileStream.Open """+ПутьДоФайла+"""
23. androidT1C 76 25.10.13 09:50 Сейчас в теме
Отлично!

Хоть и выдает ошибку

Ошибка при вызове метода контекста (SpeakStream): Произошла исключительная ситуация (0x80070057)
oVoice.SpeakStream(oSpFileStream);
по причине:
Произошла исключительная ситуация (0x80070057)

но звук воспроизводит!

Но есть одно "но". Как сделать, чтобы 1С не ждала окончания воспроизведения звука, а продолжала работать?

Как, например, через WshShell.Run(,0,0) это замутить?
SITR-utyos; +1 Ответить
27. SITR-utyos 1438 28.07.17 19:53 Сейчас в теме
(23) Хороший вопрос! - я сделал так: http://infostart.ru/public/655524/
25. Serge_ASB 29.10.14 12:01 Сейчас в теме
внёс
oVoice = Новый COMObject("SAPI.SpVoice");

oSpFileStream = Новый COMObject("SAPI.SpFileStream");
oSpFileStream.Open(ПутьДоФайла);
oVoice.SpeakStream(oSpFileStream);
oSpFileStream.Close();

в процедуру.
Вызов ее, как написано выше, производится только &НаКлиенте
Почему-то вызов этой процедуры (&НаКлиенте Посигналить();) не производится: программа не находит ее. А из других клиентских - пожалуйста.
26. websamson 307 12.05.17 08:32 Сейчас в теме
Столкнулся с тем, что при выполнении кода выходила ошибка 0x80045003
Решение: формат звукового файла .wav обязательно должен быть mono, а не stereo.
Конвертировали с помощью плагина AIMP.
bashhhh; TrbVLAD; +2 Ответить
30. artjurMV 07.11.19 11:55 Сейчас в теме
(26) Не факт. Стерео тоже может быть, но надо формат семплов устанавливать в 16 бит
31. bashhhh 26 25.06.20 13:18 Сейчас в теме
(26) Спасибо за коммент. Долго понять не мог в чем проблема, и еще столько же бы просидел.
28. sertak 328 05.10.17 09:02 Сейчас в теме
Благодарю, чувак! Сэкономил кучу нервов и времени коллеге. Плюс 1 в карму.
32. shiaju 26 17.11.21 09:57 Сейчас в теме
Спасибо, четко и по делу. Голосовой движок кстати и русский понимает, будем учить ТСД разговаривать с кладовщиком))
Для отправки сообщения требуется регистрация/авторизация