1С 7. Получить pdf-файл через GET-запрос

1. GrafB 10 26.02.21 15:56 Сейчас в теме
Добрый день, не могу настроить простенький GET запрос к СБИС. Задача получить чек по его номеру.

С авторизацией разобрался, дальше пытаюсь реализовать само получение, вот теория:
Команда API ОФД позволяет получить фискальный документ по его идентификатору. Документ можно запросить в формате *.json или *.pdf.

Метод: GET

Адрес запроса: h ttps://api.sbis.ru/ofd/v1/orgs/<inn>/kkts/<regId>/storages/<storageId>/docs/­<docNum>?docDate=<docDate>&format=<fo rmat>


а вот практика:
ОтправЧек = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
	ОтправЧек.open("GET", url, 0);
	ОтправЧек.setRequestHeader("Cookie", СИД);
	ОтправЧек.setRequestHeader("Content-Length", "0");
	ОтправЧек.setRequestHeader("Host", "api.sbis.ru");
	ОтправЧек.setRequestHeader("User-Agent", "Python-urllib/3.3");
	ОтправЧек.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    ОтправЧек.send();
    СтрОтвета = "";
	
    Если ОтправЧек.status = 200 Тогда
		Ответ = ОтправЧек.ResponseStream;
        Ответ.saveToFile(ПутьКФайлуОтвета);
	Иначе
		ТекстОшибки = "Ошибка: "+ОтправЧек.status+" : "+ОтправЧек.statusText;
        Сообщить(ТекстОшибки);
		Сообщить(""+СокрЛП(ОтправЧек.ResponseText()));
		Возврат;
	КонецЕсли;
Показать


ну и ошибка:
Ответ = ОтправЧек.ResponseStream: Тип переменой не поддерживается
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Nubsdale 26.02.21 16:06 Сейчас в теме
(1)
Тип переменой не поддерживается

На какую строчку ругается?
4. GrafB 10 27.02.21 08:47 Сейчас в теме
(2) прошу прощения поправил.
3. spacecraft 26.02.21 16:25 Сейчас в теме
(1) так самого главного не привели: url.

Да и методами 1С нормально все отрабатывает. А, не сразу заметил, что 1С 7.7.

PS. ОтправЧек.setRequestHeader("Content-Length", "0"); тут должно быть число 0, не строка.
5. GrafB 10 27.02.21 08:50 Сейчас в теме
(3) думаю это мало поможет, статус 200 возвращается, т.е. я так понимаю pdf прилетает, но не знаю где и как его поймать обработать(сохранить).

ЗЫ: в авторизации тоже Content-Length как строка, но отрабатывает. Попробовал поменять на число ничего не изменилось.
6. spacecraft 27.02.21 09:05 Сейчас в теме
(5) ясно. ОтправЧек.ResponseStream это поток. Из 1С невозможно работать с этим потоком. Тут только ResponseBody подходит. Но и то не факт, что нормально будет.
Но, возможно, проще будет работать с получением в формате json и метод ResponseText. Будет отрабатывать вполне корректно.
7. GrafB 10 27.02.21 09:18 Сейчас в теме
(6) а что мне делать с этим полученным json, мне то клиенту чек нужно отправить, в виде текста JSON я думаю не подойдёт
8. spacecraft 27.02.21 09:23 Сейчас в теме
(7) в условиях про "мне то клиенту чек нужно отправить" не было. По этому и указал, что "возможно". Я вам варианты даю, а не решаю за вас. Возможно, что по полученным данным json достаточно формировать свой табличный документ. Варианты есть. Но всех условий отсюда не видно.
10. GrafB 10 27.02.21 09:27 Сейчас в теме
(8) в заголовке написал, что pdf хочу получить. в принципе конечно можно попробовать нарисовать документ по JSON, если ничего не выйдет. надо будет сначала кстати и проверить приходит ли инфа по чеку в json формате.
11. spacecraft 27.02.21 09:34 Сейчас в теме
(10) ну а "ResponseBody" пробовали?
12. GrafB 10 28.02.21 12:15 Сейчас в теме
(11) да, ResponseBody то же самое тип не поддерживается, но оно и верно в переменную то пдф я думаю не засунешь, нужно что-то типа ResponseBody().SaveAs(путь). так было бы идеально :)
9. GrafB 10 27.02.21 09:24 Сейчас в теме
(3)
так самого главного не привели: url.

с ним всё норм, копирую вставляю в браузер, выскакивает окно авторизации, ввожу логин пароль и сразу начинается скачивание файла
13. GrafB 10 03.03.21 12:53 Сейчас в теме
похоже всё таки файл я получаю в ResponseText(), но не могу его сохранить, пытался так:
	oADOStream = СоздатьОбъект("ADODB.Stream");
		oADOStream.Open(); 
		oADOStream.Write(ОтправЧек.ResponseText());
		oADOStream.SaveToFile(ПутьКФайлуОтвета,2);
		oADOStream.Close();


получаю ошибку:
oADOStream.Write(ОтправЧек.ResponseText());: WinHttp.WinHttpRequest: Символ Юникода не имеет сопоставления в конечной многобайтовой кодовой странице.
14. GrafB 10 03.03.21 15:25 Сейчас в теме
новые вводные: сменил "WinHttp.WinHttpRequest.5.1" на "Msxml2.ServerXMLHTTP". в ResponseText() вижу начало pdf файла, а может он там весь, но 1с его не получает, куда бы копнуть дальше:
%PDF-1.4
%??1 0 obj
<</Creator (Chromium)
/Producer (Skia/PDF m76)
/CreationDate (D:20210303100233+00'00')
/ModDate (D:20210303100233+00'00')>>
endobj
3 0 obj
<</ca 1
/BM /Normal>>
endobj
5 0 obj
<</Type /XObject
/Subtype /Image
/Width 184
/Height 184
/ColorSpace /DeviceRGB
/SMask 6 0 R
/BitsPerComponent 8
/Filter /FlateDecode
/Length 121>> stream
x??
Показать


написал на 8ке, всё срабатывает вот так:
	ОтветHTTP = HTTPСоединение.ОтправитьДляОбработки(ЗапросHTTP);
		ДвоичныеДанные = ОтветHTTP.ПолучитьТелоКакДвоичныеДанные();
		ДвоичныеДанные.Записать("D:\temp\1.pdf");
15. GrafB 10 04.03.21 15:57 Сейчас в теме
победил через скрипт:
Если ОтправЧек.status = 200 Тогда
				
		Scr = СоздатьОбъект("MSScriptControl.ScriptControl");
        Scr.Language = "vbscript";
        ТекстМодуля = "
        |Sub SaveToFile(ByRef FileName, ByRef WinHttp)
        |    Set Stream = CreateObject(""ADODB.Stream"")
        |    Stream.Type = 1
        |    Stream.Mode = 3
        |    Stream.Open
        |    Stream.Write WinHttp.responseBody
        |    Stream.SaveToFile FileName, 2
        |    Stream.Close
        |End Sub";

        Scr.AddCode(ТекстМодуля);

        Scr.Run("SaveToFile",ПутьКФайлуОтвета,ОтправЧек);
	
	Иначе
Показать
Юджин58; isnail; dvk09; +3 Ответить
16. dvk09 2 26.03.21 11:09 Сейчас в теме
(15) Молодец, пока читал вниз, хотел посоветовать именно скрипт, только js предложил бы))
17. dvk09 2 26.03.21 11:11 Сейчас в теме
(16) Ну и на самом деле я бы все завернул в скрипт, и обращение к серверу тоже.
18. GrafB 10 02.04.21 12:22 Сейчас в теме
(17) только начал изучать Java, может скоро всё в скрипте начну писать, даже запросы к дбф :)
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот