В этой статье разберем распространенную ситуацию: при попытке скачать файл из Ozon по предоставленной временной ссылке (URL) в браузере все работает отлично, но при выполнении той же операции из 1С с помощью объекта HTTPСоединение возникает ошибка «Превышение времени ожидания». Проанализируем возможные причины и найдем решение проблемы.
Изначальная проблема выглядит так: есть временная ссылка на PDF-файл, сгенерированная Ozon. При попытке скачать ее средствами 1С код не отрабатывает, завершаясь по таймауту.
Вот пример кода, который вызывает ошибку:
// Исходная ссылка хранится в реквизите "Реквизит1"
Соединение = Новый HTTPСоединение("cdn1.ozone.ru",443, , , , , Новый ЗащищенноеСоединениеOpenSSL);
ВременныйФайл = ПолучитьИмяВременногоФайла("pdf");
HTTPЗапрос = Новый HTTPЗапрос;
HTTPЗапрос.АдресРесурса = Реквизит1; // Здесь передается вся ссылка целиком
// На этой строке возникает ошибка "Превышение времени ожидания"
ОтветHTTP = Соединение.Получить(HTTPЗапрос, ВременныйФайл);
Давайте по шагам разберемся, почему так происходит и как это исправить.
Первая мысль, которая приходит в голову, — это проблема в коде 1С. Однако если ссылка валидна, то чаще всего причина кроется не в самом коде, а во внешней среде, в которой он выполняется. Главное различие между загрузкой в браузере и в 1С — это контекст выполнения запроса.
Браузер — это доверенное приложение в большинстве корпоративных сетей. Для него, как правило, настроены все необходимые разрешения для доступа в интернет. Процесс 1С (1cv8.exe или 1cv8c.exe) для сетевых фильтров является обычным приложением, которому по умолчанию могут быть запрещены исходящие соединения с неизвестными ресурсами.
Основной «подозреваемый» в нашей ситуации — это корпоративные сетевые ограничения:
Эти ограничения и объясняют, почему в браузере все работает, а 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Запрос, ВременныйФайл);
Сообщить("Файл успешно скачан во временный каталог: " + ВременныйФайл);
Исключение
Сообщить("Не удалось скачать файл. Описание ошибки: " + ОписаниеОшибки());
КонецПопытки;
Если даже с этим кодом ошибка таймаута сохраняется, переходим к следующему шагу.
Диагностика с помощью утилиты 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-запросов или файрвола.
Настройка прокси-сервера в 1С
Если в вашей компании используется прокси-сервер, его параметры нужно явно указать в 1С. Для этого используется объект ИнтернетПрокси, который передается при создании HTTPСоединение. Уточните параметры прокси (адрес, порт, логин и пароль) у ваших системных администраторов.
// Уточните параметры у системного администратора
Прокси = Новый ИнтернетПрокси;
Прокси.Установить("http", "proxy.mycompany.ru", 8080, "ИмяПользователя", "Пароль");
// Передаем настроенный прокси в соединение
Соединение = Новый HTTPСоединение("cdn1.ozone.ru", 443, , , Прокси, 60, Новый ЗащищенноеСоединениеOpenSSL());
// ... дальнейший код без изменений
Обращение к системным администраторам (ключевое решение)
Как показала практика, именно этот шаг решил проблему. После того как диагностика с помощью cURL подтвердила наличие сетевой блокировки, необходимо обратиться в IT-отдел.
Сформулируйте запрос для администраторов максимально четко:
«Добрый день. При попытке программного скачивания файла из 1С с ресурса cdn1.ozone.ru (протокол HTTPS, порт 443) возникает ошибка таймаута. При этом в браузере ссылка открывается. Проверка через утилиту cURL также не проходит. Просьба проверить правила корпоративного файрвола и/или прокси-сервера и, если необходимо, добавить в исключения исходящие запросы от процесса 1С (1cv8.exe, 1cv8c.exe) к хосту cdn1.ozone.ru.»
В рассмотренном случае системные администраторы внесли необходимые правки в сетевые политики, и после этого исходный код на 1С заработал без каких-либо изменений.
В завершение рассмотрим технические особенности ссылок, которые предоставляет Ozon. Это так называемые «подписанные» или временные URL (Pre-signed URLs), которые генерируются для временного доступа к файлам в облачных хранилищах (например, Amazon S3).
X-Amz-Expires (в примере — 3600 секунд, т.е. 1 час). Если вы попытаетесь использовать ссылку после истечения этого срока, получите ошибку доступа.User-Agent. Если вы столкнетесь с проблемами доступа даже при открытой сети, попробуйте добавить в HTTP-запрос заголовок, имитирующий браузер:
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С, когда в браузере все в порядке, указывает на блокировку со стороны корпоративной сети.