Как реализован вывод звука при получении сообщений в "Обсуждениях" типовых конфигураций 1С?

Программист 1С v8.3 (Управляемые формы) 1С:Комплексная автоматизация IT и автоматизация бизнеса
← На главную

При работе с типовыми конфигурациями 1С, такими как "1С:Комплексная автоматизация 2" (КА2), вопрос о воспроизведении звука при получении новых сообщений в "Обсуждениях" является одним из часто задаваемых. Выясним, как это реализовано в системе 1С:Предприятие, и рассмотрим возможности для программного управления звуковыми оповещениями.

Платформенная реализация вывода звука в системе взаимодействия 1С

Прежде всего, давайте разберем основной механизм. Вывод звука при получении сообщений в "Обсуждениях" типовых конфигураций 1С реализован на уровне самой платформы "1С:Предприятие". Это означает, что вам не потребуется искать специфические процедуры или функции в коде конфигурации для активации звука, поскольку это встроенная функциональность платформы.

Проанализируем ключевые аспекты этого платформенного механизма:

  1. Система взаимодействия: Звуковые оповещения являются частью функционала "Системы взаимодействия", которая обеспечивает обмен сообщениями, файлами, а также аудио- и видеоконференции между пользователями 1С. При получении новых сообщений или входящих звонков в рамках этой системы платформа автоматически проигрывает звуковое оповещение.
  2. Настройки отображения оповещений: Поведение оповещений, включая воспроизведение звука, регулируется параметром ОтображениеОповещенийСистемыВзаимодействия (CollaborationSystemNotificationRepresentation). Этот параметр имеет несколько режимов:
    • Обычное (Normal): В этом режиме при получении нового сообщения на экране отображается всплывающее оповещение и воспроизводится звук. Это стандартное поведение, которое пользователи ожидают от системы обмена сообщениями.
    • НеБеспокоить (DontDisturb): При активации этого режима всплывающие оповещения не отображаются, и звук не воспроизводится. Этот режим полезен, когда вы хотите избежать отвлечения на уведомления.
  3. Пользовательские настройки: Пользователи могут управлять звуковыми оповещениями непосредственно через настройки в прикладном решении 1С. Обычно эти настройки находятся в разделе Администрирование – Интернет поддержка и сервисы – Обсуждения или через меню Обсуждения, видеозвонки, показ экрана – Настройки. Здесь вы можете включить или отключить звуковые уведомления для сообщений и видеозвонков.
  4. Типы звуковых оповещений: По умолчанию платформа использует "установленный в системе звук уведомления". Это означает, что воспроизводится стандартный системный звук, заданный в настройках операционной системы вашего устройства. Встроенный тип ЗвуковоеОповещение в 1С имеет значения ПоУмолчанию (Default) и Нет (None), что позволяет контролировать использование стандартного звука или его полное отключение.
  5. Оповещения при закрытой программе: Если нам необходимо получать оповещения, включая звуковые, даже когда программа 1С не запущена, требуется установить отдельное приложение "1С:Предприятие – оповещения и запуск".
  6. Архитектура: Следует понимать, что "Система взаимодействия" работает в клиент-серверной архитектуре. Для взаимодействия между пользователями используется отдельный программный продукт "1С:Сервер взаимодействия", который может быть развернут локально или использоваться облачный сервис "1С:Диалог". Клиентские приложения 1С:Предприятия отвечают за отображение переписки и воспроизведение оповещений на стороне пользователя.

Таким образом, для большинства сценариев в типовых конфигурациях 1С, звук при получении сообщений в "Обсуждениях" воспроизводится автоматически благодаря встроенным возможностям платформы, и его поведение можно настроить через пользовательский интерфейс. В качестве альтернативы встроенному механизму можно использовать готовое решение для обмена сообщениями и файлами внутри 1С.

Программное воспроизведение звука в 1С для других задач

Несмотря на то, что для "Обсуждений" типовых конфигураций прямое программное управление звуком не требуется, могут возникнуть задачи, когда нам необходимо воспроизвести звук в других частях конфигурации или реализовать кастомные звуковые оповещения, например, при возникновении определенной ошибки или выполнении важной операции. В таких случаях мы можем обратиться к программным средствам.

Мы можем использовать COM-объекты SAPI (Speech Application Programming Interface) для управления звуком и синтезом речи на клиентской стороне. Это мощный инструмент, который позволяет гибко настраивать звуковые оповещения.

Разберем пример программной реализации звукового оповещения

Представим ситуацию, когда нам необходимо воспроизводить звук ошибки или голосовое предупреждение. Рассмотрим шаги и код, который позволяет это сделать:

  1. Инициализация COM-объектов SAPI: Нам понадобятся два основных COM-объекта для работы со звуком:
    • SAPI.SpVoice: Этот объект является основным для воспроизведения звуков и синтеза речи.
    • SAPI.SpFileStream: Используется для работы со звуковыми файлами, позволяя открывать их для последующего воспроизведения.
    Важно инициализировать эти объекты только один раз при открытии формы или в начале работы программы, чтобы избежать лишних накладных расходов.
    
    &НаКлиенте
    Перем oVoice, oSpFileStream, ИмяФайлаЗвука;
    
    &НаКлиенте
    Процедура ПриОткрытии(Отказ)
        // ИмяФайлаЗвука может быть именем макета (например, "ЗвукОшибки1") или
        // специальной меткой для голосового оповещения (например, "Голос").
        // Подключение звуковых объектов происходит здесь.
        ПодключитьЗвукОшибки;
    КонецПроцедуры
    

    Мы видим, что переменные oVoice, oSpFileStream и ИмяФайлаЗвука объявляются как глобальные для клиента, чтобы сохранять их состояние между вызовами процедур.

  2. Подготовка звукового файла: Если мы хотим воспроизвести собственный звуковой файл (например, в формате .wav), его необходимо разместить на клиентском диске. Удобный способ сделать это — хранить файл в виде макета конфигурации с двоичными данными. При необходимости этот макет будет записан во временный файл на диске пользователя.
    
    #Область РаботаСоЗвуковымОповещением
    
    &НаКлиенте
    Процедура ПодключитьЗвукОшибки(ИмяФайлаЗвукаВход = Неопределено)
        Попытка
            Если oVoice = Неопределено ИЛИ oSpFileStream = Неопределено Тогда
                oVoice = Новый COMObject("SAPI.SpVoice");
                oSpFileStream = Новый COMObject("SAPI.SpFileStream");
            КонецЕсли;
        Исключение
            // Если COM-объекты не удалось создать (например, нет SAPI или ошибка),
            // просто выходим, функция воспроизведения звука не будет работать.
            Возврат;
        КонецПопытки;
    
        // Определяем, какой звук будем использовать.
        // Если ИмяФайлаЗвукаВход не задано, используем значение по умолчанию.
        Если ИмяФайлаЗвукаВход = Неопределено Тогда
            ИмяФайлаЗвука = "ЗвукОшибки1"; // "ЗвукОшибки1" - это имя макета с двоичными данными (.wav)
        ИначеЕсли ИмяФайлаЗвукаВход = "Голос" Тогда
            ИмяФайлаЗвука = ИмяФайлаЗвукаВход; // Специальная метка для голосового оповещения
            Возврат; // Для голосового оповещения файл не нужен, выходим
        Иначе
            ИмяФайлаЗвука = ИмяФайлаЗвукаВход;
        КонецЕсли;
    
        // Формируем полный путь к временному файлу.
        ИмяФайла = КаталогВременныхФайлов + ИмяФайлаЗвука + ".wav";
        ФайлНаДиске = Новый Файл(ИмяФайла);
    
        // Если файла на диске нет, получаем его из макета и записываем.
        Если НЕ ФайлНаДиске.Существует Тогда
            ЗвукДвоичныеДанные = ПолучитьЗвукОшибки(ИмяФайлаЗвука); // Вызов серверной функции
            ЗвукДвоичныеДанные.Записать(ИмяФайла);
        КонецЕсли;
    
        // Открываем файл для воспроизведения через поток SAPI.
        oSpFileStream.Open(ИмяФайла);
    КонецПроцедуры
    
    &НаСервере
    Функция ПолучитьЗвукОшибки(ИмяМакета)
        // Здесь мы получаем макет из какой-либо обработки или общей формы.
        // Пример: из обработки "ПечатьКодовМаркировок" (может быть любой другой).
        Возврат Обработки.ПечатьКодовМаркировок.ПолучитьМакет(ИмяМакета);
    КонецФункции
    

    Обратите внимание на использование серверной функции ПолучитьЗвукОшибки. Это позволяет получить двоичные данные макета, хранящегося в конфигурации, и записать их во временный файл на клиентской стороне.

  3. Воспроизведение звука: После того как объекты инициализированы и звуковой файл (если он используется) подготовлен, мы можем перейти к его воспроизведению.
    
    &НаКлиенте
    Процедура ВоспроизвестиЗвукОшибки(Текст = "")
        попытка
            Если 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С во время проигрывания звука.

  4. Пример использования: Представим, что у нас есть кнопка на форме, и при нажатии на нее мы хотим проверить заполнение контрагента и воспроизвести звук или голосовое оповещение, если контрагент не заполнен.
    
    &НаКлиенте
    Процедура Кнопка1(Команда)
        Контрагент = ""; // Предположим, это значение мы получили откуда-то
        /// Если голосовое предупреждение
        Если не ЗначениеЗаполнено(Контрагент) Тогда
            ВоспроизвестиЗвукОшибки("Не заполнен контрагент!");
            Возврат;
        КонецЕсли;
    
        /// воспроизведение обычного сигнала ошибки или не только ошибки, а успешного выполнения
        Если Контрагент = Справочники.Контрагенты.ПустаяСсылка Тогда
            ВоспроизвестиЗвукОшибки; // Воспроизведет звук из файла (по умолчанию)
            Возврат;
        КонецЕсли;
    КонецПроцедуры
    

    В данном примере ВоспроизвестиЗвукОшибки("Не заполнен контрагент!") вызовет синтез речи, а ВоспроизвестиЗвукОшибки без параметров воспроизведет звук из файла ЗвукОшибки1.wav.

  5. Очистка ресурсов: Важно освобождать ресурсы (закрывать потоки) при закрытии формы, чтобы избежать утечек памяти или блокировки файлов.
    
    &НаКлиенте
    Процедура ПриЗакрытии
        Если НЕ 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С управляется платформой, а для кастомных звуковых оповещений в других частях программы можно использовать COM-объекты SAPI. Это дает нам гибкие возможности для работы со звуком в системе 1С:Предприятие.

← На главную