Сегодня попробую рассказать о том, какие методы работы со звуком доступны в 1С.
Штатные средства
На самом деле, штатных средств для работы со звуком, насколько я знаю, в 1С ровно одно — убогая процедура «Сигнал».
1 2 3 4 | &НаКлиенте Процедура Команда(Команда) Сигнал(); КонецПроцедуры |
Она не принимает никакие параметры и просто издает системный звук.
Штатные методы закончились, а из нештатных есть следующие варианты.
Microsoft Speech API (SAPI)
Разработку Microsoft для синтеза голоса вполне можно использовать для воспроизведения wav-файлов, делается это так:
1 2 3 4 5 6 7 8 9 10 11 12 | &НаКлиенте Процедура Команда(Команда) мФайл = "C:\1.wav"; spVoice = Новый COMОбъект("SAPI.SpVoice"); spfStream = Новый COMОбъект("SAPI.SpFileStream"); spfStream.Open(мФайл); spVoice.SpeakStream(spfStream); spfStream.Close(); КонецПроцедуры |
Кроме этого с помощью Speech API можно реализовать голосовое произнесение какого-либо текста — функция «Speak», параметр — строка текста, сама технология поддерживает 26 языков, включая русский, но, насколько я знаю, для поддержки русского необходимо скачивать и устанавливать специальную библиотеку (возможно, позднее разберусь с этим и напишу статью). Почитать подробнее об функционале Speech API можно на MSDN (на английском).
DynamicWrapperX
DynamicWrapperX — достаточно известная в некоторых кругах библиотека, которая позволяет зарегистрировать и использовать функции какой-либо другой библиотеки. Саму DynamicWrapperX можно скачать на сайте автора.
С помощью DynamicWrapperX можно зарегистрировать «sndPlaySoundA» из библиотеки «winmm.dll» и использовать эту функцию для воспроизведения wav-файлов.
Это может выглядеть так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | &НаКлиенте Процедура ВоспроизвестиWAV() мФайл = "C:\1.wav"; DynWrapЗарегистрирован = Ложь; Попытка DynWrap = Новый COMОбъект("DynamicWrapperX"); DynWrapЗарегистрирован = Истина; Исключение тОбъект = ПолучитьМакетНаСервере(); тОбъект.Записать(КаталогВременныхФайлов() +"dynwrapx.dll"); КомандаСистемы("regsvr32 dynwrapx.dll", КаталогВременныхФайлов()); Попытка DynWrap = Новый COMОбъект("DynamicWrapperX"); DynWrapЗарегистрирован = Истина; Исключение Сообщить("Ошибка регистрации библиотеки"); КонецПопытки; КонецПопытки; Если DynWrapЗарегистрирован Тогда DynWrap.Register("winmm.dll", "sndPlaySoundA", "i=su"); DynWrap.sndPlaySoundA(мФайл, 1); КонецЕсли; КонецПроцедуры &НаСервере Функция ПолучитьМакетНаСервере() Возврат Обработки.ЗвукВ1С.ПолучитьМакет("dynwrapx"); КонецФункции |
В этом примере подразумевается наличие макета «dynwrapx» (тип — двоичные данные). Для успешной регистрации библиотеки (DynamicWrapperX), 1С нужно запустить от имени администратора.
HTML
И, наконец, последний на сегодня способ — при помощи html-тега «bgsound». На форме должен быть элемент «Поле HTML документа». Насколько я понял, этот элемент должен именно быть виден на форме, т.к. у меня звук не воспроизводился если я скрывал это элемент (Видимость=Ложь).
Главный плюс этого способа — возможность воспроизвести mp3-файлы (а вот wav-файлы, наоборот нельзя), а в минусы можно записать необходимость присутствия на форме поля HTML документа (если я не ошибаюсь) и зависимость от настроек Internet Explorer-а (в настройках Explorer-а должно быть включено воспроизведение звуков страницы).
Сама же реализация выглядит приблизительно так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | &НаКлиенте Процедура ВоспроизвестиMP3() мФайл = ПолучитьАдресФайла(); ПолеHTML = " | | | | | | function PlaySound() { | if (!window.HTMLAudioElement) { | document.all.sound_think.volume=0; | document.all.sound_think.src = '"+мФайл+"'; | } | } | window.onload = function(){ | PlaySound(); | } | | | "; КонецПроцедуры &НаСервере Функция ПолучитьАдресФайла() Возврат ПоместитьВоВременноеХранилище(Обработки.ЗвукВ1С.ПолучитьМакет("sound")); КонецФункции |
В примере подразумевается, что существует макет с типом двоичные данные, в котором и храниться звуковой файл, а на форме имеется элемент «Поле HTML документа» (в примере он называется «ПолеHTML»).
На этом все, надеюсь эта статья Вам помогла.
Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Доброго времени суток!
Я пользуюсь произнесением текста через SpVoice. Но у него большой недостаток — пока проговаривается текст блокируется клиентский интерфейс. Есть ли способ это обойти?