При интеграции устаревшей, но все еще активно используемой платформы 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, либо требует сложных системных настроек реестра для его включения.
Самый простой способ решения проблемы, не требующий установки сторонних компонент, заключается в явном использовании более новой версии библиотеки 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), нам потребуется более глубокая доработка, о которой мы поговорим ниже.
Если нативный метод по каким-то причинам не срабатывает (например, из-за специфических настроек прокси или сертификатов), профессиональное сообщество рекомендует использовать обертки над библиотекой cURL. Подобный подход часто применяется, когда настраивается отправка сообщений из 1С 7.7 в Viber или сложные интеграции с маркетплейсами.
Рассмотрим преимущества использования компоненты curl1c.dll:
Если же вам требуется максимально простое решение для односторонней связи, можно рассмотреть отправку сообщений через командную строку с помощью специализированных утилит.
Разберем пример кода для отправки запроса с использованием компоненты 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: " + РезультатЗапроса);
Сообщить("Детали: " + Карлик.Приемник.Данные);
КонецЕсли;
После того как мы наладили транспортный уровень (соединение проходит успешно), мы часто сталкиваемся со следующей проблемой. Сервер принимает запрос, но возвращает ошибку: {"ok": false, "description": "Invalid UTF-8 sequence"}. Это типичная ситуация при работе с Telegram-ботами, требующими строгого соблюдения стандарта Unicode.
Почему это происходит?
Платформа 1С:Предприятие 7.7 не является Unicode-системой. Все строки внутри нее хранятся в однобайтовой кодировке Windows-1251. Современные API ожидают данные исключительно в кодировке UTF-8.
Как решить?
Нам необходимо выполнить два действия перед отправкой данных:
В 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:
Msxml2.ServerXMLHTTP.6.0. Это включает поддержку TLS 1.2.encodeURIComponent перед вставкой кириллического текста в URL.Используя эти методы, вы сможете продлить жизнь решениям на платформе 1С 7.7 и успешно интегрировать их с современными цифровыми сервисами.