При работе в среде 1С:Предприятие 7.7 программисты часто сталкиваются с необходимостью интеграции со сторонними веб-сервисами. Поскольку встроенных инструментов для полноценной работы с протоколом HTTP в "семерке" не так много, одним из самых надежных и простых способов является использование внешней консольной утилиты curl. Рассмотрим, как правильно сформировать пакетный запрос, передать большой объем данных в формате XML и избежать распространенных ошибок при работе с командной строкой Windows.
Прежде чем приступать к написанию кода в 1С, проанализируем структуру типичного запроса, который требуется отправить на сервер. В нашем случае это POST запрос с несколькими заголовками и телом в виде файла.
Основные параметры утилиты curl, которые нам потребуются:
-X POST — указывает на тип запроса.-H — задает заголовки (Headers). Для передачи XML важно указать "Content-type: application/xml".--data-binary — позволяет отправить содержимое файла "как есть", без искажений. Использование символа @ перед именем файла указывает curl, что нужно прочитать данные из указанного пути.Важное замечание по синтаксису: В примерах для операционных систем Linux часто используется обратный слеш \ для переноса длинной команды на следующую строку. В командной строке Windows (CMD) этот символ не работает. Если вы формируете команду для бат-файла (.bat), всю команду следует писать либо в одну строку, либо использовать символ карет ^ для переноса.
Проанализируем ситуацию с кодировкой данных. Платформа 1С 7.7 по умолчанию работает с кодировкой Windows-1251. Однако большинство современных веб-сервисов ожидают данные в кодировке UTF-8. Если ваш XML содержит кириллицу, простая выгрузка через объект Текст создаст файл, который сервер не сможет корректно обработать.
Рассмотрим, как правильно подготовить файл. Перед вызовом curl необходимо убедиться, что файл 155_20211224.xml сохранен в UTF-8. Если стандартные средства 1С 7.7 этого не позволяют, можно воспользоваться объектом ADODB.Stream для перекодировки файла перед отправкой.
Выясним наиболее эффективный способ запуска команды из 1С. Поскольку команда получается длинной и содержит много кавычек, прямой вызов через КомандаСистемы() может быть затруднен из-за ограничений на длину строки или проблем с экранированием. Правильнее будет создать временный текстовый файл с расширением .bat, записать в него команду и выполнить его.
Разберем по шагам код реализации этого механизма:
// Создаем объект для работы с текстом
Батник = СоздатьОбъект("Текст");
ПутьКБатнику = "c:\temp\send_data.bat";
ПутьКДанным = "c:\temp\155_20211224.xml";
URL = "http://as-de.ru:555/MobileTrading_Ext/hs/Exchange/movement_products_xml?only_test=true";
// Формируем строку команды.
// Обратите внимание: все параметры пишем в одну строку, убирая лишние пробелы в URL.
СтрокаЗапуска = "curl -X POST " + URL + " " +
"-H ""Accept: application/xml"" " +
"-H ""Content-type: application/xml"" " +
"-H ""Accept-Encoding: gzip, deflate"" " +
"--data-binary ""@" + ПутьКДанным + """";
Батник.ДобавитьСтроку(СтрокаЗапуска);
// Добавляем паузу для отладки, чтобы консольное окно не закрылось сразу в случае ошибки
Батник.ДобавитьСтроку("pause");
// Записываем и выполняем
Батник.Записать(ПутьКБатнику);
КомандаСистемы(ПутьКБатнику);
Одной из проблем метода КомандаСистемы() является то, что 1С не получает ответ от сервера напрямую. Чтобы проанализировать, что ответил веб-сервис, мы можем перенаправить вывод curl в текстовый файл, а затем прочитать его из 1С.
Изменим строку запуска, добавив перенаправление потока:
ПутьКОтвету = "c:\temp\response.txt";
СтрокаЗапуска = СтрокаЗапуска + " > """ + ПутьКОтвету + """ 2>&1";
После выполнения команды мы можем открыть файл response.txt с помощью того же объекта Текст и проверить наличие в нем HTTP-статуса 200 или сообщений об ошибках.
Если работа с внешними файлами и консолью кажется вам избыточной, рассмотрим более современный программный способ через COM-объект WinHttp.WinHttpRequest.5.1. Этот метод позволяет отправлять данные без создания .bat файлов и получать ответ сервера сразу в переменную.
Посмотрим на пример реализации:
// Создаем HTTP объект
HttpЗапрос = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
URL = "http://as-de.ru:555/MobileTrading_Ext/hs/Exchange/movement_products_xml?only_test=true";
HttpЗапрос.Open("POST", URL, 0);
HttpЗапрос.SetRequestHeader("Accept", "application/xml");
HttpЗапрос.SetRequestHeader("Content-Type", "application/xml");
// Загружаем XML из файла
ТекстXML = СоздатьОбъект("Текст");
ТекстXML.Открыть(ПутьКДанным);
Содержимое = "";
Для н = 1 По ТекстXML.КоличествоСтрок() Цикл
Содержимое = Содержимое + ТекстXML.ПолучитьСтроку(н) + РазделительСтрок;
КонецЦикла;
// Отправляем данные
HttpЗапрос.Send(Содержимое);
// Получаем результат
Статус = HttpЗапрос.Status;
ОтветСервера = HttpЗапрос.ResponseText;
Если Статус <> 200 Тогда
Сообщить("Ошибка при отправке: " + Статус);
Иначе
Сообщить("Данные успешно отправлены!");
КонецЕсли;
Резюмируем: Использование curl через бат-файл — это отличный способ для быстрой отладки и работы с очень большими объемами данных (сотни мегабайт), так как curl крайне эффективно управляет памятью. Однако для более тесной интеграции и обработки ответов в режиме реального времени лучше рассмотреть использование WinHttpRequest.