При интеграции устаревшей платформы 1С:Предприятие 7.7 с современными веб-сервисами и интернет-магазинами разработчики часто сталкиваются со специфическими трудностями. В платформе 1С 7.7 отсутствуют встроенные объекты для работы с протоколом HTTP, нет нативных средств сериализации/десериализации формата JSON, а также встроенных функций для вычисления криптографических хэшей (например, MD5). Разберем по шагам, как правильно настроить подключение через COM-объекты Windows, устранить типичные ошибки маршрутизации (включая статус 404) и прочитать полученные структуры данных.
Когда при выполнении метода Open и Send через объект WinHttp.WinHttpRequest.5.1 сервер возвращает статус 404 Not Found, проблема чаще всего заключается в неправильном формировании URI запроса или неверных параметрах авторизации. Проанализируем ключевые нюансы:
/cp/orders/list или /cp/ts/orders/list, тогда как прямое обращение к корню /orders/ приводит к ошибке 404, так как данный маршрут не зарегистрирован на веб-сервере.userpsw) нередко ожидает не открытый текст пароля, а его MD5-хэш в нижнем регистре (32 символа). Если передать пароль в открытом виде, сервер может отклонить маршрутизацию запроса.Рассмотрим, как отправить запрос к API и правильно прочитать полученный ответ. Большинство современных веб-серверов возвращают данные в кодировке UTF-8. Если использовать стандартное свойство ResponseText объекта WinHttp или указать кодировку Windows-1251, кириллический текст превратится в нечитаемые символы. Чтобы этого избежать, воспользуемся чтением бинарного ответа ResponseBody через COM-объект ADODB.Stream.
Посмотрим на пример функции отправки запроса и получения строки JSON:
Функция ВыполнитьЗапросAPI(URL)
Перем WinHttp, Стрим, ОтветJSON;
WinHttp = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
// Включение поддержки современных протоколов TLS (флаг SecureProtocols)
WinHttp.Option(9, 2048);
// Открываем GET-запрос в синхронном режиме (0)
WinHttp.Open("GET", URL, 0);
WinHttp.Send();
Если WinHttp.Status <> 200 Тогда
Сообщить("Ошибка запроса! Код ответа сервера: " + WinHttp.Status + " (" + WinHttp.StatusText + ")");
Возврат "";
КонецЕсли;
// Чтение бинарного ответа в кодировке UTF-8 с помощью ADODB.Stream
Стрим = СоздатьОбъект("ADODB.Stream");
Стрим.Type = 1; // adTypeBinary
Стрим.Mode = 3; // adModeReadWrite
Стрим.Open();
Стрим.Write(WinHttp.ResponseBody);
Стрим.Position = 0;
Стрим.Type = 2; // adTypeText
Стрим.Charset = "utf-8";
ОтветJSON = Стрим.ReadText();
Стрим.Close();
Возврат ОтветJSON;
КонецФункции
Разберем подробнее, как разобрать строку JSON в 1С 7.7 без использования сторонних платных компонент. Самый доступный способ — использование системного компонента MSScriptControl.ScriptControl с движком jscript.
Посмотрим, как извлечь общее количество элементов (count) и перебрать массив заказов (items), записав полученные данные в ТаблицуЗначений:
Процедура ОбработатьОтветJSON(СтрокаJSON)
Перем СК, ОбъектОтвета, ТЗ, КолвоЗаказов, МассивЗаказов, Инд, Заказ;
Если ПустаяСтрока(СтрокаJSON) = 1 Тогда
Возврат;
КонецЕсли;
СК = СоздатьОбъект("MSScriptControl.ScriptControl");
СК.Language = "jscript";
Попытка
// Разбираем JSON-строку в объект JavaScript
СК.AddCode("function parseJson(str) { return eval('(' + str + ')'); }");
ОбъектОтвета = СК.Run("parseJson", СтрокаJSON);
Исключение
Сообщить("Не удалось разобрать JSON-ответ сервера: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Получаем количество заказов
КолвоЗаказов = ОбъектОтвета.count;
Сообщить("Всего заказов получено: " + Строка(КолвоЗаказов));
// Создаем ТаблицуЗначений для размещения данных в 1С
ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("НомерЗаказа");
ТЗ.НоваяКолонка("Сумма");
ТЗ.НоваяКолонка("Статус");
МассивЗаказов = ОбъектОтвета.items;
// Перебираем массив элементов
Для Инд = 0 По МассивЗаказов.length - 1 Цикл
Заказ = МассивЗаказов.item(Инд);
ТЗ.НоваяСтрока();
ТЗ.НомерЗаказа = Заказ.number;
ТЗ.Сумма = Заказ.summ;
ТЗ.Статус = Заказ.status;
КонецЦикла;
Сообщить("Обработка завершена. Загружено строк: " + ТЗ.КоличествоСтрок());
КонецПроцедуры
Проанализируем другие подходы, если стандартных COM-объектов операционной системы недостаточно: