Работаю с внешним API. Отправляю запрос и получаю ответ. В описании: "Метод позволяет скачать файл. При скачивании содержимое файла отдаётся в виде потока, название файла отдаётся в HTTP заголовке Content-Disposition." В потоке файл и я не могу разобраться как его сохранить.
---
Тут используется старый синтаксис HTTP_Соединение.Получить(АдресСкрипта, ИмяФайлаОтвета).

Лучше использовать новый:

```1c
    Ответ = HTTP_Соединение.Получить(АдресСкрипта);
    Если Ответ.КодСостояния=200 Тогда
    ДвоичныеДанные = Ответ.ПолучитьТелоКакДвоичныеДанные();

    //если возвращается текст, то можно двоичные данные преобразовать в строку:
    Текст = ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанные,КодировкаТекста.UTF8);

    // Ответ.Заголовки["Content-Type"] - поможет определить тип данных в теле ответа

    КонецЕсли;
```
---
Ответ = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
ДвоичныеДанные = Ответ.ПолучитьТелоКакДвоичныеДанные();
---
{RetailCRMИнтеграция Обработка.crm_RetailCRMОбработка.МодульОбъекта(755)}: Метод объекта не обнаружен (ПолучитьТелоКакДвоичныеДанные). Я так понял, что запрос делается в формате JSON. Возвращается массив.
---
Значит у вас в Ответ, совсем не ответ)
---
1. Уточнение: т.к. метод GET, то нужно использовать:

```1c
    Ответ = HTTPСоединение.Получить(HTTPЗапрос);
    ДвоичныеДанные = Ответ.ПолучитьТелоКакДвоичныеДанные();
```

2. Как у вас выполняется http-запрос? Код в студию

3. В API написано "в виде потока", т.е. никак не JSON.
---
```1c
    &НаСервере
    Функция ПолучитьФайлыПоИД(МассивИД) Экспорт

    Если МассивИД.Количество() = 0 Тогда
    Возврат Неопределено;
    КонецЕсли;

    МассивФайлов = Новый Массив;

    СтрокаФайлИД = ";
    Для Каждого ФайлИД из МассивИД Цикл
    СтрокаФайлИД = СтрокаФайлИД + "filter[orderIds][]=" + ФайлИД + "&";
    КонецЦикла;

    СтрокаФайлИД = ?(Прав(СтрокаФайлИД, 1) = "&", Лев(СтрокаФайлИД, СтрДлина(СтрокаФайлИД) - 1), СтрокаФайлИД);

    ApiKey = crm_RetailCRMОбщий.ПолучитьЗначениеКонстанты("КлючCRM");
    АдресСкриптаФайл = "/api/v5/files?" + СтрокаФайлИД + "&limit=100&apiKey=" + ApiKey;

    ОтветФайл = ЗапросCRM(АдресСкриптаФайл);

    Для Каждого Файл из ОтветФайл["files"] Цикл
    АдресСкриптаЗагрузкиФайла = "/api/v5/files/" + Файл["id"] + "/download?apiKey=" + ApiKey;
    ЗагрузкаФайл = ЗапросCRM(АдресСкриптаЗагрузкиФайла);
    МассивФайлов.Добавить(Файл);
    КонецЦикла;

    Возврат МассивФайлов

    КонецФункции
```
---
Сообщение было скрыто модератором.
---
а функция ЗапросCRM() ?
---
```1c
    &НаСервере
    Функция ЗапросCRM(АдресСкрипта)

    Сообщить("Запрос к RetailCRM ...");
    ответ = crm_RetailCRMОбщий.HTTPзапросGET(crm_RetailCRMОбщий.ПолучитьЗначениеКонстанты("ИмяСервера"),АдресСкрипта);
    Сообщить("Разбор ответа ...");

    Возврат crm_RetailCRMОбщий.UnJSON(ответ);

    КонецФункции

    Функция HTTPзапросGET(АдресСервера,АдресСкрипта) Экспорт

    ssl = Новый ЗащищенноеСоединениеOpenSSL(Неопределено,Неопределено);

    HTTP_Соединение = Новый HTTPСоединение(АдресСервера,,,,,,ssl);

    ИмяФайлаОтвета = ПолучитьИмяВременногоФайла();
    HTTP_Соединение.Получить(АдресСкрипта,ИмяФайлаОтвета);
    ФайлОтвета = Новый Файл(ИмяФайлаОтвета);
    ТекстОтвета = Новый ТекстовыйДокумент();
    ТекстОтвета.Прочитать(ИмяФайлаОтвета,"utf-8");

    возврат ТекстОтвета.ПолучитьТекст();

    КонецФункции
```
---
Тут используется старый синтаксис HTTP_Соединение.Получить(АдресСкрипта, ИмяФайлаОтвета).

Лучше использовать новый:

```1c
    Ответ = HTTP_Соединение.Получить(АдресСкрипта);
    Если Ответ.КодСостояния=200 Тогда
    ДвоичныеДанные = Ответ.ПолучитьТелоКакДвоичныеДанные();

    //если возвращается текст, то можно двоичные данные преобразовать в строку:
    Текст = ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанные,КодировкаТекста.UTF8);

    // Ответ.Заголовки["Content-Type"] - поможет определить тип данных в теле ответа

    КонецЕсли;
```
---
Он то не старый, просто как один из вариантов. Я и не думал, что хто то его использует ч-з врем. файл, а оказывается используют.
---
Именно старый. Использовался до 8.3.3. Оставлен для совместимости.
---
Спасибо, буду знать. Не доводилось работать с http на ранних платформах
---
Предложено в рамкам расширения в начале этого года. Вероятно переработанное решение для старых систем. Никто не хочет писать с нуля, поэтому такие вещи встречаются и будут вероятно встречаться.
---
Наверно будут, но я бы переписывал такую конструкцию без использования вр. файла. Это ж нетрудно
---
Да, займусь этим, пока занят другими задачами. Как опробую - дам знать. Для меня это пока тёмный лес.
---
Ответ Сделал так:

```1c
    Функция HTTPзапросGETfiles(АдресСервера,АдресСкрипта) Экспорт

    SSL = Новый ЗащищенноеСоединениеOpenSSL(Неопределено,Неопределено);
    HTTP_Соединение = Новый HTTPСоединение(АдресСервера,,,,,,SSL);
    ИмяФайлаОтвета = ПолучитьИмяВременногоФайла();
    Ответ = HTTP_Соединение.Получить(АдресСкрипта);
    Если Ответ.КодСостояния = 200 Тогда
    ДвоичныеДанные = Ответ.ПолучитьТелоКакДвоичныеДанные();
    КонецЕсли;

    Возврат ДвоичныеДанные;

    КонецФункции
```

Но ДвоичныеДанные = Неопределено, хотя в Ответ приходят данные.
---
А http-запрос где?

```1c
    SSL = Новый ЗащищенноеСоединениеOpenSSL(Неопределено,Неопределено);
    HTTP_Соединение = Новый HTTPСоединение(АдресСервера,,,,,,SSL);
    Запрос = Новый HTTPЗапрос(АдресСкрипта);
    Ответ = HTTP_Соединение.Получить(Запрос);
    Если Ответ.КодСостояния = 200 Тогда
    ДвоичныеДанные = Ответ.ПолучитьТелоКакДвоичныеДанные();
    КонецЕсли;
```
---
В каком смысле? Всё в коде вроде...
---
Всё, понял, что не так. Вроде получилось. Но файл не типизирован.
---
Какой файл? вы должны сами знать, какого типа двоичные данные получаете, либо смотреть в заголовках ответа, если сервис это передает
---
Но файл не типизирован
Конечно, ведь получили просто двоичные данные (набор байт).
Из описания API метода: "название файла отдаётся в HTTP заголовке Content-Disposition"
Этих данных должно быть достаточно.
---
Получаю Ответ.Заголовки["Content-Disposition"]. Это строка, но СтрНайти там не работает. Выдает 0 на любой параметр.
---
Больше кода.
---
СтрНайти("filename",Ответ.Заголовки["Content-Disposition"]) возвращает 0, хотя значение "attachment; filename=test.docx; filename*=utf-8''%D0%A2%D0%B5%D1%81%D1%82.docx"
---
параметры СтрНайти поменять местами. Вначале Где ищем, затем что ищем.
---
Вот это фэйл XD Всё, мозг закипел... Спасибо.
---
Вот такую структуру возвращает