Как правильно получать и сохранять PDF-файл через HTTP-сервис в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Часто при разработке интеграций в 1С возникает задача получения файла (например, PDF-документа) с внешнего веб-ресурса. Однако при попытке реализовать это через объект HTTPСоединение многие разработчики сталкиваются с тем, что вместо корректного документа сохраняется поврежденный файл или пустая страница. Разберем детально, почему это происходит и как правильно организовать процесс загрузки.

Анализируем причину возникновения ошибки 302

Основная причина, по которой файл не открывается, кроется в коде состояния ответа сервера. Если вы получили код 302 (Found), это означает, что сервер сообщает о временном перемещении ресурса по другому адресу. Браузеры обрабатывают такие перенаправления автоматически, следуя за заголовком Location, тогда как платформа 1С при использовании ОтправитьДляОбработки ожидает, что ресурс доступен непосредственно по указанному пути.

В результате, вместо содержимого PDF-файла, в вашу папку на диске записывается HTML-текст (ответ сервера с сообщением о перенаправлении), который вы пытаетесь открыть программой для чтения PDF. Естественно, это приводит к ошибке формата. Также важно проверять заголовки ответа: если в Content-Type вы видите text/html вместо application/pdf, это верный признак того, что вы сохранили «мусор» вместо файла.

Разбираем алгоритм решения проблемы

Для корректной работы с HTTP-запросами и редиректами рекомендуем придерживаться следующего алгоритма:

  1. Анализ ответа: Всегда проверяйте код состояния. Если получен ответ в диапазоне 300–399, значит, требуется обработка перенаправления.
  2. Извлечение заголовка: Считайте содержимое заголовка Location из ответа сервера — именно там указан путь к конечному ресурсу.
  3. Повторный запрос: Выполните новый запрос по URL, полученному из заголовка.
  4. Авторизация и сессии: Если запрос требует авторизации, убедитесь, что вы корректно передаете Cookie, полученные при первой попытке обращения к серверу.

Реализация обработки редиректа в 1С

Посмотрим на пример того, как можно организовать проверку и повторный запрос при получении кода перенаправления:


// Инициализация соединения
Соединение = Новый 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. Сессионные данные: При выполнении нескольких последовательных запросов (когда происходит редирект), важно сохранять контекст сессии. Сервер часто ожидает, что вы передадите куки, которые он прислал в первом ответе. Используйте Соответствие для хранения заголовков и передачи их в последующих запросах.

Надеемся, что эти шаги помогут вам успешно автоматизировать получение файлов и избавиться от проблем с их открытием!

← На главную