Как реализовать отправку HTTP-запросов GET и POST в 1С 7.7

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

В современной разработке на платформе 1С 7.7 часто возникает необходимость интеграции с внешними веб-сервисами через REST API. Несмотря на почтенный возраст платформы, она все еще позволяет выполнять сложные технические задачи, такие как отправка запросов GET и POST с использованием заголовков и авторизации — для этого есть готовая обработка отправки сообщений в Telegram для 1С 7.7. В этой статье мы подробно разберем, как использовать объект WinHttp.WinHttpRequest.5.1, обсудим нюансы кодировок, протоколов безопасности и рассмотрим альтернативные способы взаимодействия с внешними системами.

Метод 1: Использование системного объекта WinHttp.WinHttpRequest.5.1

Для начала рассмотрим базовый синтаксис работы с объектом WinHttp. Этот объект является частью операционной системы Windows и позволяет гибко настраивать параметры HTTP-сессии. Давайте проанализируем пример кода, который решает задачу автора по получению данных с API через запрос GET с передачей токена авторизации.

Разберем по шагам создание и инициализацию объекта:


// Создаем объект для работы с HTTP
WinHttp = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");

// Устанавливаем опцию автоматического определения кодировки
WinHttp.Option(2, "utf-8");

// Настраиваем таймауты (в миллисекундах): разрешение имени, соединение, отправка, ожидание ответа
// Значение 0 означает использование системных настроек по умолчанию
WinHttp.SetTimeouts(30000, 30000, 30000, 30000);

// Открываем соединение
// Первый параметр - тип запроса (GET, POST, PUT, DELETE)
// Второй параметр - полный URL ресурса
// Третий параметр - флаг асинхронности (0 - ожидаем ответа, 1 - работаем в фоне)
WinHttp.Open("GET", "https://api.qvalon.com/v1/orgstruct/divisions", 0);

// Добавляем заголовок авторизации Bearer
// Переменная your_token должна содержать актуальный ключ доступа
WinHttp.SetRequestHeader("Authorization", "Bearer " + your_token);

// Отправляем запрос. Для GET запроса тело обычно пустое
WinHttp.Send();

// Получаем ответ в виде текста
ТекстОтвета = WinHttp.ResponseText;
СтатусКод = WinHttp.Status;

Если СтатусКод = 200 Тогда
    Сообщить("Запрос выполнен успешно!");
    Сообщить(ТекстОтвета);
Иначе
    Сообщить("Ошибка запроса! Код: " + СтатусКод + " " + WinHttp.StatusText);
КонецЕсли;

Метод 2: Универсальная функция для сложных запросов

Если в вашей конфигурации требуется частое обращение к различным эндпоинтам, целесообразно вынести логику в отдельную функцию. Рассмотрим более продвинутый вариант, который включает обработку заголовков через СписокЗначений, работу с JSON и автоматическую обработку ошибок сервера (например, код 429 — слишком много запросов).

В данной реализации мы также добавим возможность "прикинуться браузером", установив соответствующий заголовок User-Agent. Это полезно, если сервер блокирует запросы от стандартных скриптовых движков.


Функция глHTPP_ВыполнитьЗапрос(ТипЗапроса="POST", Url, сзJSONЗапрос, КлючСессии="", сзЗаголовки="", СтрОшибка="") Экспорт
    Попытка 
        WinHttp = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
    Исключение
        Предупреждение("Не удалось создать объект WinHttp!");
        Возврат 0;
    КонецПопытки;    

    WinHttp.Option(2, "utf-8");
    // Устанавливаем таймауты
    WinHttp.SetTimeouts(0, 0, 0, 0);    
    
    // Формируем тело запроса, если передана структура JSON
    ЗапросJSON = "";
    Если ТипЗначенияСтр(сзJSONЗапрос) = "СписокЗначений" Тогда
        // Здесь должна быть ваша функция преобразования СпискаЗначений в строку JSON
        ЗапросJSON = ЗначениеВJSON(сзJSONЗапрос);
    КонецЕсли;
    
    // Открываем соединение в синхронном режиме
    WinHttp.Open(ТипЗапроса, Url, 0);
    
    // Устанавливаем базовые заголовки
    WinHttp.SetRequestHeader("Content-Type", "application/json"); 
    WinHttp.SetRequestHeader("Accept-Charset", "utf-8");
    
    // Авторизация
    Если ПустоеЗначение(КлючСессии) = 0 Тогда
        WinHttp.SetRequestHeader("Authorization", "Bearer " + КлючСессии);
    КонецЕсли;
    
    // Обработка дополнительных заголовков из списка
    Если ПустоеЗначение(сзЗаголовки) = 0 Тогда
        Для Сч = 1 По сзЗаголовки.РазмерСписка() Цикл
            ИмяЗаг = "";
            ЗначЗаг = сзЗаголовки.ПолучитьЗначение(Сч, ИмяЗаг);
            Если ПустоеЗначение(ИмяЗаг) = 0 Тогда
                WinHttp.SetRequestHeader(ИмяЗаг, ЗначЗаг);
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
    
    // Отправка данных
    Попытка
        WinHttp.Send(ЗапросJSON);
    Исключение
        СтрОшибка = ОписаниеОшибки();
        Возврат 0;
    КонецПопытки;
    
    Статус = WinHttp.Status;
    Ответ = WinHttp.ResponseText;
    
    // Обработка перенаправлений (307 Temporary Redirect)
    Если Статус = 307 Тогда
        НовыйUrl = WinHttp.GetResponseHeader("Location");
        Возврат глHTPP_ВыполнитьЗапрос(ТипЗапроса, НовыйUrl, сзJSONЗапрос, КлючСессии, сзЗаголовки, СтрОшибка);
    КонецЕсли;
    
    Возврат Ответ;
КонецФункции

Важные технические нюансы и решение проблем

Работа с современными API из старой платформы 1С 7.7 накладывает ряд ограничений, которые необходимо учитывать для стабильной работы.

1. Поддержка протоколов TLS 1.2 и выше. Это критический момент. Современные сервера часто запрещают соединения по протоколам SSL 3.0 и TLS 1.0. Поскольку объект WinHttp использует системные библиотеки Windows, на старых ОС (например, Windows 7) запросы могут обрываться с ошибкой соединения. Для решения этой проблемы убедитесь, что в системе установлены все обновления безопасности, и в реестре включена поддержка TLS 1.2. В коде можно попробовать принудительно установить опцию WinHttp.Option(9) (SecureProtocols), если это поддерживается вашей версией библиотеки.

2. Проблема кодировок (ANSI vs UTF-8). Платформа 1С 7.7 работает в кодировке Windows-1251. Если вам нужно отправить кириллицу в теле POST-запроса, простой передачи строки в метод Send() может быть недостаточно. В таких случаях мы рекомендуем использовать объект ADODB.Stream для предварительной конвертации строки в массив байтов в формате UTF-8.

3. Обработка JSON-ответов. 1С 7.7 не имеет встроенных средств для парсинга JSON. Вы можете использовать два пути:

  1. Использование регулярных выражений или функций работы со строками (подходит для простых структур).
  2. Использование объекта MSScriptControl.ScriptControl с языком JScript, чтобы превратить строку ответа в объект и обращаться к его полям.

Альтернативные решения

Если возможности WinHttp кажутся недостаточными или возникают неразрешимые проблемы с сертификатами, рассмотрим альтернативные подходы к отправке API запросов, два из которых, как упомянуто в публикации, работают на старых Windows:

Использование внешней компоненты curl1c.dll. Программисты часто называют её "Карлик". Она базируется на мощной библиотеке libcurl и снимает практически все ограничения по работе с протоколами шифрования, сложными типами запросов и передачей файлов (multipart/form-data). Стоит отметить, что существуют и другие полезные внешние компоненты для 1С 7.7, например, для отправки СМС сообщений через GSM модем.

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

Подводя итог, можно сказать, что 1С 7.7 вполне справляется с ролью HTTP-клиента. Выбор между стандартным WinHttp и внешними компонентами зависит от конкретных требований безопасности сервера, к которому вы подключаетесь, и сложности передаваемых данных.

← На главную