1С 7. Получить pdf-файл через GET-запрос
Добрый день, не могу настроить простенький 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: Тип переменой не поддерживается
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(3) думаю это мало поможет, статус 200 возвращается, т.е. я так понимаю pdf прилетает, но не знаю где и как его поймать обработать(сохранить).
ЗЫ: в авторизации тоже Content-Length как строка, но отрабатывает. Попробовал поменять на число ничего не изменилось.
ЗЫ: в авторизации тоже Content-Length как строка, но отрабатывает. Попробовал поменять на число ничего не изменилось.
(5) ясно. ОтправЧек.ResponseStream это поток. Из 1С невозможно работать с этим потоком. Тут только ResponseBody подходит. Но и то не факт, что нормально будет.
Но, возможно, проще будет работать с получением в формате json и метод ResponseText. Будет отрабатывать вполне корректно.
Но, возможно, проще будет работать с получением в формате json и метод ResponseText. Будет отрабатывать вполне корректно.
(7) в условиях про "мне то клиенту чек нужно отправить" не было. По этому и указал, что "возможно". Я вам варианты даю, а не решаю за вас. Возможно, что по полученным данным json достаточно формировать свой табличный документ. Варианты есть. Но всех условий отсюда не видно.
похоже всё таки файл я получаю в ResponseText(), но не могу его сохранить, пытался так:
получаю ошибку:
oADOStream = СоздатьОбъект("ADODB.Stream");
oADOStream.Open();
oADOStream.Write(ОтправЧек.ResponseText());
oADOStream.SaveToFile(ПутьКФайлуОтвета,2);
oADOStream.Close();
получаю ошибку:
oADOStream.Write(ОтправЧек.ResponseText());: WinHttp.WinHttpRequest: Символ Юникода не имеет сопоставления в конечной многобайтовой кодовой странице.
новые вводные: сменил "WinHttp.WinHttpRequest.5.1" на "Msxml2.ServerXMLHTTP". в ResponseText() вижу начало pdf файла, а может он там весь, но 1с его не получает, куда бы копнуть дальше:
написал на 8ке, всё срабатывает вот так:
%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");
победил через скрипт:
Если ОтправЧек.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",ПутьКФайлуОтвета,ОтправЧек);
Иначе
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот