Как сформировать JSON и отправить POST-запрос на сервер в 1С 7.7

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При интеграции устаревших систем на базе платформы 1С:Предприятие 7.7 с современными веб-сервисами и API часто возникает задача отправки данных в формате JSON методом POST вместо классических GET-запросов с параметрами в URL. Платформа 7.7 не имеет встроенных средств сериализации данных в JSON, поэтому разработчику необходимо формировать тело запроса и выполнять передачу данных с помощью системных COM-объектов или внешних утилит.

Разберем по шагам, как правильно составить строку JSON, настроить заголовки HTTP-запроса, отправить данные и обойти типичные проблемы сетевого взаимодействия.

Формирование тела JSON-запроса и отправка через XMLHttpRequest

Рассмотрим базовый сценарий, когда структура запроса собирается вручную с помощью строковых функций встроенного языка 1С 7.7 и передается через объект MSXML2.ServerXMLHTTP или MSXML2.XMLHTTP.

Для корректного добавления двойных кавычек внутри строки в 1С 7.7 используется функция Симв(34). Посмотрим на практический пример кода формирования JSON-объекта и выполнения POST-запроса:


Отправить = "{" + Симв(34) + "scores" + Симв(34) + ":" + Симв(34) + СокрЛП(БалловСписать) + Симв(34) + ","
    + Симв(34) + "total" + Симв(34) + ":" + Симв(34) + Строка(Сумма) + Симв(34) + ","
    + Симв(34) + "cash" + Симв(34) + ":" + Симв(34) + Строка(Сумма - БалловСписать) + Симв(34) + ",";

Если СтрДлина(СокрЛП(КодКлиента)) = 6 Тогда
    Отправить = Отправить + Симв(34) + "code" + Симв(34) + ":" + Симв(34) + СокрЛП(КодКлиента) + Симв(34) + ","; 
Иначе
    Отправить = Отправить + Симв(34) + "phone" + Симв(34) + ":%2B7" + Симв(34) + СокрЛП(КодКлиента) + Симв(34) + ","; 
КонецЕсли; 

Отправить = Отправить + Симв(34) + "invoiceNumber" + Симв(34) + ":" + Симв(34) + СокрЛП(Прав(Док.НомерДок, 5)) + Симв(34) + ","
    + Симв(34) + "cashierExternalId" + Симв(34) + ":" + Симв(34) + СокрЛП(Док.Продавец.IDUdsgame) + Симв(34) + "}";

URL = "https://api.example.com/v1/partner/purchase";
XMLHttpRequest = СоздатьОбъект("MSXML2.ServerXMLHTTP");
XMLHttpRequest.open("POST", URL, 0);
XMLHttpRequest.setRequestHeader("Content-Type", "application/json; charset=utf-8");
XMLHttpRequest.setRequestHeader("Accept", "application/json"); 
XMLHttpRequest.setRequestHeader("X-Api-Key", Токен);
XMLHttpRequest.setRequestHeader("X-Origin-Request-Id", Строка(XOriginRequestId));
XMLHttpRequest.setRequestHeader("X-Timestamp", Строка(XTimestamp));
XMLHttpRequest.send(Отправить);

ОтветСервера = XMLHttpRequest.responseText;
Статус = XMLHttpRequest.status;

Обратите внимание на обязательные параметры при отправке тела запроса:

  1. Метод setRequestHeader("Content-Type", "application/json; charset=utf-8") сообщает веб-серверу, в каком формате передаются данные в теле запроса. Без этого заголовка сервер может проигнорировать переданные данные или вернуть ошибку 415 Unsupported Media Type.
  2. Заголовок Accept указывает ожидаемый формат ответа от сервера.
  3. Метод open("POST", URL, 0) инициализирует синхронный запрос, что позволяет сразу прочитать результат выполнения через responseText.

Важные нюансы работы с JSON в 1С 7.7

Проанализируем тонкости, с которыми часто сталкиваются разработчики при ручной сборке строк JSON:

  1. Кодировка символов (UTF-8 vs Windows-1251): Платформа 1С 7.7 работает со строками в кодировке Windows-1251. Стандарт JSON строго требует кодировку UTF-8. Если отправляются кириллические символы, простая передача строки может вызвать искажение данных на стороне сервера. Для гарантированного преобразования в UTF-8 без BOM можно использовать объект ADODB.Stream.
  2. Форматирование чисел: Функция Строка() в 1С 7.7 может форматировать числа с неразрывными пробелами в качестве разделителей разрядов и запятой в качестве разделителя дробной части. В спецификации JSON разделители тысяч запрещены, а десятичная точка должна быть символом .. Для числовых полей необходимо удалять пробелы и заменять запятые на точки.
  3. Экранирование спецсимволов: Если строковые значения содержат обратные слеши \, двойные кавычки " или переводы строк, их необходимо экранировать в соответствии со спецификацией JSON (например, \").

Альтернативные способы формирования JSON: MSScriptControl

Чтобы избежать ошибок при ручной склейке строк, можно воспользоваться возможностями движка JScript через COM-объект MSScriptControl.ScriptControl. Это позволяет сериализовать и десериализовать структуры данных стандартными средствами JavaScript:


Скрипт = СоздатьОбъект("MSScriptControl.ScriptControl");
Скрипт.Language = "JScript";
Скрипт.AddCode("function toJson(obj) { return JSON.stringify(obj); }");
Скрипт.AddCode("function fromJson(str) { return JSON.parse(str); }");

Проблемы сетевого взаимодействия и HTTPS на старых ОС

Выясним причину, почему один и тот же код может успешно выполняться на современных системах (Windows 7/10/11), но завершаться ошибкой на устаревших операционных системах (например, Windows XP):

  1. Поддержка TLS 1.2 и TLS 1.3: Большинство современных веб-серверов отключили поддержку устаревших протоколов шифрования SSLv3, TLS 1.0 и TLS 1.1. Встроенные библиотеки Windows XP (Schannel) не поддерживают TLS 1.2 по умолчанию. Браузеры (например, Google Chrome) работают, так как используют собственный криптографический стек, в то время как системные COM-объекты MSXML и WinHTTP полагаются на ОС.
  2. Использование WinHttp: Для более тонкой настройки протоколов рекомендуется использовать объект WinHttp.WinHttpRequest.5.1, позволяющий управлять версиями TLS через специальные опции безопасности.
  3. Применение утилиты cURL: Если обновить операционную систему или криптопровайдер невозможно, надежным решением для 1С 7.7 является сохранение сформированного JSON в файл на диск и вызов автономной консольной сборки curl.exe через КомандаСистемы или объект WScript.Shell. Утилита cURL содержит актуальные библиотеки OpenSSL и без проблем работает с современными веб-серверами по протоколу HTTPS.
← На главную