При автоматизации бизнес-процессов, связанных с хранением мультимедиа-контента — например, при ведении лога телефонных звонков или обработке аудиозаписей — часто возникает необходимость программно получить расширенные атрибуты файлов. К таким атрибутам относятся не только размер и дата изменения, но и специфические теги: продолжительность, битрейт, автор, название трека и другие метаданные, которые мы привыкли видеть в проводнике Windows.
В этой статье мы подробно разберем несколько подходов к решению этой задачи в среде 1С:Предприятие, начиная от использования системных COM-объектов и заканчивая современными методами работы с двоичными данными.
Проанализируем наиболее доступный способ, который работает в операционных системах Windows без установки дополнительного программного обеспечения. Мы воспользуемся интерфейсом Shell.Application, который позволяет обращаться к возможностям системного проводника (Explorer).
Рассмотрим по шагам реализацию этого метода. Нам потребуется создать объект Новый COMОбъект("Shell.Application"), получить доступ к каталогу с файлом и извлечь свойства конкретного элемента.
Посмотрим на пример кода, который позволяет перебрать первые 300 возможных атрибутов файла и вывести их значения:
// Определим путь к файлу и его имя отдельно
ФайлОбъект = Новый Файл("C:\Records\call_2023_10_27.mp3");
ИмяФайла = ФайлОбъект.Имя;
КаталогФайла = ФайлОбъект.Путь;
// Инициализируем COM-объект Shell
Shell = Новый COMОбъект("Shell.Application");
// Получаем объект папки (Namespace)
Folder = Shell.Namespace(КаталогФайла);
// Находим объект файла внутри папки
FolderItem = Folder.ParseName(ИмяФайла);
// Перебираем индексы свойств
Для Сч = 0 По 300 Цикл
ЗначениеСвойства = Folder.GetDetailsOf(FolderItem, Сч);
Если ЗначениеЗаполнено(ЗначениеСвойства) Тогда
Сообщить("Индекс " + Сч + ": " + ЗначениеСвойства);
КонецЕсли;
КонецЦикла;
Важное замечание: Метод GetDetailsOf возвращает строковое представление свойств. Индекс свойства "Продолжительность" может меняться в зависимости от версии Windows. Например, в Windows 7 это может быть индекс 21, а в Windows 10 — 27. Для обеспечения универсальности кода рекомендуется сначала определить индекс программно, найдя колонку с заголовком "Продолжительность" или "Duration".
Если ваша конфигурация работает на платформе 8.3.9 и выше, мы можем использовать современные механизмы работы с бинарными данными. Это более производительный метод, так как он не требует инициализации тяжелых COM-объектов. Выясним, как это работает на практике.
Информация о длительности и метаданных MP3 обычно хранится в тегах ID3v1 или ID3v2. Разберем логику: нам нужно прочитать заголовок файла, найти соответствующие фреймы и интерпретировать их. Для простых случаев (постоянный битрейт — CBR) длительность можно вычислить по формуле: РазмерФайла / Битрейт. Однако для файлов с переменным битрейтом (VBR) такой метод будет неточным.
Проанализируем пример открытия потока для чтения данных:
ИмяФайла = "C:\Music\track.mp3";
ФайлПоток = Новый ФайловыйПоток(ИмяФайла, РежимОткрытияФайла.Открыть, ДоступКФайлу.Чтение);
ЧтениеДанных = Новый ЧтениеДанных(ФайлПоток);
// Читаем первые 10 байт заголовка ID3v2
ДанныеЗаголовка = ЧтениеДанных.Прочитать(10);
// Далее следует логика парсинга байтов в соответствии со спецификацией ID3
// ...
ФайлПоток.Закрыть();
Этот способ требует глубокого понимания структуры MP3-файла (фреймы, синхробезопасное кодирование), но он является самым быстрым и кроссплатформенным (при использовании на Linux-серверах).
Когда требуется высокая точность и обработка большого количества файлов, профессионалы рекомендуют использовать специализированные консольные утилиты. Рассмотрим работу с MediaInfo CLI. Эта программа умеет отдавать техническую информацию в структурированном виде (XML или JSON).
Разберем алгоритм совместной работы 1С и внешней утилиты:
ЗапуститьПриложение с передачей параметров командной строки.Пример команды для получения данных:
mediainfo.exe --Output=XML "C:\file.mp3" > "C:\result.xml"
В полученном XML-файле будет содержаться тег Duration, значение которого указано в миллисекундах, что очень удобно для ведения математического учета в базе данных.
Подведем итог и выберем оптимальное решение в зависимости от ситуации:
При использовании метода из Сообщения 16 (Shell), помните, что результат возвращается в формате "ЧЧ:ММ:СС". Чтобы перевести это в секунды для отчета, используйте функцию РазложитьСтрокуВМассивПодстрок и простую арифметику: Часы * 3600 + Минуты * 60 + Секунды.