Как исправить ошибку безопасных каналов msxml3.dll и проблемы кодировки UTF-8 в 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При интеграции устаревшей, но все еще активно используемой платформы 1С:Предприятие 7.7 с современными веб-сервисами (API мессенджеров, маркетплейсов, государственных систем), разработчики часто сталкиваются с непреодолимыми на первый взгляд препятствиями. Особенно это актуально при внедрении разрешительного режима и работы с ИС «Честный знак» (удобнее через готовый инструмент для работы 1С 7.7 с ИС Честный ЗНАК), когда код, который годами работал на Windows Server 2003 или Windows XP, внезапно перестает функционировать после миграции на Windows Server 2016, 2019 или 2022.

В этой статье мы подробно разберем ситуацию, когда при попытке отправки данных возникает ошибка "msxml3.dll: Ошибка поддержки безопасных каналов", а также проанализируем, как корректно передавать кириллицу в современные API, требующие кодировку UTF-8.

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

Рассмотрим типичный сценарий. У нас есть код на 1С 7.7, который отправляет уведомления в Telegram (для этого подойдет готовое решение для отправки сообщений в Telegram из 1С 7.7) или, как в исходном примере, в ICQ Bot API. Код выглядит стандартно:


ТекстСообщения = "Проверка";
URL = "https://api.example.com/send?text=" + ТекстСообщения;
HTTPxml = СоздатьОбъект("Msxml2.ServerXMLHTTP");
HTTPxml.Open("GET", URL, 0);
HTTPxml.Send();

На современном сервере этот код падает с ошибкой в строке Send(). Текст ошибки указывает на библиотеку msxml3.dll и проблему с безопасными каналами.

Давайте выясним причину. Современные веб-сервисы и API в целях безопасности отключили поддержку старых протоколов шифрования (SSL 2.0, SSL 3.0, TLS 1.0, TLS 1.1) и требуют использования TLS 1.2 или выше. Объект, создаваемый по идентификатору Msxml2.ServerXMLHTTP, в старых версиях Windows и по умолчанию ссылается на третью версию библиотеки XML, которая либо не умеет работать с TLS 1.2, либо требует сложных системных настроек реестра для его включения.

Решение 1: Использование MSXML 6.0 (Нативный метод)

Самый простой способ решения проблемы, не требующий установки сторонних компонент, заключается в явном использовании более новой версии библиотеки MSXML, которая предустановлена во всех современных версиях Windows. Это решение критично для таких задач, как загрузка курсов валют с сайта НБУ или получение данных с сайта НБРБ по защищенному протоколу HTTPS.

Вместо создания объекта по умолчанию, нам необходимо указать конкретную версию — 6.0. Проанализируем, как изменится код:


// Было (вызывает ошибку на новых ОС):
// HTTPxml = СоздатьОбъект("Msxml2.ServerXMLHTTP");

// Стало (работает с TLS 1.2):
HTTPxml = СоздатьОбъект("Msxml2.ServerXMLHTTP.6.0");

// Далее код остается без изменений
HTTPxml.Open("GET", URL, 0);
HTTPxml.Send();

Это решение помогает восстановить соединение. Однако, если после успешного соединения сервер возвращает ошибку, связанную с форматом данных (например, Invalid UTF-8 sequence), нам потребуется более глубокая доработка, о которой мы поговорим ниже.

Решение 2: Использование внешней компоненты (curl1c.dll)

Если нативный метод по каким-то причинам не срабатывает (например, из-за специфических настроек прокси или сертификатов), профессиональное сообщество рекомендует использовать обертки над библиотекой cURL. Подобный подход часто применяется, когда настраивается отправка сообщений из 1С 7.7 в Viber или сложные интеграции с маркетплейсами.

Рассмотрим преимущества использования компоненты curl1c.dll:

  1. Независимость от системных библиотек Windows (IE, MSXML).
  2. Гибкая настройка заголовков и параметров запроса.
  3. Более детальная диагностика ошибок.

Если же вам требуется максимально простое решение для односторонней связи, можно рассмотреть отправку сообщений через командную строку с помощью специализированных утилит.

Разберем пример кода для отправки запроса с использованием компоненты curl1c.dll:


URL = "https://api.icq.net/bot/v1/messages/sendText?token=ВАШ_ТОКЕН&chatId=ID_ЧАТА&text=Сообщение";

Если ЗагрузитьВнешнююКомпоненту("curl1c.dll") = 1 Тогда
    Карлик = СоздатьОбъект("Карлик");    
    Сообщить("Компонента загружена", "!");
Иначе    
    Сообщить("Ошибка загрузки компоненты curl1c.dll", "!");
    Возврат;
КонецЕсли;

// Настройка параметров соединения
Карлик.УстановитьПараметр("TIMEOUT", 30); // Таймаут в секундах
Карлик.УстановитьПараметр("URL", URL);    
Карлик.УстановитьПараметр("CUSTOMREQUEST", "GET"); // Метод запроса

// Настройка заголовков (очень важно для API)
Карлик.УстановитьПараметр("HTTPHEADER", "Cache-Control: no-cache");
Карлик.УстановитьПараметр("HTTPHEADER", "Accept: application/json");

// Указываем, что результат хотим получить в память (строку), а не в файл
Карлик.Приемник.Тип = 0; 

// Выполняем запрос
РезультатЗапроса = Карлик.Выполнить();

// Анализируем ответ
Если РезультатЗапроса = 200 Тогда
    ОтветСервера = Карлик.Приемник.Данные;
    Сообщить("Успех: " + ОтветСервера);
Иначе
    Сообщить("Ошибка HTTP: " + РезультатЗапроса);
    Сообщить("Детали: " + Карлик.Приемник.Данные);
КонецЕсли;

Проблема кодировки: "Invalid UTF-8 sequence"

После того как мы наладили транспортный уровень (соединение проходит успешно), мы часто сталкиваемся со следующей проблемой. Сервер принимает запрос, но возвращает ошибку: {"ok": false, "description": "Invalid UTF-8 sequence"}. Это типичная ситуация при работе с Telegram-ботами, требующими строгого соблюдения стандарта Unicode.

Почему это происходит?
Платформа 1С:Предприятие 7.7 не является Unicode-системой. Все строки внутри нее хранятся в однобайтовой кодировке Windows-1251. Современные API ожидают данные исключительно в кодировке UTF-8.

Как решить?
Нам необходимо выполнить два действия перед отправкой данных:

  1. Конвертировать строку из Windows-1251 в UTF-8.
  2. Выполнить URL-кодирование (Percent-encoding) полученной строки.

В 1С 7.7 нет встроенных функций для этого, поэтому мы воспользуемся MSScriptControl.ScriptControl для URL-кодирования. Рассмотрим готовую функцию:


Функция URLEncode(Знач ВходнаяСтрока)
    Попытка
        Скрипт = СоздатьОбъект("MSScriptControl.ScriptControl");
        Скрипт.Language = "JScript";
    Исключение
        Сообщить("Не удалось создать MSScriptControl");
        Возврат ВходнаяСтрока;
    КонецПопытки;

    Результат = Скрипт.Eval("encodeURIComponent('" + ВходнаяСтрока + "')");
    Возврат Результат;
КонецФункции

Итоговый пример для отправки сообщения через Msxml2.ServerXMLHTTP.6.0:


Функция ОтправитьСообщение(ТекстСообщения)
    URL = "https://api.icq.net/bot/v1/messages/sendText";
    URL = URL + "?token=ВАШ_ТОКЕН&chatId=ID_ЧАТА"; 
    
    HTTP = СоздатьОбъект("Msxml2.ServerXMLHTTP.6.0");
    
    Скрипт = СоздатьОбъект("MSScriptControl.ScriptControl");
    Скрипт.Language = "JScript";
    КодированныйТекст = Скрипт.Eval("encodeURIComponent('" + ТекстСообщения + "')");
    
    ПолныйURL = URL + "&text=" + КодированныйТекст;
    
    Попытка
        HTTP.Open("GET", ПолныйURL, 0);
        HTTP.Send();
        Если HTTP.Status = 200 Тогда
            Сообщить("Сообщение отправлено успешно!");
            Возврат 1;
        Иначе
            Сообщить("Ошибка: " + HTTP.Status + " " + HTTP.responseText);
        КонецЕсли;
    Исключение
        Сообщить("Не удалось выполнить запрос: " + ОписаниеОшибки());
    КонецПопытки;
    Возврат 0;
КонецФункции

Выводы

Подведем итоги нашей работы по устранению неисправностей, которые часто встречаются при реализации различных вариантов отправки API-запросов из 1С 7.7:

  1. Ошибка msxml3.dll решается заменой объекта на Msxml2.ServerXMLHTTP.6.0. Это включает поддержку TLS 1.2.
  2. Для альтернативного подключения можно использовать внешнюю компоненту curl1c.dll или внешние скрипты.
  3. Ошибка Invalid UTF-8 sequence решается применением функции encodeURIComponent перед вставкой кириллического текста в URL.

Используя эти методы, вы сможете продлить жизнь решениям на платформе 1С 7.7 и успешно интегрировать их с современными цифровыми сервисами.

← На главную