Почему не работает JS код и аудио в HTML-поле 1С на Windows Server 2012 (Ошибка SSL)

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

В процессе интеграции 1С с внешними мессенджерами (например, WhatsApp через сервисы вроде Wazzup) мы часто используем поле HTML документа для отображения чатов или проигрывания голосовых сообщений. Это позволяет создать удобный интерфейс прямо внутри формы 1С. Однако при развертывании решения на разных серверах можно столкнуться с ситуацией, когда на локальной машине или свежем сервере (Windows Server 2019/2022) все работает идеально, а на устаревающем Windows Server 2012 R2 функционал отказывает.

В этой статье мы подробно разберем проблему, когда JavaScript-код плеера аудио не отрабатывает, иконка воспроизведения не появляется, а при попытке диагностики мы получаем ошибку соединения. Проанализируем причины, связанные с движком WebKit, протоколами безопасности SSL/TLS и найдем эффективные пути решения.

Симптомы проблемы и диагностика

Рассмотрим ситуацию: у нас есть форма в 1С, на которой размещено поле HTML документа. В это поле мы программно загружаем HTML-код, содержащий JavaScript-плеер (например, Green Audio Player) для прослушивания голосовых сообщений. Ссылки на аудиофайлы ведут на внешний ресурс (сервер провайдера API).

Мы наблюдаем следующее поведение:

  1. На компьютере разработчика и на Windows Server 2019 плеер инициализируется, появляется кнопка Play, отображается длительность трека.
  2. При запуске той же конфигурации через терминальный доступ (RDP) на Windows Server 2012 плеер не отображается. JavaScript, отвечающий за его отрисовку, либо падает с ошибкой, либо не может загрузить ресурс.
  3. Звук через RDP может не работать даже в системном плеере (Windows Media Player), что наводит на мысль о проблемах с пробросом звука, но основная проблема кроется глубже.

Первое, что нам нужно сделать — исключить влияние Internet Explorer. Начиная с определенных версий платформы 1С:Предприятие 8.3 (например, 8.3.14+ и новее), поле HTML документа использует движок WebKit, а не движок IE (Trident), даже если в системе установлен старый IE. Однако, WebKit внутри 1С все равно опирается на системные библиотеки Windows для работы с сетью.

Чтобы точно определить причину, попробуем внутри 1С в поле HTML открыть простую картинку с того же внешнего ресурса, где хранятся аудиофайлы. Если вместо картинки или плеера мы получаем сообщение об ошибке, похожее на:

SSL connect error

...значит, проблема не в JavaScript и не в звуковой карте, а в установке защищенного соединения. Для понимания основ взаимодействия с веб-серверами полезно пройти курс по работе с HTTP-запросами.

Техническая причина: Протоколы TLS и старые ОС

Давайте разберемся, почему возникает ошибка SSL. Современные веб-сервисы и API активно переходят на использование протоколов шифрования TLS 1.2 и TLS 1.3. Это делается для безопасности передаваемых данных. Если сервер, на котором размещены файлы (в нашем случае Wazzup), настроен принимать соединения только по современным протоколам, клиент обязан их поддерживать.

Здесь кроется ключевое отличие между операционными системами:

В результате, когда JavaScript внутри поля HTML пытается загрузить аудиофайл по ссылке https://..., сетевой стек ОС разрывает соединение, так как не может проверить сертификат или согласовать протокол шифрования. Скрипт получает ошибку загрузки ресурса и прекращает выполнение, из-за чего интерфейс плеера не отрисовывается.

Решение 1: Административное (Обновление сервера)

Если у вас есть права системного администратора, можно попытаться "реанимировать" сетевой стек сервера. Однако это не гарантирует 100% успеха, если внешний сервис требует именно TLS 1.3.

Необходимо выполнить следующие действия:

  1. Установить все последние обновления Windows на сервер.
  2. Обновить списки корневых сертификатов. Часто ошибка SSL возникает из-за того, что сервер "не знает" о новых центрах сертификации (например, Let's Encrypt ISRG Root X1).
  3. Включить протоколы TLS 1.1 и TLS 1.2 в реестре Windows. Для этого удобно использовать утилиту IIS Crypto или править ветки реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols вручную.

Этот путь сложен тем, что требует перезагрузки боевого сервера и вмешательства в настройки ОС, что не всегда доступно 1С-программисту.

Решение 2: Программное (Использование Base64)

Наиболее надежным способом, который позволяет обойти ограничения сетевого стека клиентской машины (в данном случае терминального сервера), является отказ от прямой загрузки файлов браузером по ссылке. Вместо этого мы передадим аудиоданные непосредственно в теле HTML-страницы.

Суть метода заключается в следующем:

  1. Сервер 1С (или код на сервере) скачивает аудиофайл. Обычно серверный слой 1С или само серверное оборудование обновлено лучше, либо настройки HTTPСоединение позволяют игнорировать ошибки сертификатов (хотя это и не рекомендуется, но возможно через SslКонтекст).
  2. Аудиофайл конвертируется в строку формата Base64.
  3. Эта строка подставляется в атрибут src тега audio.

В этом случае движку WebKit не нужно устанавливать сетевое соединение с внешним сервером Wazzup. Данные уже находятся в памяти. Рассмотрим реализацию этого метода подробнее.

Шаг 1. Получение данных и конвертация в Base64

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


// Пример функции на языке 1С для получения Base64 строки аудио
Функция ПолучитьАудиоКакBase64(URLФайла)
    
    // 1. Скачиваем файл (упрощенно)
    // В реальном коде нужно парсить URL, чтобы выделить сервер и путь
    Соединение = Новый HTTPСоединение("server.wazzup.com", 443,,,,, Новый ЗащищенноеСоединениеOpenSSL);
    Запрос = Новый HTTPЗапрос("/path/to/audio.mp3");
    Ответ = Соединение.Получить(Запрос);
    
    Если Ответ.КодСостояния = 200 Тогда
        ДвоичныеДанные = Ответ.ПолучитьТелоКакДвоичныеДанные();
    Иначе
        Возврат "";
    КонецЕсли;

    // 2. Конвертируем в Base64
    СтрокаBase64 = Base64Строка(ДвоичныеДанные);
    
    // Удаляем переносы строк, которые добавляет функция Base64Строка,
    // так как в HTML src это может вызвать проблемы
    СтрокаBase64 = СтрЗаменить(СтрокаBase64, Символы.ПС, "");
    СтрокаBase64 = СтрЗаменить(СтрокаBase64, Символы.ВК, "");
    
    // 3. Формируем готовый Data URI
    // Обратите внимание на MIME-тип: для mp3 это audio/mpeg, для ogg - audio/ogg
    Возврат "data:audio/mpeg;base64," + СтрокаBase64;
    
КонецФункции

Шаг 2. Формирование HTML

Теперь, когда у нас есть строка с данными, мы формируем HTML-код для поля, используя возможности поля HTML документа. Вместо URL мы вставляем нашу строку.


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    URLАудио = "https://app.wazzup24.com/some-audio.mp3"; // Исходная ссылка
    ИсточникАудио = ПолучитьАудиоКакBase64(URLАудио);
    
    Если ЗначениеЗаполнено(ИсточникАудио) Тогда
        
        HTMLТекст = "
        |<!DOCTYPE html>
        |<html>
        |<body>
        |   <h3>Прослушивание записи</h3>
        |   <audio controls>
        |       <source src='" + ИсточникАудио + "' type='audio/mpeg'>
        |       Ваш браузер не поддерживает элемент audio.
        |   </audio>
        |</body>
        |</html>";
        
    Иначе
        HTMLТекст = "Не удалось загрузить аудио";
    КонецЕсли;
    
КонецПроцедуры

Важные нюансы реализации

При использовании метода с Base64 следует учитывать несколько моментов:

  1. Потребление памяти: Строка Base64 занимает примерно на 33% больше места, чем исходный бинарный файл. Если голосовые сообщения короткие (до 5-10 Мб), это не критично. Но загружать так часовые совещания не стоит — это может привести к зависанию клиента 1С ("белый экран" в поле HTML).
  2. Кэширование: При прямой ссылке браузер может кэшировать файл. При встраивании Base64 данные загружаются каждый раз заново вместе с формой.
  3. Тип файла: Обязательно указывайте правильный MIME-тип (audio/mpeg для MP3, audio/ogg для OGG, audio/wav для WAV). Если MIME-тип будет неверным, плеер может не запуститься.

Заключение

Проблема неработоспособности JS-кода и мультимедиа в 1С на старых серверных ОС чаще всего кроется не в самом коде (ошибки синтаксиса), а в уровне сетевого взаимодействия. Windows Server 2012 становится "узким горлышком" для современных безопасных соединений.

Переход на передачу контента через Base64 позволяет полностью исключить сетевое взаимодействие между клиентским экземпляром WebKit и внешним сервером, переложив задачу получения данных на серверный код 1С, который легче контролировать и отлаживать. Это решение является наиболее устойчивым и универсальным для разнородного парка машин пользователей.

← На главную