При автоматизации бизнес-процессов в 1С часто возникает необходимость загружать файлы с внешних ресурсов: прайс-листы поставщиков, каталоги картинок, файлы обновлений или нормативно-справочную информацию. Однако обычная попытка скачать файл по прямой ссылке нередко оборачивается неудачей. Вместо ожидаемого документа на диск сохраняется поврежденный файл размером в 1 Кб, либо система выдает ошибку доступа: "Ошибка работы с Интернет: доступ запрещен (403)".
В рамках этой статьи мы подробно разберем, почему возникает эта проблема, проанализируем типичные синтаксические ошибки разработчиков при работе с сетевыми протоколами и рассмотрим два надежных способа скачивания файлов: с использованием низкоуровневых объектов платформы HTTPСоединение и с помощью готовых механизмов Библиотеки Стандартных Подсистем (БСП).
Код состояния 403 Forbidden означает, что веб-сервер понял ваш запрос, но категорически отказывается его выполнять. Когда вы пытаетесь скачать файл через обычный веб-браузер (например, Google Chrome или Яндекс.Браузер), скачивание проходит успешно. Но как только этот же URL передается в 1С, сервер мгновенно блокирует запрос. Происходит это по следующим причинам:
User-Agent, который идентифицирует операционную систему и движок браузера. Платформа 1С по умолчанию либо не отправляет этот заголовок вообще, либо передает в нем строку вида 1C+Enterprise. Защита сайта расценивает такой запрос как активность нежелательного поискового робота или парсера и блокирует его.КопироватьФайл() крайне проста в использовании, но абсолютно негибка. Она не позволяет передавать пользовательские HTTP-заголовки, настраивать параметры авторизации, работать со сложными SSL-сертификатами или использовать прокси-сервер. Для работы с современными защищенными сайтами этот метод не подходит.https://... через обычное незащищенное соединение приведет либо к ошибке со стороны платформы, либо к сбросу сессии сервером.Рассмотрим пример кода, с помощью которого часто пытаются решить задачу начинающие разработчики:
Соединение = Новый HTTPСоединение("http://www.duim.ru");
Соединение.Получить("https://www.duim.ru/upload/iblock/286/duim_price_05_10_2018.xlsx", "C:\Новая папка\2018.xlsx");
В этом коротком фрагменте кода допущено сразу три критические ошибки:
HTTPСоединение первым параметром должно передаваться исключительно имя хоста (домен или IP-адрес), например, "www.duim.ru". Указывать префиксы http:// или https:// здесь категорически запрещено.Получить() (или объект HTTPЗапрос) в качестве первого параметра ожидает относительный путь к файлу на сервере, начиная от корня (например, "/upload/iblock/..."), а не полный интернет-адрес.Чтобы гарантированно обойти блокировки веб-сервера, мы должны сымитировать поведение реального браузера. Для этого нам понадобится использовать связку объектов HTTPСоединение, HTTPЗапрос и ЗащищенноеСоединениеOpenSSL. Разберем этот процесс по шагам.
Рассмотрим готовый шаблон функции для скачивания файлов:
Функция СкачатьФайлС Сайта(Знач ПолныйURL, Знач ПутьДляСохранения) Экспорт
// Шаг 1. Парсинг URL-адреса для разделения хоста и пути к файлу
// Для надежности уберем префиксы протокола, если они есть
ВременныйURL = СократитьЛП(ПолныйURL);
Если Лев(ВременныйURL, 8) = "https://" Тогда
ИспользоватьSSL = Истина;
ВременныйURL = Сред(ВременныйURL, 9);
ИначеЕсли Лев(ВременныйURL, 7) = "http://" Тогда
ИспользоватьSSL = Ложь;
ВременныйURL = Сред(ВременныйURL, 8);
Иначе
ИспользоватьSSL = Истина; // По умолчанию предполагаем безопасное соединение
КонецЕсли;
// Выделяем имя сервера и относительный путь
ПозицияСлэша = Найти(ВременныйURL, "/");
Если ПозицияСлэша = 0 Тогда
ЗаписатьЛогСобытий("Некорректный URL-адрес файла.");
Возврат Ложь;
КонецЕсли;
ИмяСервера = Лев(ВременныйURL, ПозицияСлэша - 1);
ПутьКФайлу = Сред(ВременныйURL, ПозицияСлэша);
// Шаг 2. Настройка защищенного SSL-соединения
ЗащищенноеСоединение = Неопределено;
Если ИспользоватьSSL Тогда
// Используем системные сертификаты операционной системы
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
КонецЕсли;
// Шаг 3. Создание HTTP-соединения
Попытка
Порт = ?(ИспользоватьSSL, 443, 80);
Соединение = Новый HTTPСоединение(ИмяСервера, Порт, , , , , ЗащищенноеСоединение);
Исключение
ЗаписатьЛогСобытий("Ошибка инициализации соединения: " + ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
// Шаг 4. Формирование HTTP-запроса с подменой заголовков (User-Agent)
Заголовки = Новый Соответствие;
// Передаем заголовок реального современного браузера Google Chrome на Windows 10
Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36");
Заголовки.Вставить("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
Запрос = Новый HTTPЗапрос(ПутьКФайлу, Заголовки);
// Шаг 5. Получение и сохранение файла на диск
Попытка
Ответ = Соединение.Получить(Запрос, ПутьДляСохранения);
// Анализируем HTTP-код ответа сервера
Если Ответ.КодСостояния = 200 Тогда
Возврат Истина; // Файл успешно сохранен по указанному пути
Иначе
// Если сервер вернул ошибку, мы можем прочитать тело ответа для диагностики
ТекстОшибкиСервера = Ответ.ПолучитьТелоКакСтроку("UTF-8");
ЗаписатьЛогСобытий(СтрШаблон("Ошибка сервера (%1): %2", Ответ.КодСостояния, ТекстОшибкиСервера));
Возврат Ложь;
КонецЕсли;
Исключение
ЗаписатьЛогСобытий("Сетевая ошибка при получении файла: " + ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
КонецФункции
Этот метод полностью решает проблему ручной настройки сетевого окружения, позволяет без проблем обходить базовые фильтры защиты сайтов и корректно работает со всеми типами файлов, будь то .xlsx, .csv, .xml или картинки.
Если вы работаете в любой современной типовой конфигурации 1С (такой как 1С:Бухгалтерия, 1С:Управление торговлей или 1С:ERP), вам не нужно писать код парсинга URL-адресов и настройки сокетов вручную. В составе БСП уже есть мощная и отлаженная подсистема "Получение файлов из Интернета".
Преимущества использования БСП очевидны:
HTTPСоединение при получении редиректа просто вернет пустой ответ, и вам придется писать логику повторного запроса самостоятельно. БСП делает это автоматически под капотом.Посмотрим на практический пример использования функций БСП для решения нашей задачи:
&НаСервере
Процедура СкачатьФайлЧерезБСП(Знач URLИсточника, Знач ПутьДляСохранения)
// Инициализируем стандартные параметры получения файла
ПараметрыПолучения = ПолучениеФайловИзИнтернетаКлиентСервер.ПараметрыПолученияФайла();
ПараметрыПолучения.ПутьДляСохранения = ПутьДляСохранения;
// Обязательно указываем User-Agent в параметрах заголовков, чтобы избежать ошибки 403
ПараметрыПолучения.Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)");
// Выполняем скачивание на стороне сервера
Результат = ПолучениеФайловИзИнтернета.СкачатьФайлНаСервере(URLИсточника, ПараметрыПолучения);
// Проверяем результат выполнения операции
Если Результат.Статус Тогда
ЗаписатьЛогСобытий("Файл успешно скачан средствами БСП по пути: " + Результат.Путь);
Иначе
ЗаписатьЛогСобытий("Ошибка при скачивании через БСП: " + Результат.СообщениеОбОшибке);
КонецЕсли;
КонецПроцедуры
Использование БСП значительно сокращает количество строк кода, снижает вероятность возникновения ошибок "человеческого фактора" и гарантирует стабильную работу механизма загрузки при обновлении платформы.
Начиная с версии платформы 8.3.10, фирма 1С существенно ужесточила правила валидации SSL-сертификатов внешних веб-ресурсов при установке защищенного соединения. Если целевой сайт использует самоподписанный SSL-сертификат, устаревшие протоколы шифрования (например, TLS 1.0 или 1.1) или цепочка доверия его сертификата нарушена, платформа прервет операцию скачивания с ошибкой "Удаленный узел не прошел проверку".
Если вы на 100% уверены в безопасности целевого ресурса и вам требуется обойти жесткую проверку подлинности сертификатов (например, при тестировании в закрытом локальном контуре), вы можете инициализировать объект защищенного соединения без валидации цепочки сертификатов:
// Создание защищенного соединения без проверки сертификатов сервера
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);
Важно: Не рекомендуется использовать отключение проверки сертификатов в рабочей среде (продакшене) для публичных сайтов, так как это подвергает вашу систему риску атак типа Man-in-the-Middle (перехват данных злоумышленниками).