При работе с типовыми конфигурациями 1С, такими как "1С:Комплексная автоматизация 2" (КА2), вопрос о воспроизведении звука при получении новых сообщений в "Обсуждениях" является одним из часто задаваемых. Выясним, как это реализовано в системе 1С:Предприятие, и рассмотрим возможности для программного управления звуковыми оповещениями.
Прежде всего, давайте разберем основной механизм. Вывод звука при получении сообщений в "Обсуждениях" типовых конфигураций 1С реализован на уровне самой платформы "1С:Предприятие". Это означает, что вам не потребуется искать специфические процедуры или функции в коде конфигурации для активации звука, поскольку это встроенная функциональность платформы.
Проанализируем ключевые аспекты этого платформенного механизма:
ОтображениеОповещенийСистемыВзаимодействия (CollaborationSystemNotificationRepresentation). Этот параметр имеет несколько режимов:
Обычное (Normal): В этом режиме при получении нового сообщения на экране отображается всплывающее оповещение и воспроизводится звук. Это стандартное поведение, которое пользователи ожидают от системы обмена сообщениями.НеБеспокоить (DontDisturb): При активации этого режима всплывающие оповещения не отображаются, и звук не воспроизводится. Этот режим полезен, когда вы хотите избежать отвлечения на уведомления.Администрирование – Интернет поддержка и сервисы – Обсуждения или через меню Обсуждения, видеозвонки, показ экрана – Настройки. Здесь вы можете включить или отключить звуковые уведомления для сообщений и видеозвонков.ЗвуковоеОповещение в 1С имеет значения ПоУмолчанию (Default) и Нет (None), что позволяет контролировать использование стандартного звука или его полное отключение.Таким образом, для большинства сценариев в типовых конфигурациях 1С, звук при получении сообщений в "Обсуждениях" воспроизводится автоматически благодаря встроенным возможностям платформы, и его поведение можно настроить через пользовательский интерфейс. В качестве альтернативы встроенному механизму можно использовать готовое решение для обмена сообщениями и файлами внутри 1С.
Несмотря на то, что для "Обсуждений" типовых конфигураций прямое программное управление звуком не требуется, могут возникнуть задачи, когда нам необходимо воспроизвести звук в других частях конфигурации или реализовать кастомные звуковые оповещения, например, при возникновении определенной ошибки или выполнении важной операции. В таких случаях мы можем обратиться к программным средствам.
Мы можем использовать COM-объекты SAPI (Speech Application Programming Interface) для управления звуком и синтезом речи на клиентской стороне. Это мощный инструмент, который позволяет гибко настраивать звуковые оповещения.
Представим ситуацию, когда нам необходимо воспроизводить звук ошибки или голосовое предупреждение. Рассмотрим шаги и код, который позволяет это сделать:
SAPI.SpVoice: Этот объект является основным для воспроизведения звуков и синтеза речи.SAPI.SpFileStream: Используется для работы со звуковыми файлами, позволяя открывать их для последующего воспроизведения.
&НаКлиенте
Перем oVoice, oSpFileStream, ИмяФайлаЗвука;
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// ИмяФайлаЗвука может быть именем макета (например, "ЗвукОшибки1") или
// специальной меткой для голосового оповещения (например, "Голос").
// Подключение звуковых объектов происходит здесь.
ПодключитьЗвукОшибки;
КонецПроцедуры
Мы видим, что переменные oVoice, oSpFileStream и ИмяФайлаЗвука объявляются как глобальные для клиента, чтобы сохранять их состояние между вызовами процедур.
.wav), его необходимо разместить на клиентском диске. Удобный способ сделать это — хранить файл в виде макета конфигурации с двоичными данными. При необходимости этот макет будет записан во временный файл на диске пользователя.
#Область РаботаСоЗвуковымОповещением
&НаКлиенте
Процедура ПодключитьЗвукОшибки(ИмяФайлаЗвукаВход = Неопределено)
Попытка
Если oVoice = Неопределено ИЛИ oSpFileStream = Неопределено Тогда
oVoice = Новый COMObject("SAPI.SpVoice");
oSpFileStream = Новый COMObject("SAPI.SpFileStream");
КонецЕсли;
Исключение
// Если COM-объекты не удалось создать (например, нет SAPI или ошибка),
// просто выходим, функция воспроизведения звука не будет работать.
Возврат;
КонецПопытки;
// Определяем, какой звук будем использовать.
// Если ИмяФайлаЗвукаВход не задано, используем значение по умолчанию.
Если ИмяФайлаЗвукаВход = Неопределено Тогда
ИмяФайлаЗвука = "ЗвукОшибки1"; // "ЗвукОшибки1" - это имя макета с двоичными данными (.wav)
ИначеЕсли ИмяФайлаЗвукаВход = "Голос" Тогда
ИмяФайлаЗвука = ИмяФайлаЗвукаВход; // Специальная метка для голосового оповещения
Возврат; // Для голосового оповещения файл не нужен, выходим
Иначе
ИмяФайлаЗвука = ИмяФайлаЗвукаВход;
КонецЕсли;
// Формируем полный путь к временному файлу.
ИмяФайла = КаталогВременныхФайлов + ИмяФайлаЗвука + ".wav";
ФайлНаДиске = Новый Файл(ИмяФайла);
// Если файла на диске нет, получаем его из макета и записываем.
Если НЕ ФайлНаДиске.Существует Тогда
ЗвукДвоичныеДанные = ПолучитьЗвукОшибки(ИмяФайлаЗвука); // Вызов серверной функции
ЗвукДвоичныеДанные.Записать(ИмяФайла);
КонецЕсли;
// Открываем файл для воспроизведения через поток SAPI.
oSpFileStream.Open(ИмяФайла);
КонецПроцедуры
&НаСервере
Функция ПолучитьЗвукОшибки(ИмяМакета)
// Здесь мы получаем макет из какой-либо обработки или общей формы.
// Пример: из обработки "ПечатьКодовМаркировок" (может быть любой другой).
Возврат Обработки.ПечатьКодовМаркировок.ПолучитьМакет(ИмяМакета);
КонецФункции
Обратите внимание на использование серверной функции ПолучитьЗвукОшибки. Это позволяет получить двоичные данные макета, хранящегося в конфигурации, и записать их во временный файл на клиентской стороне.
&НаКлиенте
Процедура ВоспроизвестиЗвукОшибки(Текст = "")
попытка
Если oVoice = Неопределено ИЛИ oSpFileStream = Неопределено Тогда
Возврат; // Не можем воспроизвести звук, если объекты не инициализированы
КонецЕсли;
Если ИмяФайлаЗвука = "Голос" Тогда
// Воспроизводим текст голосом
oVoice.Rate = 3 ; // Скорость речи (от -10 до 10, 0 - нормальная)
oVoice.Speak("Внимание!" + Текст,1); // 1 - асинхронное воспроизведение
Иначе
// Воспроизводим звук из файла
// oSpFileStream уже открыт в процедуре ПодключитьЗвукОшибки
oVoice.SpeakStream(oSpFileStream,1); // 1 - асинхронное воспроизведение
// oSpFileStream.Close; // Закрытие потока лучше выполнять при закрытии формы
КонецЕсли;
Исключение
// Обработка ошибок при воспроизведении звука
КонецПопытки;
КонецПроцедуры
В этой процедуре мы видим два основных режима: воспроизведение синтезированной речи (если ИмяФайлаЗвука = "Голос") и воспроизведение заранее подготовленного .wav файла. Флаг 1 в методах Speak и SpeakStream указывает на асинхронное воспроизведение, что позволяет не блокировать пользовательский интерфейс 1С во время проигрывания звука.
&НаКлиенте
Процедура Кнопка1(Команда)
Контрагент = ""; // Предположим, это значение мы получили откуда-то
/// Если голосовое предупреждение
Если не ЗначениеЗаполнено(Контрагент) Тогда
ВоспроизвестиЗвукОшибки("Не заполнен контрагент!");
Возврат;
КонецЕсли;
/// воспроизведение обычного сигнала ошибки или не только ошибки, а успешного выполнения
Если Контрагент = Справочники.Контрагенты.ПустаяСсылка Тогда
ВоспроизвестиЗвукОшибки; // Воспроизведет звук из файла (по умолчанию)
Возврат;
КонецЕсли;
КонецПроцедуры
В данном примере ВоспроизвестиЗвукОшибки("Не заполнен контрагент!") вызовет синтез речи, а ВоспроизвестиЗвукОшибки без параметров воспроизведет звук из файла ЗвукОшибки1.wav.
&НаКлиенте
Процедура ПриЗакрытии
Если НЕ oSpFileStream = Неопределено Тогда
Попытка
oSpFileStream.Close;
Исключение
// Обработка ошибок при закрытии потока
КонецПопытки;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
Для более простых задач, когда звуковой файл уже гарантированно существует по известному пути на клиентской машине, можно использовать более компактный код:
Процедура ПроигратьЗвук()
Попытка
ПутьДоФайла = "C:\chord1.wav"; // Укажите полный путь к вашему WAV-файлу
// Создаем новые COM-объекты при каждом вызове (менее эффективно, но проще для коротких задач)
oVoice = Новый COMObject("SAPI.SpVoice");
oSpFileStream = Новый COMObject("SAPI.SpFileStream");
oSpFileStream.Open(ПутьДоФайла); // Открываем файл
oVoice.SpeakStream(oSpFileStream); // Воспроизводим содержимое потока
oSpFileStream.Close(); // Обязательно закрываем поток после воспроизведения
Исключение
// Обработка возможных ошибок, например, файл не найден
Сообщить("Не удалось воспроизвести звук: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Этот пример демонстрирует прямой подход к воспроизведению .wav файла. Однако он требует, чтобы файл находился по указанному пути, и создает COM-объекты при каждом вызове, что может быть неоптимально для частого использования.
Рассмотрим некоторые дополнительные детали, которые могут быть полезны при работе со звуком в 1С:
Сигнал(): В платформе 1С существует встроенная функция Сигнал(), предназначенная для воспроизведения короткого системного звукового сигнала. Однако ее поведение сильно зависит от настроек операционной системы и она не используется для реализации звуковых оповещений в "Обсуждениях". Она больше подходит для простых "пиков" в отладочных целях или для привлечения внимания в очень специфических сценариях.ВоспроизвестиЗвуковоеОповещение. Этот метод позволяет программно воспроизводить системные звуки, включать вибрацию или проигрывать указанный звуковой файл. Однако это относится к разработке мобильных приложений и не является частью стандартной реализации звука для "Обсуждений" в типовых десктопных конфигурациях. При использовании собственного звукового файла для мобильных уведомлений, файл должен быть приложен к скомпилированному приложению.Таким образом, мы выяснили, что стандартный вывод звука в "Обсуждениях" 1С управляется платформой, а для кастомных звуковых оповещений в других частях программы можно использовать COM-объекты SAPI. Это дает нам гибкие возможности для работы со звуком в системе 1С:Предприятие.