При интеграции устаревших систем на базе платформы 1С:Предприятие 7.7 с современными веб-сервисами и API часто возникает задача отправки данных в формате JSON методом POST вместо классических GET-запросов с параметрами в URL. Платформа 7.7 не имеет встроенных средств сериализации данных в JSON, поэтому разработчику необходимо формировать тело запроса и выполнять передачу данных с помощью системных COM-объектов или внешних утилит.
Разберем по шагам, как правильно составить строку JSON, настроить заголовки HTTP-запроса, отправить данные и обойти типичные проблемы сетевого взаимодействия.
Рассмотрим базовый сценарий, когда структура запроса собирается вручную с помощью строковых функций встроенного языка 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;
Обратите внимание на обязательные параметры при отправке тела запроса:
setRequestHeader("Content-Type", "application/json; charset=utf-8") сообщает веб-серверу, в каком формате передаются данные в теле запроса. Без этого заголовка сервер может проигнорировать переданные данные или вернуть ошибку 415 Unsupported Media Type.Accept указывает ожидаемый формат ответа от сервера.open("POST", URL, 0) инициализирует синхронный запрос, что позволяет сразу прочитать результат выполнения через responseText.Проанализируем тонкости, с которыми часто сталкиваются разработчики при ручной сборке строк JSON:
ADODB.Stream.Строка() в 1С 7.7 может форматировать числа с неразрывными пробелами в качестве разделителей разрядов и запятой в качестве разделителя дробной части. В спецификации JSON разделители тысяч запрещены, а десятичная точка должна быть символом .. Для числовых полей необходимо удалять пробелы и заменять запятые на точки.\, двойные кавычки " или переводы строк, их необходимо экранировать в соответствии со спецификацией JSON (например, \").Чтобы избежать ошибок при ручной склейке строк, можно воспользоваться возможностями движка 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); }");
Выясним причину, почему один и тот же код может успешно выполняться на современных системах (Windows 7/10/11), но завершаться ошибкой на устаревших операционных системах (например, Windows XP):
WinHttp.WinHttpRequest.5.1, позволяющий управлять версиями TLS через специальные опции безопасности.curl.exe через КомандаСистемы или объект WScript.Shell. Утилита cURL содержит актуальные библиотеки OpenSSL и без проблем работает с современными веб-серверами по протоколу HTTPS.