При разработке интерактивных интерфейсов в 1С часто возникает задача вывода медиаконтента непосредственно на форму. Это может быть обучающий ролик, запись работы оборудования или видеоинструкция для пользователя. Использование встроенного «Поля HTML-документа» кажется самым простым и логичным решением: достаточно написать базовый HTML5-код с тегом <video> и передать его в форму.
Однако на практике разработчики сталкиваются с серьезным препятствием, когда пользователи начинают работать в терминальном режиме через удаленный рабочий стол (RDP). На локальном компьютере программиста видео воспроизводится отлично, но в сессии RDP вместо видеоролика отображается пустой экран с бесконечной надписью «Loading...» или ошибкой воспроизведения. При этом в обычном браузере на том же терминальном сервере этот файл открывается без проблем.
В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем внутренние механизмы работы платформы 1С и протокола RDP, а также рассмотрим рабочие практические решения, включая использование компоненты ActiveX (Windows Media Player) и альтернативные методы настройки веб-компонентов.
---
Прежде чем переходить к коду, давайте разберемся в физике процесса. Проблема кроется на стыке трех технологий: движка отображения HTML в 1С, доступных системных кодеков операционной системы и специфики передачи графики по протоколу RDP.
Рассмотрим основные факторы, которые мешают стандартному воспроизведению:
---
Наиболее надежным и проверенным решением для обычных форм 1С в терминальной среде является отказ от стандартного тега HTML5 <video> в пользу интеграции системного плеера через технологию ActiveX. Мы будем использовать стандартный объект Windows Media Player (WMPlayer.OCX).
Почему это решает проблему RDP? В протокол удаленного рабочего стола Microsoft встроила специальную оптимизацию — Мультимедийное перенаправление (Multimedia Redirection). Когда система видит, что видео воспроизводится через системный Windows Media Player (даже если он встроен как ActiveX в другое приложение), сервер не декодирует видео самостоятельно. Он перенаправляет *исходный сжатый файл/поток* на локальный компьютер клиента RDP. Локальный компьютер пользователя, используя аппаратные мощности своей видеокарты, сам декодирует и плавно воспроизводит видео.
Давайте разберем по шагам, как реализовать этот метод в коде 1С.
Сначала подготовим HTML-код для встраивания плеера. Нам потребуется использовать тег <object> с указанием уникального идентификатора класса (CLSID) Windows Media Player.
Проанализируем пример кода для формирования текста HTML-документа:
// Формируем путь к файлу видео.
// Важно: путь должен быть полным (сетевым UNC или локальным для сервера)
ПутьКФайлу = "\\server-storage\video\instruction.mp4";
// Выполняем обязательную транслитерацию имени файла и очистку пути (подробнее ниже)
БезопасныйПуть = ПодготовитьПутьКФайлу(ПутьКФайлу);
ТекстДокумента = "<html>
| <head>
| <meta http-equiv='X-UA-Compatible' content='IE=Edge'/>
| <style>
| html, body {
| margin: 0;
| padding: 0;
| width: 100%;
| height: 100%;
| overflow: hidden;
| background-color: #000000;
| }
| </style>
| </head>
| <body>
| <object id='WindowsMediaPlayer'
| classid='CLSID:6BF52A52-394A-11D3-B153-00C04F79FAA6'
| width='100%'
| height='100%'>
| <param name='URL' value='" + БезопасныйПуть + "'>
| <param name='autoStart' value='true'>
| <param name='uiMode' value='full'>
| <param name='stretchToFit' value='true'>
| <embed type='application/x-mplayer2'
| src='" + БезопасныйПуть + "'
| width='100%'
| height='100%'
| autostart='true'>
| </embed>
| </object>
| </body>
|</html>";
// Записываем сформированный текст в элемент формы "ПолеВидео" (тип: ПолеHTMLДокумента)
ЭлементыФормы.ПолеВидео.УстановитьТекст(ТекстДокумента);
В данном примере мы используем современный идентификатор класса CLSID:6BF52A52-394A-11D3-B153-00C04F79FAA6, который гарантирует запуск актуальной версии проигрывателя Windows Media на стороне клиента. Параметр stretchToFit со значением true автоматически масштабирует видео под размеры поля на форме 1С.
---
При использовании WMPlayer.OCX в качестве ActiveX-компонента разработчики часто сталкиваются со следующей проблемой: если в пути к видеофайлу или в его названии содержатся русские буквы (кириллица), пробелы или специфические символы, плеер выдает ошибку воспроизведения или молча игнорирует запуск.
Это происходит из-за особенностей передачи параметров в COM-объект плеера. Чтобы решить эту проблему раз и навсегда, рекомендуется:
Инструкция.mp4 сохранять как Instrukciya.mp4).%20).Рассмотрим пример простейшей функции для транслитерации имени файла перед его записью на сервер хранения:
Функция ТранслитерироватьСтроку(Знач ИсходнаяСтрока) Экспорт
СоответствиеСимволов = Новый Соответствие;
СоответствиеСимволов.Вставить("а", "a"); СоответствиеСимволов.Вставить("б", "b");
СоответствиеСимволов.Вставить("в", "v"); СоответствиеСимволов.Вставить("г", "g");
СоответствиеСимволов.Вставить("д", "d"); СоответствиеСимволов.Вставить("е", "e");
СоответствиеСимволов.Вставить("ё", "yo"); СоответствиеСимволов.Вставить("ж", "zh");
СоответствиеСимволов.Вставить("з", "z"); СоответствиеСимволов.Вставить("и", "i");
СоответствиеСимволов.Вставить("й", "y"); СоответствиеСимволов.Вставить("к", "k");
СоответствиеСимволов.Вставить("л", "l"); СоответствиеСимволов.Вставить("м", "m");
СоответствиеСимволов.Вставить("н", "n"); СоответствиеСимволов.Вставить("о", "o");
СоответствиеСимволов.Вставить("п", "p"); СоответствиеСимволов.Вставить("р", "r");
СоответствиеСимволов.Вставить("с", "s"); СоответствиеСимволов.Вставить("т", "t");
СоответствиеСимволов.Вставить("у", "u"); СоответствиеСимволов.Вставить("ф", "f");
СоответствиеСимволов.Вставить("х", "kh"); СоответствиеСимволов.Вставить("ц", "ts");
СоответствиеСимволов.Вставить("ч", "ch"); СоответствиеСимволов.Вставить("ш", "sh");
СоответствиеСимволов.Вставить("щ", "sch"); СоответствиеСимволов.Вставить("ъ", "");
СоответствиеСимволов.Вставить("ы", "y"); СоответствиеСимволов.Вставить("ь", "");
СоответствиеСимволов.Вставить("э", "e"); СоответствиеСимволов.Вставить("ю", "yu");
СоответствиеСимволов.Вставить("я", "ya"); СоответствиеСимволов.Вставить(" ", "_");
Результат = "";
Для Индекс = 1 По СтрДлина(ИсходнаяСтрока) Цикл
Символ = Сред(ИсходнаяСтрока, Индекс, 1);
НижнийСимвол = НРег(Символ);
НайденноеЗначение = СоответствиеСимволов.Получить(НижнийСимвол);
Если НайденноеЗначение <> Неопределено Тогда
// Сохраняем регистр исходного символа
Если Символ = ВРег(Символ) Тогда
Результат = Результат + ВРег(НайденноеЗначение);
Иначе
Результат = Результат + НайденноеЗначение;
КонецЕсли;
Иначе
Результат = Результат + Символ;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
---
Если вы хотите сохранить современную верстку HTML5 без использования устаревающего ActiveX, вам придется прибегнуть к помощи системного администратора для тонкой настройки групповых политик (GPO) на терминальном сервере.
Проанализируем шаги по оптимизации RDP-сервера для воспроизведения видео:
gpedit.msc) на сервере перейдите по пути: Конфигурация компьютера -> Административные шаблоны -> Компоненты Windows -> Службы удаленных рабочих столов -> Узел сеансов удаленных рабочих столов -> Перенаправление устройств и ресурсов. Убедитесь, что параметр «Разрешить перенаправление воспроизведения аудио и видео» установлен в состояние «Включено».---
Для конфигураций на управляемых формах и платформ версии 8.3.20+ использование ActiveX не всегда оправданно или возможно (например, если клиенты работают под Linux или через Web-клиент в браузере). В таком случае мы можем задействовать штатный WebKit 1С, но обойти ограничения на работу с файлами.
Проанализируем две важные технические особенности:
А. Использование кроссплатформенных свободных форматов видео. Поскольку проприетарный кодек H.264 (MP4) может не поддерживаться встроенным движком Chromium в 1С на сервере, попробуйте конвертировать ваши видеоматериалы в открытые форматы WebM (кодеки VP8/VP9) или Ogg. Эти форматы поддерживаются движком WebKit «из коробки» на любой операционной системе без необходимости установки сторонних кодеков.
Б. Воспроизведение через Временное хранилище. Начиная со средних релизов платформы 8.3, из соображений безопасности «Поле HTML-документа» не имеет прямого доступа к файловой системе компьютера (особенно к сетевым путям \\server\). Попытка указать в теге <video> прямой путь к файлу приведет к ошибке безопасности.
Чтобы обойти это ограничение, мы должны предварительно поместить двоичные данные видеофайла во Временное хранилище 1С, получить уникальную навигационную ссылку и использовать ее в HTML. Посмотрим, как это выглядит на практике:
&НаКлиенте
Процедура ВоспроизвестиВидео()
// Получаем двоичные данные видеофайла (например, из присоединенных файлов)
ДвоичныеДанныеВидео = ПолучитьДвоичныеДанныеВидеоНаСервере();
// Помещаем данные во временное хранилище и получаем навигационную ссылку
АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанныеВидео, УникальныйИдентификатор);
// Формируем HTML. Платформа 1С автоматически подставит данные по ссылке e1cib/tempstore
ТекстHTML = "<html>
|<body>
| <video width='100%' height='100%' controls autoplay>
| <source src='" + АдресХранилища + "' type='video/webm'>
| Ваш браузер не поддерживает воспроизведение видео.
| </video>
|</body>
|</html>";
// Записываем в реквизит формы, связанный с Полем HTML-документа
ПолеHTML_Данные = ТекстHTML;
КонецПроцедуры
Этот метод гарантирует безопасность выполнения кода, избавляет от проблем с разграничением прав доступа к сетевым дискам на терминальном сервере и обеспечивает кроссплатформенность решения.
---
Выбор конкретного метода зависит от архитектуры вашей информационной системы:
e1cib/tempstore). Это избавит вас от зависимости от системного плеера Windows и сделает систему стабильной и безопасной.