Разработка и Конфигурация · 10 мин
Как воспроизвести звук в 1С
Как воспроизвести звук в 1С:Предприятии 8.3: функция ВоспроизвестиЗвук, СредстваМультимедиа в мобильном клиенте, проигрывание WAV-файлов, ограничения и ошибки.
Воспроизведение звука в 1С — типичная задача при автоматизации рабочих мест: сигнал о сканировании штрихкода, оповещение о новом заказе, предупреждение об ошибке ввода. Встроенный язык платформы 1С:Предприятие 8.3 предоставляет для этого несколько механизмов, и выбор зависит от того, где выполняется код — в толстом, тонком, веб-клиенте или на мобильной платформе.
Ключевой момент, который нужно понимать сразу: звук воспроизводится только на клиенте. Серверный вызов не может проиграть файл на компьютере пользователя, поэтому весь код работы со звуком размещается в клиентских процедурах модуля формы, общего модуля с признаком «Клиент» или модуля приложения.
Ниже разобраны рабочие способы: штатная функция ВоспроизвестиЗвук(), объект СредстваМультимедиа для мобильного клиента, вариант через COM-объект Windows и обходные пути для ситуаций, где штатные средства недоступны.
Функция ВоспроизвестиЗвук — основной способ
Глобальный метод ВоспроизвестиЗвук(ИмяФайла) доступен в тонком и толстом клиенте. Он принимает один параметр — полный путь к звуковому файлу на диске клиентского компьютера. Вызов неблокирующий: звук запускается в фоне, а выполнение кода продолжается дальше, останавливать или дожидаться окончания воспроизведения штатными средствами нельзя.
&НаКлиенте
Процедура СигналОшибки(Команда)
ВоспроизвестиЗвук("C:\Sounds\error.wav");
КонецПроцедуры
Если файл не найден или формат не поддерживается, метод молча ничего не сделает — исключения не возникает. Поэтому перед вызовом полезно проверить существование файла через объект Файл и метод Существует(), иначе отладка превращается в гадание.
Ограничение по формату: гарантированно воспроизводятся WAV-файлы. Поддержка MP3 зависит от установленных в системе кодеков и версии платформы, поэтому для критичных оповещений надёжнее конвертировать звук в WAV.
Откуда брать файл: диск, макет, временное хранилище
Хранить звук в виде файла на диске каждого клиента — плохая идея: пути различаются, файл могут удалить. Правильный подход — поместить WAV-файл в макет конфигурации (тип «Двоичные данные») и при необходимости извлекать его во временный файл на клиенте.
&НаКлиенте
Процедура ПроигратьИзМакета(Команда)
Адрес = ПолучитьАдресМакетаНаСервере();
ИмяВременного = ПолучитьИмяВременногоФайла("wav");
Данные = ПолучитьИзВременногоХранилища(Адрес);
Данные.Записать(ИмяВременного);
ВоспроизвестиЗвук(ИмяВременного);
КонецПроцедуры
&НаСервере
Функция ПолучитьАдресМакетаНаСервере()
Данные = ПолучитьОбщийМакет("ЗвукОповещения");
Возврат ПоместитьВоВременноеХранилище(Данные, УникальныйИдентификатор);
КонецФункции
Обратите внимание на разделение контекстов: макет читается на сервере, передаётся на клиент через временное хранилище, а воспроизводится уже на клиенте. Это типовой шаблон для любых бинарных ресурсов в управляемом приложении.
Для часто используемого звука имеет смысл извлекать файл один раз при запуске (например, в модуле управляемого приложения при начале работы системы) и запоминать путь в клиентской переменной, чтобы не гонять данные через хранилище при каждом событии.
- 1Добавьте WAV-файл в общий макет конфигурации с типом «Двоичные данные»
- 2На сервере получите макет и поместите его во временное хранилище с привязкой к УникальныйИдентификатор формы
- 3На клиенте извлеките данные и запишите во временный файл с расширением wav
- 4Вызовите ВоспроизвестиЗвук() с путём к временному файлу
- 5Проверьте звук на реальном рабочем месте пользователя, а не только у разработчика
Звук в мобильном клиенте и мобильной платформе
На мобильной платформе 1С функция ВоспроизвестиЗвук() недоступна. Вместо неё используется объект СредстваМультимедиа с методом ВоспроизвестиАудио(), который принимает путь к файлу в файловой системе мобильного устройства.
&НаКлиенте
Процедура СигналНаМобильном(Команда)
СредстваМультимедиа.ВоспроизвестиАудио(ПутьКФайлу);
КонецПроцедуры
Файл предварительно нужно доставить на устройство — например, получить с сервера через веб-сервис или HTTP-запрос и сохранить в каталог данных приложения. Метод также неблокирующий; для управления воспроизведением (пауза, остановка) в мобильной платформе есть отдельные средства мультимедиа, но для коротких сигналов они обычно не требуются.
Веб-клиент и его ограничения
В веб-клиенте ни ВоспроизвестиЗвук(), ни прямой доступ к файловой системе недоступны — это принципиальное ограничение браузерной песочницы. Штатного способа проиграть звук в веб-клиенте платформа не предоставляет.
Обходные варианты: расширение для браузера, отдельное локальное приложение-агент, которое опрашивает 1С и проигрывает звук, либо переход критичных рабочих мест на тонкий клиент. Для рабочих мест кладовщика или кассира, где звуковой сигнал обязателен, тонкий клиент — самый простое и надёжное решение.
Сравнение вариантов воспроизведения
Тонкий и толстый клиент на Windows. Простой вызов, только WAV, без управления воспроизведением
Мобильная платформа и мобильный клиент. Требует доставки файла на устройство
Толстый клиент Windows, управляемое воспроизведение и MP3. Не работает в тонком клиенте и требует прав на создание COM
Универсальный обходной путь, но открывает окно плеера и зависит от установленного ПО
Альтернатива: проигрывание через COM и внешние программы
В толстом клиенте (обычное приложение) можно использовать COM-объект Windows Media Player, который даёт контроль над воспроизведением и поддерживает MP3:
// Только толстый клиент, только Windows
Плеер = Новый COMОбъект("WMPlayer.OCX");
Плеер.URL = "C:\Sounds\signal.mp3";
Плеер.controls.play();
Другой вариант — ЗапуститьПриложение() или НачатьЗапускПриложения() с вызовом системного проигрывателя. Минус очевиден: у пользователя открывается окно плеера, что неприемлемо для коротких уведомлений. Такой способ оправдан только для прослушивания длинных записей, например аудиовложений из документов.
Типичный сценарий: звуковое оповещение о событии
Частая задача — сигнал при появлении новых данных: новом заказе, сообщении в обсуждениях, ошибке обмена. Реализуется это через подключение обработчика ожидания на клиенте, который периодически опрашивает сервер.
&НаКлиенте
Процедура ПроверитьНовыеЗаказы()
Количество = ПолучитьКоличествоНовыхЗаказовНаСервере();
Если Количество > 0 Тогда
ВоспроизвестиЗвук(ПутьКЗвуку);
ПоказатьОповещениеПользователя("Новые заказы: " + Количество);
КонецЕсли;
КонецПроцедуры
Подключается обработчик вызовом ПодключитьОбработчикОжидания("ПроверитьНовыеЗаказы", 60) — например, раз в минуту. Не ставьте слишком маленький интервал: каждый вызов — это обращение к серверу, и при десятках пользователей частые опросы создадут лишнюю нагрузку.
Проверка результата и диагностика
Если код выполняется, но звука нет, проверяйте по цепочке: существует ли файл в указанном пути именно на клиентском компьютере; открывается ли он штатным проигрывателем Windows; не отключён ли звук в системе и не выбрано ли другое устройство вывода. Убедитесь также, что процедура действительно клиентская — директива &НаКлиенте или соответствующий флажок общего модуля.
Для отладки временно добавьте Сообщить(ИмяФайла) перед вызовом и проверку Файл.Существует() с выводом результата. Это отсекает две самые частые причины: неверный путь и серверный контекст.
Как проверить результат
Процедура с директивой &НаКлиенте
Код в серверной процедуре или фоновом задании
Файл.Существует() возвращает Истина, файл открывается проигрывателем
Файл отсутствует или лежит только на сервере
WAV-файл воспроизводится системой
Экзотический формат без установленного кодека
Другие приложения воспроизводят звук на этом ПК
Звук отключён или выбрано не то устройство вывода
FAQ
Можно ли проиграть звук из фонового задания или регламентной операции?
Нет. Фоновые задания выполняются на сервере и не имеют доступа к клиентскому оборудованию. Чтобы сигналить о результате фоновой операции, доведите её до конца, а на клиенте через обработчик ожидания проверьте состояние задания и проиграйте звук уже в клиентском контексте.
Почему ВоспроизвестиЗвук() не выдаёт ошибку, но звука нет?
Метод спроектирован как «тихий»: отсутствие файла или неподдерживаемый формат не вызывают исключения. Проверьте путь через Файл.Существует(), убедитесь, что это WAV, и что процедура выполняется на клиенте.
Можно ли остановить воспроизведение или регулировать громкость?
Штатная функция ВоспроизвестиЗвук() таких возможностей не даёт — звук играет до конца с системной громкостью. Для управления воспроизведением в толстом клиенте Windows используйте COM-объект WMPlayer.OCX, а на мобильной платформе — расширенные средства мультимедиа.
Как проиграть звук всем пользователям одновременно, например при срочном оповещении?
Платформа не умеет рассылать звук принудительно. Практичный вариант: запись флага оповещения в базу (регистр сведений или константа), а у клиентов — обработчик ожидания, который проверяет флаг и проигрывает звук локально, после чего отмечает оповещение как обработанное.
Работает ли ВоспроизвестиЗвук() в 1С на Linux?
Метод доступен в клиенте под Linux, но фактическое воспроизведение зависит от настроенной звуковой подсистемы. Перед внедрением обязательно протестируйте на целевом рабочем месте; для критичных сценариев предусмотрите визуальное оповещение как запасной канал.
Какой размер WAV-файла допустим для хранения в макете?
Жёсткого ограничения для коротких сигналов нет, но разумно держать файл компактным: секундный моно-сигнал с низкой частотой дискретизации занимает десятки килобайт и не раздувает конфигурацию. Длинные записи лучше хранить внешне и доставлять по требованию.
Что важно запомнить
Звук в 1С воспроизводится только на клиенте: на десктопе — функцией ВоспроизвестиЗвук() с WAV-файлом, на мобильной платформе — через СредстваМультимедиа, в веб-клиенте штатного способа нет. Файл надёжнее хранить в макете и извлекать во временный файл, а перед вызовом проверять его существование и клиентский контекст выполнения.