Как скачать файл из Ozon в 1С по временной ссылке, если возникает ошибка таймаута?

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

В этой статье разберем распространенную ситуацию: при попытке скачать файл из Ozon по предоставленной временной ссылке (URL) в браузере все работает отлично, но при выполнении той же операции из 1С с помощью объекта HTTPСоединение возникает ошибка «Превышение времени ожидания». Проанализируем возможные причины и найдем решение проблемы.

Изначальная проблема выглядит так: есть временная ссылка на PDF-файл, сгенерированная Ozon. При попытке скачать ее средствами 1С код не отрабатывает, завершаясь по таймауту.

Вот пример кода, который вызывает ошибку:


// Исходная ссылка хранится в реквизите "Реквизит1"
Соединение = Новый HTTPСоединение("cdn1.ozone.ru",443, , , , , Новый ЗащищенноеСоединениеOpenSSL);
    
ВременныйФайл = ПолучитьИмяВременногоФайла("pdf");
    
HTTPЗапрос = Новый HTTPЗапрос;
HTTPЗапрос.АдресРесурса = Реквизит1; // Здесь передается вся ссылка целиком

// На этой строке возникает ошибка "Превышение времени ожидания"
ОтветHTTP = Соединение.Получить(HTTPЗапрос, ВременныйФайл);

Давайте по шагам разберемся, почему так происходит и как это исправить.

Анализ проблемы: почему браузер скачивает, а 1С — нет?

Первая мысль, которая приходит в голову, — это проблема в коде 1С. Однако если ссылка валидна, то чаще всего причина кроется не в самом коде, а во внешней среде, в которой он выполняется. Главное различие между загрузкой в браузере и в 1С — это контекст выполнения запроса.

Браузер — это доверенное приложение в большинстве корпоративных сетей. Для него, как правило, настроены все необходимые разрешения для доступа в интернет. Процесс 1С (1cv8.exe или 1cv8c.exe) для сетевых фильтров является обычным приложением, которому по умолчанию могут быть запрещены исходящие соединения с неизвестными ресурсами.

Основной «подозреваемый» в нашей ситуации — это корпоративные сетевые ограничения:

Эти ограничения и объясняют, почему в браузере все работает, а 1С получает таймаут — ее запрос просто не выпускают во внешнюю сеть, и соединение «зависает» до истечения времени ожидания.

Шаги для диагностики и решения

Чтобы точно определить причину и устранить ее, выполним несколько диагностических шагов.

  1. Корректировка кода и базовые проверки

    Для начала убедимся, что код 1С написан корректно. В исходном примере есть ошибка: в свойство АдресРесурса объекта HTTPЗапрос передается вся ссылка целиком. Это неверно. При создании объекта HTTPСоединение мы уже указали домен (cdn1.ozone.ru). В АдресРесурса нужно передавать только путь и параметры, то есть все, что идет после домена.

    Также установим явное значение таймаута, например, 60 секунд, чтобы исключить проблемы со слишком коротким временем ожидания.

    Правильный код будет выглядеть так:

    
    // Исходная полная ссылка на файл
    ПолнаяСсылка = "https://cdn1.ozone.ru/s3/supplier-document-parser/BB54D34B-86BF-4EEF-93F0-3BBFAE9F0303?X-Amz-Expires=3600&...";
    
    // 1. Указываем домен, порт, таймаут и защищенное соединение
    Соединение = Новый HTTPСоединение("cdn1.ozone.ru", 443, , , , 60, Новый ЗащищенноеСоединениеOpenSSL());
        
    ВременныйФайл = ПолучитьИмяВременногоФайла("pdf");
        
    // 2. Готовим запрос
    HTTPЗапрос = Новый HTTPЗапрос;
    
    // 3. В АдресРесурса передаем только путь и параметры
    АдресРесурса = СтрЗаменить(ПолнаяСсылка, "https://cdn1.ozone.ru", "");
    HTTPЗапрос.АдресРесурса = АдресРесурса;
        
    Попытка
        // 4. Выполняем запрос
        Соединение.Получить(HTTPЗапрос, ВременныйФайл);
        Сообщить("Файл успешно скачан во временный каталог: " + ВременныйФайл);
    Исключение
        Сообщить("Не удалось скачать файл. Описание ошибки: " + ОписаниеОшибки());
    КонецПопытки;
    

    Если даже с этим кодом ошибка таймаута сохраняется, переходим к следующему шагу.

  2. Диагностика с помощью утилиты cURL

    Чтобы проверить, есть ли доступ к ресурсу с компьютера вне браузера, воспользуемся консольной утилитой cURL. Она есть по умолчанию в современных версиях Windows. Этот тест очень показателен: если cURL тоже не сможет скачать файл, значит, проблема точно не в 1С, а в сетевых ограничениях.

    Откройте командную строку (cmd) и выполните команду, подставив свою ссылку:

    curl -v -o "test.pdf" "ВАША_ДЛИННАЯ_ССЫЛКА_ОТ_OZON"

    Где:

    • -v (verbose) — выведет подробную техническую информацию о процессе соединения.
    • -o "test.pdf" — сохранит результат в файл test.pdf.

    В обсуждаемой ситуации пользователь получил в ответ ошибку "Could not resolve host" (Не удалось определить хост). Это прямое указание на то, что система не может получить IP-адрес домена cdn1.ozone.ru, что почти всегда говорит о блокировке на уровне DNS-запросов или файрвола.

  3. Настройка прокси-сервера в 1С

    Если в вашей компании используется прокси-сервер, его параметры нужно явно указать в 1С. Для этого используется объект ИнтернетПрокси, который передается при создании HTTPСоединение. Уточните параметры прокси (адрес, порт, логин и пароль) у ваших системных администраторов.

    
    // Уточните параметры у системного администратора
    Прокси = Новый ИнтернетПрокси;
    Прокси.Установить("http", "proxy.mycompany.ru", 8080, "ИмяПользователя", "Пароль");
    
    // Передаем настроенный прокси в соединение
    Соединение = Новый HTTPСоединение("cdn1.ozone.ru", 443, , , Прокси, 60, Новый ЗащищенноеСоединениеOpenSSL());
    // ... дальнейший код без изменений
    
  4. Обращение к системным администраторам (ключевое решение)

    Как показала практика, именно этот шаг решил проблему. После того как диагностика с помощью cURL подтвердила наличие сетевой блокировки, необходимо обратиться в IT-отдел.

    Сформулируйте запрос для администраторов максимально четко:

    «Добрый день. При попытке программного скачивания файла из 1С с ресурса cdn1.ozone.ru (протокол HTTPS, порт 443) возникает ошибка таймаута. При этом в браузере ссылка открывается. Проверка через утилиту cURL также не проходит. Просьба проверить правила корпоративного файрвола и/или прокси-сервера и, если необходимо, добавить в исключения исходящие запросы от процесса 1С (1cv8.exe, 1cv8c.exe) к хосту cdn1.ozone.ru.»

    В рассмотренном случае системные администраторы внесли необходимые правки в сетевые политики, и после этого исходный код на 1С заработал без каких-либо изменений.

Особенности работы с временными ссылками Ozon (Pre-signed URLs)

В завершение рассмотрим технические особенности ссылок, которые предоставляет Ozon. Это так называемые «подписанные» или временные URL (Pre-signed URLs), которые генерируются для временного доступа к файлам в облачных хранилищах (например, Amazon S3).


HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса);
HTTPЗапрос.Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36");

Таким образом, успешная загрузка файлов по временным ссылкам требует не только корректного кода, но и внимательной диагностики сетевого окружения. В большинстве случаев ошибка таймаута при работе из 1С, когда в браузере все в порядке, указывает на блокировку со стороны корпоративной сети.

← На главную