В современной практике интеграции 1С 7.7 с внешними сервисами (маркетплейсами, личными кабинетами поставщиков или веб-сайтами) часто возникает задача передачи данных в формате JSON через протокол HTTP. Основная сложность заключается в том, что платформа 1С 7.7 является устаревшей и не имеет встроенных средств для работы с современными веб-стандартами. В этой статье мы подробно разберем, как решить эту задачу, используя доступные системные компоненты и внешние инструменты.
Это наиболее распространенный способ реализации HTTP-запросов непосредственно из кода 1С. Объект WinHttp позволяет гибко настраивать заголовки, параметры авторизации и передавать тело запроса. Проанализируем основные шаги реализации:
Content-Type.Рассмотрим пример кода, который формирует POST-запрос:
// Создаем объект WinHttp
WinHttp = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
// Открываем соединение: Метод, URL, Асинхронно(0 - нет)
WinHttp.Open("POST", "https://www.example.com/api/json/", 0);
// Устанавливаем заголовки
WinHttp.SetRequestHeader("Content-Type", "application/json; charset=utf-8");
WinHttp.SetRequestHeader("Accept", "application/json");
// Настройка авторизации (если требуется)
WinHttp.SetCredentials("ВашЛогин", "ВашПароль", 0);
// Подготовка JSON-строки (тело запроса)
// Важно: 1С 7.7 работает в ANSI, для корректной передачи кириллицы
// строку нужно конвертировать в UTF-8
ТекстЗапроса = "{""sales"": [{""sku"": ""12345"", ""count"": 10}]}";
// Отправка запроса
Попытка
WinHttp.Send(ТекстЗапроса);
Статус = WinHttp.Status;
ОтветСервера = WinHttp.ResponseText;
Сообщить("Статус: " + Статус);
Сообщить("Ответ: " + ОтветСервера);
Исключение
Сообщить("Ошибка при отправке: " + ОписаниеОшибки());
КонецПопытки;
Если ваша 1С 7.7 работает на устаревшей операционной системе, вы почти наверняка столкнетесь с ошибкой: "Получено непредвиденное сообщение или оно имеет неправильный формат". Это происходит из-за того, что системные библиотеки не поддерживают протоколы шифрования TLS 1.1 и TLS 1.2, которые требуют современные сервера.
Выясним причину и найдем решение. Для обхода проверок сертификатов и настройки параметров безопасности можно использовать MSScriptControl.ScriptControl для прямого доступа к опциям WinHttp, которые недоступны напрямую в 1С:
WinHttp = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
Скрипт = СоздатьОбъект("MSScriptControl.ScriptControl");
Скрипт.language = "javascript";
Скрипт.AddObject("WinHttp", WinHttp);
// Игнорируем ошибки SSL (флаг 13056 позволяет обходить проблемы с сертификатами)
Скрипт.Eval("WinHttp.Option(4) = 13056");
// Разрешаем редиректы
Скрипт.Eval("WinHttp.Option(6) = true");
WinHttp.Open("POST", URL, 0);
// Далее настройка заголовков и Send()
Если объем данных большой или вам нужно отправить готовый файл JSON с диска, лучше использовать объект ADODB.Stream. Это гарантирует правильную передачу бинарных данных без искажений кодировки 1С.
// Загружаем файл в поток
Данные = СоздатьОбъект("ADODB.Stream");
Данные.Type = 1; // Binary
Данные.Open();
Данные.LoadFromFile("C:\data.json");
// Используем ServerXMLHTTP для работы с потоками
Запрос = СоздатьОбъект("Msxml2.ServerXMLHTTP");
Запрос.Open("POST", URL, 0, Логин, Пароль);
Запрос.SetRequestHeader("Content-Type", "application/json");
// Отправляем поток данных целиком
Запрос.Send(Данные);
Если Запрос.Status = 200 Тогда
Сообщить("Успешно: " + Запрос.ResponseText);
Иначе
Сообщить("Ошибка сервера: " + Запрос.Status);
КонецЕсли;
Данные.Close();
Как показала практика обсуждения на форуме, использование внешней утилиты cURL часто является единственным рабочим решением для 1С 7.7 на старых Windows. Преимущество cURL в том, что она использует собственные библиотеки OpenSSL и не зависит от системных настроек TLS.
Разберем по шагам, как запустить cURL из 1С:
curl.exe для вашей версии Windows.Текст).Пример командной строки для cURL:
curl -is --user login:password -d @data.json -X POST https://example.com/api/
Реализация в коде 1С 7.7:
// Путь к curl и файлу данных
ПутьККерлу = "C:\curl\curl.exe";
ПутьКФайлу = "C:\temp\request.json";
ФайлОтвета = "C:\temp\answer.txt";
// Формируем строку запуска
// -i (выводить заголовки), -s (тихий режим), --user (авторизация), -d @ (файл данных)
КоманднаяСтрока = ПутьККерлу + " -is --user " + Логин + ":" + Пароль +
" -d @""" + ПутьКФайлу + """ -X POST " + URL + " > """ + ФайлОтвета + """";
// Запускаем выполнение
КомандаСистемы(КоманднаяСтрока);
// Читаем результат
ТекстОтвета = СоздатьОбъект("Текст");
ТекстОтвета.Открыть(ФайлОтвета);
Для к = 1 По ТекстОтвета.КоличествоСтрок() Цикл
Сообщить(ТекстОтвета.ПолучитьСтроку(к));
КонецЦикла;
Важно помнить: Сервера приложений ожидают JSON в кодировке UTF-8. Поскольку 1С 7.7 сохраняет файлы в кодировке Windows-1251 (ANSI), перед отправкой файл необходимо перекодировать. Если вы используете curl, можно воспользоваться промежуточной утилитой для смены кодировки или использовать ADODB.Stream для сохранения файла в UTF-8 прямо из 1С.
Проанализируем ситуацию с кириллицей: если в вашем JSON есть русские названия товаров или адреса, и вы отправите их "как есть", сервер получит нечитаемые символы. Всегда проверяйте кодировку тела запроса в инструментах отладки (например, на сервисах-ловушках типа webhook.site).
Подводя итог, можно сказать: для простых задач на современных ОС используйте WinHttp. Для работы на Windows XP или при наличии сложных требований к шифрованию, связка 1С + cURL является наиболее стабильным и простым в отладке решением.