Есть код, который должен запускать звук из файла при определенных условиях. Перестает работать при указании второго параметра в Voice.Speak, звука нет. При этом при проверке в отладчике всё отрабатывает, звук запускается. Пробовал реализовать через StreamSpeak, проблема та же. Подскажите, 1С не поддерживает флаги этих методов?

Проверял на 8.3.14, 8.3.17, 8.3.20.

```1c
    Путь = КаталогВременныхФайлов()+"sound.wav";
    Voice = Новый COMObject("SAPI.SpVoice");
    Voice.Volume = Громкость;
    Voice.Speak(Путь, 5);
```
---
Перем oVoice ;

Процедура ВоспроизвестиЗвук(ВоспроизвестиТекст = ложь)
...........................................

  oVoice.Speak("Внимание!" + ТекстОшибки,1);
.........................................
КонецПроцедуры
---
Я даже не знал что можно асинхронно воспроизводить! ))
В общем смотри: при асинхронном чтении oVoice умирает сразу же на выходе из процедуры, в которой, собственно и производится чтение.

Решается так:

```1c
    &НаКлиенте
    перем oVoice, oSpFileStream;

    &НаКлиенте
    Процедура ПриОткрытии(Отказ)
    oVoice = Новый COMObject("SAPI.SpVoice");
    oSpFileStream = Новый COMObject("SAPI.SpFileStream");
    КонецПроцедуры

    &НаКлиенте
    Процедура ВоспроизвестиЗвук(ВоспроизвестиТекст = ложь)
    oVoice.Rate = 1 ; ///Скорость речи 0 - 10
    oVoice.Speak("Внимание!Внимание!Внимание!",1 ); ///Асинхронно = 1
    КонецПроцедуры
```
---
Тебе крайне повезло!) Я не давно внедрил это в свою подсистему, смотри:

```1c
    &НаКлиенте
    Процедура ВоспроизвестиЗвук(ВоспроизвестиТекст = ложь)

    Попытка
    ///Подключаем объекты
    oVoice = Новый COMObject("SAPI.SpVoice");
    oSpFileStream = Новый COMObject("SAPI.SpFileStream");

    ///Находим звук (Формата .wav) на диске, если его нет, сохраняем
    ИмяФайла = КаталогВременныхФайлов() + ИмяФайлаЗвука + ".wav";
    ФайлНаДиске = Новый Файл(ИмяФайла);
    Если НЕ ФайлНаДиске.Существует() Тогда
    ///Звук у меня в макете
    Звук = ПолучитьЗвукОшибки(ИмяФайлаЗвука);
    Звук.Записать(ИмяФайла);
    КонецЕсли;

    //Тут самое интересное, можно воспроизвести текст ошибки, а можно проиграть звук
    Если ВоспроизвестиТекст Тогда
    oVoice.Speak("Внимание!" + ТекстОшибки);
    oVoice.Rate = 3 ; ///Скорость речи 0 - 10
    Иначе
    //Либо воспроизвести звук
    oSpFileStream.Open(ИмяФайла);
    oVoice.SpeakStream(oSpFileStream);
    oSpFileStream.Close();
    КонецЕсли;

    КонецПопытки;

    КонецПроцедуры
```
---
Это у меня отрабатывает, но мне нужно, чтобы звук запускался в фоне. Это должно решаться вторым параметром в Speak() и SpeakStream(), но проблема в том, что при его указании звук перестаёт воспроизводиться.
---
Я даже не знал что можно асинхронно воспроизводить! ))
В общем смотри: при асинхронном чтении oVoice умирает сразу же на выходе из процедуры, в которой, собственно и производится чтение.

Решается так:

```1c
    &НаКлиенте
    перем oVoice, oSpFileStream;

    &НаКлиенте
    Процедура ПриОткрытии(Отказ)
    oVoice = Новый COMObject("SAPI.SpVoice");
    oSpFileStream = Новый COMObject("SAPI.SpFileStream");
    КонецПроцедуры

    &НаКлиенте
    Процедура ВоспроизвестиЗвук(ВоспроизвестиТекст = ложь)
    oVoice.Rate = 1 ; ///Скорость речи 0 - 10
    oVoice.Speak("Внимание!Внимание!Внимание!",1 ); ///Асинхронно = 1
    КонецПроцедуры
```
---
(6) К моему коду достаточно было добавить объявление переменной Voice, чтобы он заработал. Спасибо вам большое за ответы!
---
Исправил у себя тоже, всё работает исправно и в асинхроне. Вот рабочий код:

```1c
    &НаКлиенте
    перем oVoice, oSpFileStream;

    &НаКлиенте
    Процедура ПриОткрытии(Отказ)
    ПодключитьЗвукОшибки("Голос");
    КонецПроцедуры

    &НаКлиенте
    Процедура ПодключитьЗвукОшибки()

    Попытка
    Если oVoice = Неопределено ИЛИ oSpFileStream = Неопределено Тогда
    oVoice = Новый COMObject("SAPI.SpVoice");
    oSpFileStream = Новый COMObject("SAPI.SpFileStream");
    КонецЕсли;
    Исключение
    Возврат;
    КонецПопытки;

    //ИмяФайлаЗвука - восстанавливается из хранилища настроек пользователя

    ///здесь Если ИмяФайлаЗвука = "Голос" - ошибка воспроизводится голосом, иначе воспроизводится wav файл
    Если ИмяФайлаЗвука = Неопределено Тогда
    ИмяФайлаЗвука = "ЗвукОшибки1";
    ИначеЕсли ИмяФайлаЗвука = "Голос" Тогда
    Возврат;
    КонецЕсли;

    ИмяФайла = КаталогВременныхФайлов() + ИмяФайлаЗвука + ".wav";
    ФайлНаДиске = Новый Файл(ИмяФайла);
    Если НЕ ФайлНаДиске.Существует() Тогда
    ///Звук в макете
    Звук = ПолучитьЗвукОшибки(ИмяФайлаЗвука);
    Звук.Записать(ИмяФайла);
    КонецЕсли;

    //Сразу подключаем звук
    oSpFileStream.Open(ИмяФайла);

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

    &НаКлиенте
    Процедура ВоспроизвестиЗвукОшибки(Текст = ")
    попытка
    Если oVoice = Неопределено ИЛИ oSpFileStream = Неопределено Тогда
    Возврат;
    КонецЕсли;
    Если ИмяФайлаЗвука = "Голос" Тогда
    oVoice.Rate = 3 ;
    oVoice.Speak("Внимание!" + Текст,1);
    Иначе
    //oSpFileStream.Open(ИмяФайла);
    oVoice.SpeakStream(oSpFileStream,1);
    //oSpFileStream.Close();
    КонецЕсли;
    Исключение
    КонецПопытки;
    КонецПроцедуры

    &НаКлиенте
    Процедура ПриЗакрытии()
    Если НЕ oSpFileStream = Неопределено Тогда
    Попытка
    oSpFileStream.Close();
    Исключение
    КонецПопытки;
    КонецЕсли;
    КонецПроцедуры
```
---
Перем oVoice ;

Процедура ВоспроизвестиЗвук(ВоспроизвестиТекст = ложь)
...........................................

  oVoice.Speak("Внимание!" + ТекстОшибки,1);
.........................................
КонецПроцедуры
---
У меня так работает асинхронно
Вместо многоточия содержимое процедуры из (2)