Часто при разработке интеграций в 1С возникает задача получения файла (например, PDF-документа) с внешнего веб-ресурса. Однако при попытке реализовать это через объект HTTPСоединение многие разработчики сталкиваются с тем, что вместо корректного документа сохраняется поврежденный файл или пустая страница. Разберем детально, почему это происходит и как правильно организовать процесс загрузки.
Основная причина, по которой файл не открывается, кроется в коде состояния ответа сервера. Если вы получили код 302 (Found), это означает, что сервер сообщает о временном перемещении ресурса по другому адресу. Браузеры обрабатывают такие перенаправления автоматически, следуя за заголовком Location, тогда как платформа 1С при использовании ОтправитьДляОбработки ожидает, что ресурс доступен непосредственно по указанному пути.
В результате, вместо содержимого PDF-файла, в вашу папку на диске записывается HTML-текст (ответ сервера с сообщением о перенаправлении), который вы пытаетесь открыть программой для чтения PDF. Естественно, это приводит к ошибке формата. Также важно проверять заголовки ответа: если в Content-Type вы видите text/html вместо application/pdf, это верный признак того, что вы сохранили «мусор» вместо файла.
Для корректной работы с HTTP-запросами и редиректами рекомендуем придерживаться следующего алгоритма:
Location из ответа сервера — именно там указан путь к конечному ресурсу.Cookie, полученные при первой попытке обращения к серверу.Посмотрим на пример того, как можно организовать проверку и повторный запрос при получении кода перенаправления:
// Инициализация соединения
Соединение = Новый HTTPСоединение(Сервер, , , , , 180, ЗащищенноеСоединение);
HTTPЗапрос = Новый HTTPЗапрос(Адрес);
// Выполняем запрос
HTTPОтвет = Соединение.Получить(HTTPЗапрос);
// Проверяем код состояния
КодСостояния = HTTPОтвет.КодСостояния;
Если КодСостояния >= 300 И КодСостояния < 400 Тогда
// Получаем новый адрес из заголовка
НовыйАдрес = HTTPОтвет.Заголовки["Location"];
// Повторяем запрос по новому адресу
HTTPЗапрос = Новый HTTPЗапрос(НовыйАдрес);
HTTPОтвет = Соединение.Получить(HTTPЗапрос);
КонецЕсли;
// Если получили успешный ответ, записываем файл
Если HTTPОтвет.КодСостояния = 200 Тогда
ДанныеФайла = HTTPОтвет.ПолучитьТелоКакДвоичныеДанные();
ДанныеФайла.Записать("C:\TMP\1111.pdf");
КонецЕсли;
Чтобы избежать ошибок при записи, обратите внимание на следующие нюансы:
1. Проверка типа контента: Всегда анализируйте заголовок Content-Type. Если сервер присылает text/html, не пытайтесь сохранить это как PDF. Выведите содержимое тела ответа в журнал регистрации, чтобы понять, какой текст возвращает сервер (возможно, там содержится сообщение об ошибке доступа или неверном пароле).
2. Использование библиотек: Если ваша конфигурация использует БИП (Библиотека Интернет-Поддержки), рассмотрите возможность использования функции ИнтернетПоддержкаПользователей.ЗагрузитьСодержимоеИзИнтернет. В подобных обертках разработчики 1С уже реализовали базовую обработку перенаправлений и работу с протоколами, что значительно упрощает задачу.
3. Использование ПолучитьТелоКакДвоичныеДанные(): Метод ОтправитьДляОбработки хорош, но для полноценного контроля процесса лучше самостоятельно получать двоичные данные через ПолучитьТелоКакДвоичныеДанные() и использовать метод Записать() объекта ДвоичныеДанные. Это дает больше гибкости при обработке исключительных ситуаций.
4. Сессионные данные: При выполнении нескольких последовательных запросов (когда происходит редирект), важно сохранять контекст сессии. Сервер часто ожидает, что вы передадите куки, которые он прислал в первом ответе. Используйте Соответствие для хранения заголовков и передачи их в последующих запросах.
Надеемся, что эти шаги помогут вам успешно автоматизировать получение файлов и избавиться от проблем с их открытием!