При организации взаимодействия 1С 7.7 с современными веб-сервисами и API поставщиков разработчики часто сталкиваются с проблемой получения данных по защищенному протоколу HTTPS. В штатном функционале платформы 1С 7.7 отсутствуют встроенные средства для работы с JSON и декодирования двоичных данных из формата Base64, а компонент v7httpreader не поддерживает шифрование HTTPS. Рассмотрим по шагам, как построить полноценный механизм загрузки фотографий товаров через API поставщика.
Выясним, почему стандартный компонент v7httpreader оказывается неработоспособным при попытке обратиться к API большинства сервисов. Данный компонент проектировался для устаревшего протокола HTTP и не умеет работать со с защищенными SSL/TLS-соединениями. При попытке сделать запрос по адресу, начинающемуся с https://, компонента возвращает ошибку или пустое тело ответа.
Для выполнения HTTPS-запросов в среде 1С 7.7 следует использовать системный OLE-объект Windows — WinHttp.WinHttpRequest.5.1. Он полноценно поддерживает заголовки HTTP, передачу параметров GET/POST и шифрование TLS.
Проанализируем пример кода для отправки HTTP GET-запроса с помощью WinHttp.WinHttpRequest.5.1. Обратим внимание на то, что для работы с современными веб-серверами необходимо принудительно указывать протокол шифрования TLS 1.2 через опцию Option(9) со значением 2048.
URL = "https://api.supplier.com/v1/products/photos";
HTTP = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
// Инициализация GET-запроса (0 - синхронный режим)
HTTP.Open("GET", URL, 0);
// Устанавливаем заголовки запроса
HTTP.SetRequestHeader("Content-Type", "application/json");
HTTP.SetRequestHeader("Authorization", "Bearer ВАШ_ТОКЕН_ДОСТУПА");
// Принудительно включаем поддержку TLS 1.2
HTTP.Option(9) = 2048;
// Отправляем запрос на сервер
HTTP.Send();
Если HTTP.Status <> 200 Тогда
Предупреждение("Ошибка запроса: " + HTTP.Status + " " + HTTP.StatusText);
Иначе
ОтветСервера = HTTP.ResponseText;
КонецЕсли;
Так как в 1С 7.7 нет встроенного объекта для разбора JSON, воспользуемся компонентом MSScriptControl.ScriptControl с движком JavaScript. Это позволит преобразовать текстовую строку JSON в объект и прочитать требуемые свойства или массив фото товаров.
Sc = СоздатьОбъект("MSScriptControl.ScriptControl");
Sc.Language = "jscript";
// Создаем вспомогательную функцию для парсинга
Sc.AddCode("function parseJson(str) { return JSON.parse(str); }");
// Получаем объект JSON
JsonObject = Sc.Run("parseJson", ОтветСервера);
// Пример получения строки Base64 конкретного фото из структуры
СтрокаBase64 = JsonObject.photo_base64;
После получения строки с фото в формате Base64 ее необходимо раскодировать в двоичные данные (массив байтов) и сохранить как графический файл (JPG или PNG). В 1С 7.7 для этого сочетают два COM-объекта: MSXML2.DOMDocument (для декодирования строки) и ADODB.Stream (для записи бинарного файла на диск).
Рассмотри пример реализации сохранения из формата Base64:
ИмяФайла = "C:\Photos\product_123.jpg";
// Декодируем строку Base64 через элемент DOMDocument
DOM = СоздатьОбъект("MSXML2.DOMDocument");
Elem = DOM.createElement("b64");
Elem.dataType = "bin.base64";
Elem.text = СтрокаBase64;
// Записываем бинарный массив в поток ADODB.Stream
Stream = СоздатьОбъект("ADODB.Stream");
Stream.Type = 1; // adTypeBinary (двоичный режим)
Stream.Open();
Stream.Write(Elem.nodeTypedValue);
// Сохраняем файл на диск (2 - перезаписывать существующий)
Stream.SaveToFile(ИмяФайла, 2);
Stream.Close();
Разберем основные нюансы, о которых нужно помнить при обработке фото через API в 1С 7.7:
MSScriptControl или внутренние переменные 1С может вызывать критическое нехватку операционной памяти и аварийное завершение работы программы.ResponseBody объекта WinHttpRequest и сразу передавать в ADODB.Stream без промежуточного декодирования.КомандаСистемы(...) и самостоятельно раскладывает готовые файлы картинок по папкам.