Реализация обмена данными с веб-сайтами в среде 1С:Предприятие 7.7 часто сопряжена с техническими трудностями. Одной из основных проблем является ограничение платформы на длину текстовой строки, что делает невозможным получение больших XML-файлов (например, списка заказов из интернет-магазина) через простое обращение к тексту ответа. В данной статье мы подробно разберем, как правильно организовать отправку POST-запросов, пройти авторизацию и сохранить результат в файл, используя внешние COM-объекты.
При работе с объектами WinHttp.WinHttpRequest.5.1 или MSXML2.ServerXMLHTTP начинающие разработчики часто используют свойство ResponseText. Однако в 1С 7.7 это приводит к ошибке «длина строки превышает максимальное количество знаков», если размер XML-документа велик. Чтобы обойти это ограничение, мы проанализируем использование бинарного потока данных через ResponseBody и сохранение его на диск с помощью объекта ADODB.Stream.
Для работы нам понадобятся следующие системные компоненты:
WinHttp.WinHttpRequest.5.1 — для выполнения HTTP-запросов (поддерживает работу с cookies и сессиями).ADODB.Stream — для работы с бинарными данными и сохранения их в файл без участия строковых переменных 1С.MSXML2.ServerXMLHTTP — альтернативный вариант, который позволяет сохранять результат напрямую методом save().Рассмотрим ситуацию на примере обмена с сайтом под управлением 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);
Когда мы отправляем финальный запрос 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);
КонецЕсли;
Часто сайты возвращают данные в кодировке 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();
КонецПроцедуры
Существует еще более простой способ сохранения 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 может оказаться пустым.
При реализации сложных обменов стоит учитывать следующие моменты:
SetTimeouts для увеличения времени ожидания. Например: WinHttp.SetTimeouts(30000, 60000, 60000, 300000);.TLS 1.2. Для его активации в старых ОС может потребоваться настройка опции WinHttp.Option(9) = 2048;.User-Agent. Некоторые сервера блокируют запросы без этого заголовка, считая их подозрительными: WinHttp.SetRequestHeader("User-Agent", "1C 7.7 Client");.Рассмотренные нами методы позволяют надежно интегрировать 1С 7.7 с внешними веб-сервисами, обходя архитектурные ограничения платформы прошлых поколений.