Как отправлять HTTP-запросы и обрабатывать JSON-ответы REST API в 1С 7.7?

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

При интеграции устаревшей платформы 1С:Предприятие 7.7 с современными веб-сервисами и интернет-магазинами разработчики часто сталкиваются со специфическими трудностями. В платформе 1С 7.7 отсутствуют встроенные объекты для работы с протоколом HTTP, нет нативных средств сериализации/десериализации формата JSON, а также встроенных функций для вычисления криптографических хэшей (например, MD5). Разберем по шагам, как правильно настроить подключение через COM-объекты Windows, устранить типичные ошибки маршрутизации (включая статус 404) и прочитать полученные структуры данных.

Выясним причину возникновения ошибки 404 при обращении к API

Когда при выполнении метода Open и Send через объект WinHttp.WinHttpRequest.5.1 сервер возвращает статус 404 Not Found, проблема чаще всего заключается в неправильном формировании URI запроса или неверных параметрах авторизации. Проанализируем ключевые нюансы:

  1. Неверная структура маршрута: Во многих REST API методы разделены по пространствам имен. Например, для получения списка заказов правильный адрес может иметь вид /cp/orders/list или /cp/ts/orders/list, тогда как прямое обращение к корню /orders/ приводит к ошибке 404, так как данный маршрут не зарегистрирован на веб-сервере.
  2. Формат передачи пароля: Параметр авторизации (например, userpsw) нередко ожидает не открытый текст пароля, а его MD5-хэш в нижнем регистре (32 символа). Если передать пароль в открытом виде, сервер может отклонить маршрутизацию запроса.
  3. Протокол передачи данных: Современные сервисы требуют обязательного использования защищенного соединения HTTPS. Запросы по протоколу HTTP могут автоматически блокироваться или вызывать сбои.

Шаг 1. Отправка GET-запроса через WinHttp и корректное чтение кодировки UTF-8

Рассмотрим, как отправить запрос к API и правильно прочитать полученный ответ. Большинство современных веб-серверов возвращают данные в кодировке UTF-8. Если использовать стандартное свойство ResponseText объекта WinHttp или указать кодировку Windows-1251, кириллический текст превратится в нечитаемые символы. Чтобы этого избежать, воспользуемся чтением бинарного ответа ResponseBody через COM-объект ADODB.Stream.

Посмотрим на пример функции отправки запроса и получения строки JSON:


Функция ВыполнитьЗапросAPI(URL)
    Перем WinHttp, Стрим, ОтветJSON;
    
    WinHttp = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
    // Включение поддержки современных протоколов TLS (флаг SecureProtocols)
    WinHttp.Option(9, 2048); 
    
    // Открываем GET-запрос в синхронном режиме (0)
    WinHttp.Open("GET", URL, 0);
    WinHttp.Send();
    
    Если WinHttp.Status <> 200 Тогда
        Сообщить("Ошибка запроса! Код ответа сервера: " + WinHttp.Status + " (" + WinHttp.StatusText + ")");
        Возврат "";
    КонецЕсли;
    
    // Чтение бинарного ответа в кодировке UTF-8 с помощью ADODB.Stream
    Стрим = СоздатьОбъект("ADODB.Stream");
    Стрим.Type = 1; // adTypeBinary
    Стрим.Mode = 3; // adModeReadWrite
    Стрим.Open();
    Стрим.Write(WinHttp.ResponseBody);
    Стрим.Position = 0;
    
    Стрим.Type = 2; // adTypeText
    Стрим.Charset = "utf-8";
    ОтветJSON = Стрим.ReadText();
    Стрим.Close();
    
    Возврат ОтветJSON;
КонецФункции

Шаг 2. Парсинг ответа JSON через MSScriptControl

Разберем подробнее, как разобрать строку JSON в 1С 7.7 без использования сторонних платных компонент. Самый доступный способ — использование системного компонента MSScriptControl.ScriptControl с движком jscript.

Посмотрим, как извлечь общее количество элементов (count) и перебрать массив заказов (items), записав полученные данные в ТаблицуЗначений:


Процедура ОбработатьОтветJSON(СтрокаJSON)
    Перем СК, ОбъектОтвета, ТЗ, КолвоЗаказов, МассивЗаказов, Инд, Заказ;
    
    Если ПустаяСтрока(СтрокаJSON) = 1 Тогда
        Возврат;
    КонецЕсли;
    
    СК = СоздатьОбъект("MSScriptControl.ScriptControl");
    СК.Language = "jscript";
    
    Попытка
        // Разбираем JSON-строку в объект JavaScript
        СК.AddCode("function parseJson(str) { return eval('(' + str + ')'); }");
        ОбъектОтвета = СК.Run("parseJson", СтрокаJSON);
    Исключение
        Сообщить("Не удалось разобрать JSON-ответ сервера: " + ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    
    // Получаем количество заказов
    КолвоЗаказов = ОбъектОтвета.count;
    Сообщить("Всего заказов получено: " + Строка(КолвоЗаказов));
    
    // Создаем ТаблицуЗначений для размещения данных в 1С
    ТЗ = СоздатьОбъект("ТаблицаЗначений");
    ТЗ.НоваяКолонка("НомерЗаказа");
    ТЗ.НоваяКолонка("Сумма");
    ТЗ.НоваяКолонка("Статус");
    
    МассивЗаказов = ОбъектОтвета.items;
    
    // Перебираем массив элементов
    Для Инд = 0 По МассивЗаказов.length - 1 Цикл
        Заказ = МассивЗаказов.item(Инд);
        
        ТЗ.НоваяСтрока();
        ТЗ.НомерЗаказа = Заказ.number;
        ТЗ.Сумма       = Заказ.summ;
        ТЗ.Статус      = Заказ.status;
    КонецЦикла;
    
    Сообщить("Обработка завершена. Загружено строк: " + ТЗ.КоличествоСтрок());
КонецПроцедуры

Альтернативные варианты интеграции

Проанализируем другие подходы, если стандартных COM-объектов операционной системы недостаточно:

  1. Консольная утилита cURL: Вызов утилиты командной строки Windows для отправки запроса с сохранением результата в файл на диске. Это позволяет прозрачно работать со сложными сертификатами и протоколами TLS.
  2. Внешние компоненты для 1С 7.7: Использование специализированных библиотек, реализующих прямой HTTP(S)-клиент и функции быстрого парсинга JSON на уровне нативного C++ кода.
  3. Промежуточный микросервис (прокси): Создание отдельного скрипта-посредника (например, на Python или PHP), который опрашивает REST API, берет на себя авторизацию и преобразование JSON в плоские файлы (DBF, CSV или XML), удобные для чтения типовыми средствами 1С 7.7.
← На главную