Как выполнить HTTP-запрос и сохранить полученный XML-файл в 1С 7.7

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

Реализация обмена данными с веб-сайтами в среде 1С:Предприятие 7.7 часто сопряжена с техническими трудностями. Одной из основных проблем является ограничение платформы на длину текстовой строки, что делает невозможным получение больших XML-файлов (например, списка заказов из интернет-магазина) через простое обращение к тексту ответа. В данной статье мы подробно разберем, как правильно организовать отправку POST-запросов, пройти авторизацию и сохранить результат в файл, используя внешние COM-объекты.

Проблема ограничения длины строки и выбор инструментов

При работе с объектами WinHttp.WinHttpRequest.5.1 или MSXML2.ServerXMLHTTP начинающие разработчики часто используют свойство ResponseText. Однако в 1С 7.7 это приводит к ошибке «длина строки превышает максимальное количество знаков», если размер XML-документа велик. Чтобы обойти это ограничение, мы проанализируем использование бинарного потока данных через ResponseBody и сохранение его на диск с помощью объекта ADODB.Stream.

Для работы нам понадобятся следующие системные компоненты:

  1. WinHttp.WinHttpRequest.5.1 — для выполнения HTTP-запросов (поддерживает работу с cookies и сессиями).
  2. ADODB.Stream — для работы с бинарными данными и сохранения их в файл без участия строковых переменных 1С.
  3. MSXML2.ServerXMLHTTP — альтернативный вариант, который позволяет сохранять результат напрямую методом save().

Шаг 1: Авторизация и инициализация обмена

Рассмотрим ситуацию на примере обмена с сайтом под управлением Bitrix. Обмен обычно состоит из нескольких этапов: авторизация, проверка параметров и запрос данных. Важно использовать один и тот же экземпляр объекта запроса на протяжении всей сессии, чтобы сохранялись куки (cookies).

Разберем пример кода для инициализации сессии:


// Создаем объект один раз для всей цепочки запросов
HTTPxml = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
URL = "http://ваш-сайт.ru/bitrix/admin/1c_exchange.php";

// 1. Авторизация
ЗапросА = URL + "?AUTH_FORM=Y&TYPE=AUTH&USER_LOGIN=admin&USER_PASSWORD=password";
HTTPxml.Open("POST", ЗапросА, 0);
HTTPxml.Send();

// 2. Проверка авторизации (checkauth)
HTTPxml.Open("GET", URL + "?type=sale&mode=checkauth", 0);
HTTPxml.Send();
Сообщить("Результат авторизации: " + HTTPxml.responseText);

Шаг 2: Получение данных и сохранение через ADODB.Stream

Когда мы отправляем финальный запрос query, сервер возвращает нам объемный XML-текст. Чтобы не возникло ошибки переполнения строки, мы будем обращаться к свойству ResponseBody. Рассмотрим, как правильно использовать ADODB.Stream для записи файла.

Проанализируем типичную ошибку «Тип переменной не поддерживается». Она возникает, когда разработчик пытается записать ResponseText в поток, настроенный на бинарные данные, или наоборот. Правильный алгоритм действий выглядит так:


// Отправляем запрос на получение данных
HTTPxml.Open("GET", URL + "?type=sale&mode=query", 0);
HTTPxml.Send();

Если HTTPxml.Status = 200 Тогда
    // Создаем объект потока
    oADOStream = СоздатьОбъект("ADODB.Stream");
    
    // Устанавливаем тип данных - Binary (1)
    oADOStream.Type = 1; 
    // Режим доступа - ReadWrite (3)
    oADOStream.Mode = 3; 
    
    oADOStream.Open(); 
    // Записываем бинарное тело ответа сервера
    oADOStream.Write(HTTPxml.ResponseBody);
    
    // Сохраняем в файл (2 - перезаписать, если существует)
    oADOStream.SaveToFile("C:\temp\orders.xml", 2);
    oADOStream.Close();
    Сообщить("Файл успешно сохранен!");
Иначе
    Сообщить("Ошибка сервера: " + HTTPxml.Status + " " + HTTPxml.StatusText);
КонецЕсли;

Шаг 3: Работа с кодировками (UTF-8 и Windows-1251)

Часто сайты возвращают данные в кодировке UTF-8, в то время как 1С 7.7 работает с Windows-1251. Если вам нужно не просто сохранить файл, а предварительно обработать его текст в 1С, или наоборот — отправить текст на сайт в определенной кодировке, можно использовать ADODB.Stream с переключением свойства Charset.

Посмотрим на пример функции, которая помогает корректно записывать текстовые данные в поток с нужной кодировкой:


Процедура СохранитьТекстВФайл(Текст, ПутьКФайлу, Кодировка)
    Стрим = СоздатьОбъект("ADODB.Stream");
    Стрим.Type = 2; // Text
    Стрим.Charset = Кодировка; // Например, "windows-1251" или "utf-8"
    Стрим.Open();
    Стрим.WriteText(Текст);
    Стрим.SaveToFile(ПутьКФайлу, 2);
    Стрим.Close();
КонецПроцедуры

Альтернативный метод: Использование MSXML2.ServerXMLHTTP

Существует еще более простой способ сохранения XML-ответа, если вы используете объект MSXML2.ServerXMLHTTP. Этот объект имеет встроенное свойство responseXML, которое представляет собой DOM-модель документа. У этого свойства есть метод save(), который умеет сохранять данные напрямую в файл.

Выясним, как это выглядит в коде:


HTTPxml = СоздатьОбъект("Msxml2.ServerXMLHTTP");
HTTPxml.Open("GET", URL, 0);
HTTPxml.Send();

Если HTTPxml.Status = 200 Тогда
    // Прямое сохранение XML-документа на диск
    HTTPxml.ResponseXML.Save("C:\temp\data.xml");
    Сообщить("Данные сохранены через MSXML2");
КонецЕсли;

Важный нюанс: Данный метод работает эффективно только если сервер возвращает корректный заголовок Content-Type: text/xml. Если сервер присылает данные как обычный текст, свойство ResponseXML может оказаться пустым.

Дополнительные рекомендации по стабильности обмена

При реализации сложных обменов стоит учитывать следующие моменты:

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

← На главную