В процессе интеграции систем на базе 1С:Предприятие 7.7 с современными веб-сервисами часто возникает задача передачи структурированных данных. Наиболее распространенным способом является отправка XML методом POST. Несмотря на почтенный возраст платформы «семерки», она позволяет успешно решать такие задачи, используя внешние COM-объекты операционной системы Windows.
В этой статье мы подробно разберем, как правильно подготовить XML-документ, настроить HTTP-запрос и обработать ответ сервера, а также рассмотрим важные технические нюансы, которые уберегут вашу систему от зависаний и ошибок соединения.
Для реализации запроса в 1С 7.7 чаще всего используются два компонента:
DOMDocument, что позволяет передавать файлы без предварительного преобразования в огромные текстовые строки.Рассмотрим основной способ реализации, который помог автору темы решить задачу.
Этот метод удобен тем, что мы работаем с XML как с объектом. Проанализируем процесс по шагам.
Шаг 1. Загрузка файла в объект DOM
Сначала нам нужно считать файл с диска так, чтобы система поняла его структуру. Для этого создадим объект Msxml2.DOMDocument. Важно помнить, что метод Load возвращает результат выполнения: если файл поврежден или путь указан неверно, мы получим ошибку еще до отправки запроса.
ДокXML = СоздатьОбъект("Msxml2.DOMDocument");
ДокXML.async = 0; // Выключаем асинхронную загрузку
Если ДокXML.Load("C:\mydata.xml") = 0 Тогда
Сообщить("Не удалось загрузить файл. Причина: " + ДокXML.parseError.reason);
Возврат;
КонецЕсли;
Шаг 2. Настройка и отправка запроса
Теперь создадим объект запроса. При формировании URL мы можем добавлять параметры прямо в строку адреса. Обратите внимание на установку заголовка Content-Type — это критически важно для того, чтобы веб-сервер понял, что вы прислали именно XML, а не просто текст.
url = "http://api.service.com/data?action=upload";
Запрос = СоздатьОбъект("Msxml2.ServerXMLHTTP");
Запрос.open("POST", url, 0); // 0 означает синхронный режим
Запрос.setRequestHeader("Content-Type", "text/xml; charset=UTF-8");
// Если требуется авторизация, добавляем заголовок:
Запрос.setRequestHeader("Authorization", "Bearer " + ТокенДоступа);
// Отправляем сам объект DOMDocument
Запрос.send(ДокXML);
Шаг 3. Обработка результата
Выясним причину, по которой сервер может не принять данные. Даже если статус ответа 200 (OK), это не всегда означает успех бизнес-логики. Рекомендуется проверять тело ответа.
Если Запрос.status = 200 Тогда
ОтветXML = Запрос.responseXML;
Сообщить("Данные успешно отправлены. Статус: " + Запрос.statusText);
// Пример получения конкретного значения из ответа
Результат = ОтветXML.selectSingleNode("//Status").text;
Сообщить("Результат обработки: " + Результат);
Иначе
Сообщить("Ошибка запроса: " + Запрос.status + " " + Запрос.statusText);
КонецЕсли;
Разберем ситуации, с которыми часто сталкиваются разработчики при работе с 1С 7.7.
Как было справедливо замечено в обсуждении, «семерка» может аварийно завершить работу при попытке передать очень большую строку (несколько десятков мегабайт) через метод send(). Рекомендуем использовать именно объект DOMDocument в качестве параметра send, так как в этом случае передача данных происходит более эффективно на уровне COM-интерфейсов, минуя механизмы выделения памяти под строки 1С.
Если ваш веб-сервер требует защищенного соединения https, вы можете столкнуться с тем, что старые компоненты Windows пытаются использовать устаревший SSL. В этом случае лучше использовать WinHttp.WinHttpRequest.5.1 и принудительно включить поддержку TLS 1.2:
Запрос = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
Запрос.open("POST", url, 0);
// Включаем поддержку TLS 1.2 (константа 2048)
Запрос.Option(9) = 2048;
Запрос.setRequestHeader("Content-Type", "text/xml; charset=UTF-8");
Запрос.send(ДокXML.xml); // Здесь передаем XML-текст
В реальных условиях сеть может работать нестабильно. Чтобы 1С не «зависла» навсегда при ожидании ответа от «упавшего» сервера, установим лимиты времени. Для WinHttpRequest это делается следующим образом:
Запрос.SetTimeouts(5000, 5000, 10000, 30000);
Параметры означают: время разрешения имени сервера, время на установку соединения, время на отправку данных и время на ожидание ответа (в миллисекундах).
Если сервер возвращает ошибку о неверном формате XML, проверьте кодировку. При использовании DOMDocument.save() или Load(), компонента обычно сама управляет заголовком encoding="UTF-8". Однако, если вы формируете XML вручную как текстовую строку, убедитесь, что в начале файла не записываются невидимые байты BOM (Byte Order Mark), которые некоторые веб-серверы (особенно на базе Linux/Java) не могут корректно обработать.
Резюмируем: для стабильной работы используйте связку Msxml2.DOMDocument для подготовки данных и Msxml2.ServerXMLHTTP для отправки. Это обеспечит корректную типизацию данных и избавит от проблем с переполнением строковых буферов в 1С 7.7.