Статья больше, как памятка для себя. Возникла потребность получать данные файла с таблицей excel (а впрочем неважно какого файла) по ссылке на какой то ресурс на файловом хранилище. В моём случае это был microsoft onedrive, но принципиально это применимо к любому http запросу.
Файлы, хранимые в облаке, можно было опубликовать для анонимного доступа, выдавалась ссылка, в браузере она отлично открывалась, документ сразу же либо открывался, либо скачивался.
Запрос в 1С возвращает ответ с кодом состояния 301 и в теле запроса html код о том, что требуемый ресурс переехал по некоторой ссылке. Грешным делом, сначала возникла мысль получить ДокументDOM из кода html, выдернуть оттуда содержимое href, но потом хватило ума почитать документацию на MDN: Redirections и Location
Для реализации кодом 1С необходимо, получив код состояния 3хх в httpОтвет, выполнить повторый запрос к тому же серверу, но указать путь к ресурсу из заголовка "Location". Так же, в моём случае, первый ответ возвращал токен аутентификации в заголовке "Set-Cookie", его содержимое должно было попасть в заголовок "Cookie" повторного запроса.
Код получился примерно следующий:
Процедура ПрочитатьДанные()
АдресФайла = "Какой то произвольный URL";
Защита = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);
СтруктураУРИ = ОбщегоНазначенияКлиентСервер.СтруктураURI(АдресФайла);
Попытка
Соединение = Новый HTTPСоединение(СтруктураУРИ.ИмяСервера, , , , , , Защита);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Запрос = Новый HTTPЗапрос(СтруктураУРИ.ПутьНаСервере);
Ответ = ОтправитьЗапрос(Соединение, Запрос);
Если Ответ.КодСостояния = 200 Тогда
//Как то обрабатываем результат
//ДД = Ответ.ПолучитьТелоКакДвоичныеДанные();
//АдресХранилища = ПоместитьВоВременноеХранилище(ДД, Новый УникальныйИдентификатор);
Иначе
//Как то обрабатываем ошибку
АдресХранилища = "";
КонецЕсли;
КонецПроцедуры
Функция ОбработатьРедирект(Соединение, Ответ)
//Предполагаем, что если ушли на редирект, то Location точно есть
Запрос = Новый HTTPЗапрос(Ответ.Заголовки["Location"]);
УстановитьПеченьку = Ответ.Заголовки["Set-Cookie"];
//А вот наличие "Set-Cookie" уже проверяем
Если НЕ УстановитьПеченьку = Неопределено Тогда
Запрос.Заголовки.Вставить("Cookie", УстановитьПеченьку);
КонецЕсли;
//Уходим в рекурсию
Ответ = ОтправитьЗапрос(Соединение, Запрос);
Возврат Ответ;
КонецФункции
&НаСервере
Функция ОтправитьЗапрос(Соединение, Запрос)
Ответ = Соединение.ВызватьHTTPМетод("GET", Запрос);
Если Ответ.КодСостояния = 200 Тогда
//Выходим из рекурсии
Возврат Ответ;
ИначеЕсли Ответ.КодСостояния > 300 И Ответ.КодСостояния < 400 Тогда
//Редирект
Ответ = ОбработатьРедирект(Соединение, Ответ);
ИначеЕсли Ответ.КодСостояния >= 400 Тогда
//Обработка ошибки
Возврат Ответ;
КонецЕсли;
Возврат Ответ;
КонецФункции
Тестировалось на платформе 1С:Предприятие 8.3 (8.3.15.1830).