Встречались ли вы с ситуацией, когда при запуске из 1С аудиофайла, например, записи телефонного разговора, медиаплеер вдруг показывает совершенно постороннее изображение в качестве обложки? Часто это может быть скриншот ошибки, случайный документ или любая другая картинка, сохраненная на компьютере. Давайте разберемся, почему так происходит и как с этим бороться с помощью средств 1С.
Проблема часто возникает при использовании простых медиаплееров, таких как Media Player Classic, и аудиофайлов, созданных утилитами вроде софтфона MicroSIP, которые не встраивают в файл метаданные или обложку альбома.
Чтобы найти правильное решение, сначала проанализируем поведение медиаплееров. Большинство из них пытаются сделать воспроизведение более наглядным и ищут обложку для трека в определенной последовательности:
folder.jpg, cover.jpg, albumart.jpg.Когда 1С программно сохраняет MP3-файл для проигрывания, он обычно помещается во временный каталог Windows. В этом каталоге могут находиться и другие временные файлы, включая изображения, например, скриншоты ошибок, которые вы делали ранее. В результате плеер, не найдя официальной обложки, подхватывает этот скриншот и отображает его.
Самый прямой и быстрый способ, предложенный на форуме, — не давать плееру шанса найти посторонние изображения. Для этого нужно перед запуском помещать аудиофайл в "чистую" папку, где кроме него ничего не будет. Рассмотрим, как реализовать это на языке 1С.
Идея заключается в том, чтобы создать во временном каталоге отдельную подпапку, например, с именем Player, очищать ее от старых файлов перед каждым новым воспроизведением, сохранять туда наш MP3 и только после этого запускать.
Посмотрим на пример кода для клиентской процедуры в управляемой форме:
&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
// Предполагается, что функция сфз_Сервер.ПолучитьФайлДляПроигрывания(ВыбраннаяСтрока)
// возвращает ДвоичныеДанные аудиофайла с сервера.
ДД = сфз_Сервер.ПолучитьФайлДляПроигрывания(ВыбраннаяСтрока);
// 1. Определяем путь к нашей изолированной папке.
Каталог = КаталогВременныхФайлов() + "\Player";
// 2. Проверяем, существует ли папка, и создаем ее при необходимости.
К = Новый Файл(Каталог);
Если НЕ К.Существует() Тогда
СоздатьКаталог(Каталог);
Иначе
// 3. Если папка уже есть, очищаем ее от старых mp3-файлов,
// чтобы не накапливать мусор.
Попытка
УдалитьФайлы(Каталог, "*.mp3");
Исключение
// Ошибку удаления можно обработать или проигнорировать.
КонецПопытки;
КонецЕсли;
// 4. Генерируем уникальное имя для нашего файла, чтобы избежать конфликтов.
УИ = Новый УникальныйИдентификатор();
РезИмяФайла = Каталог + "\" + Строка(УИ) + ".mp3";
// 5. Записываем двоичные данные в файл.
ДД.Записать(РезИмяФайла);
// 6. Запускаем приложение по умолчанию для mp3-файлов.
ЗапуститьПриложение(РезИмяФайла,,Ложь);
// Отключаем стандартную обработку события, чтобы 1С не выполняла лишних действий.
СтандартнаяОбработка = Ложь;
КонецПроцедуры
Разберем этот код по шагам:
КаталогВременныхФайлов() — функция 1С, которая возвращает путь к системной папке для временных файлов текущего пользователя.СоздатьКаталог() — создает указанный каталог, если его нет.УдалитьФайлы(Каталог, "*.mp3") — удаляет все файлы, соответствующие маске (в нашем случае — все старые MP3), из указанного каталога. Обернуто в Попытку, так как какой-то файл может быть заблокирован системой.Новый УникальныйИдентификатор() — гарантирует, что имя файла будет уникальным при каждом запуске, что предотвращает возможные конфликты.ДД.Записать(РезИмяФайла) — метод объекта ДвоичныеДанные, который сохраняет их содержимое в файл на диске.ЗапуститьПриложение() — команда для запуска файла с помощью ассоциированного с ним приложения в операционной системе.Важное замечание для многопользовательской работы. Данный код может вызвать проблемы в терминальном (RDP) режиме. Функция КаталогВременныхФайлов() вернет путь к временной папке профиля пользователя. Однако, если несколько сеансов одного и того же пользователя запустят этот код одновременно, они будут работать с одной и той же папкой \Player, что может привести к тому, что один сеанс удалит файл другого. Для повышения надежности в многопользовательской среде рекомендуется создавать еще более уникальный каталог, например, добавляя к нему идентификатор сеанса или другое уникальное значение.
Хотя создание отдельной папки решает проблему "здесь и сейчас", более правильным и универсальным подходом является управление метаданными самого MP3-файла.
В чем суть? Вместо того чтобы полагаться на окружение, в котором запускается файл, мы можем сами контролировать его содержимое. Это гарантирует, что файл будет отображаться корректно в любом плеере и на любом устройстве.
Есть два варианта:
Реализация этого метода непосредственно из 1С сложнее, так как требует использования внешних компонент или вызова утилит командной строки (например, ffmpeg или специализированных редакторов тегов), которые могут изменять метаданные MP3-файлов. Однако этот способ является наиболее профессиональным и избавляет от "костылей" с временными папками, обеспечивая предсказуемое поведение файлов в любой среде.
В итоге, выбор метода зависит от ваших задач. Для быстрого решения проблемы на рабочих местах пользователей отлично подойдет первый способ с созданием изолированного каталога. Если же вам требуется надежное и универсальное решение, стоит изучить возможность работы с метаданными аудиофайлов.