Как в 1С 7.7 отправить JSON-файл с помощью POST-запроса

Программист 1С v7.7 Управленческий учет Торговля и дистрибуция
← На главную

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

Метод 1: Использование объекта WinHttp.WinHttpRequest.5.1

Это наиболее распространенный способ реализации HTTP-запросов непосредственно из кода 1С. Объект WinHttp позволяет гибко настраивать заголовки, параметры авторизации и передавать тело запроса. Проанализируем основные шаги реализации:

  1. Создание объекта и инициализация соединения.
  2. Настройка заголовков (Headers), включая Content-Type.
  3. Передача учетных данных для Basic-авторизации.
  4. Отправка данных и получение ответа.

Рассмотрим пример кода, который формирует 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;
    Сообщить("Статус: " + Статус);
    Сообщить("Ответ: " + ОтветСервера);
Исключение
    Сообщить("Ошибка при отправке: " + ОписаниеОшибки());
КонецПопытки;

Метод 2: Решение проблем с SSL и TLS на старых ОС (Windows XP / Server 2003)

Если ваша 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()

Метод 3: Передача данных через поток ADODB.Stream

Если объем данных большой или вам нужно отправить готовый файл 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();

Метод 4: Консольная утилита cURL — самый надежный способ

Как показала практика обсуждения на форуме, использование внешней утилиты cURL часто является единственным рабочим решением для 1С 7.7 на старых Windows. Преимущество cURL в том, что она использует собственные библиотеки OpenSSL и не зависит от системных настроек TLS.

Разберем по шагам, как запустить cURL из 1С:

  1. Скачайте исполняемый файл curl.exe для вашей версии Windows.
  2. Сформируйте JSON-файл средствами 1С (через объект Текст).
  3. Вызовите команду системы с необходимыми ключами.

Пример командной строки для 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 является наиболее стабильным и простым в отладке решением.

← На главную