Как скачать файл с внешнего сайта из 1С 8.3 и обойти ошибку 403 Forbidden?

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

При автоматизации бизнес-процессов в 1С часто возникает необходимость загружать файлы с внешних ресурсов: прайс-листы поставщиков, каталоги картинок, файлы обновлений или нормативно-справочную информацию. Однако обычная попытка скачать файл по прямой ссылке нередко оборачивается неудачей. Вместо ожидаемого документа на диск сохраняется поврежденный файл размером в 1 Кб, либо система выдает ошибку доступа: "Ошибка работы с Интернет: доступ запрещен (403)".

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

Выясняем причину: почему сервер возвращает ошибку 403 Forbidden?

Код состояния 403 Forbidden означает, что веб-сервер понял ваш запрос, но категорически отказывается его выполнять. Когда вы пытаетесь скачать файл через обычный веб-браузер (например, Google Chrome или Яндекс.Браузер), скачивание проходит успешно. Но как только этот же URL передается в 1С, сервер мгновенно блокирует запрос. Происходит это по следующим причинам:

  1. Отсутствие или некорректный заголовок User-Agent. Веб-серверы и системы защиты (такие как Cloudflare, Stormwall или DDoS-Guard) анализируют HTTP-заголовки входящих запросов. Браузер всегда отправляет заголовок User-Agent, который идентифицирует операционную систему и движок браузера. Платформа 1С по умолчанию либо не отправляет этот заголовок вообще, либо передает в нем строку вида 1C+Enterprise. Защита сайта расценивает такой запрос как активность нежелательного поискового робота или парсера и блокирует его.
  2. Использование устаревшего метода КопироватьФайл(). Встроенная функция платформы КопироватьФайл() крайне проста в использовании, но абсолютно негибка. Она не позволяет передавать пользовательские HTTP-заголовки, настраивать параметры авторизации, работать со сложными SSL-сертификатами или использовать прокси-сервер. Для работы с современными защищенными сайтами этот метод не подходит.
  3. Игнорирование защищенного соединения HTTPS. Большинство современных сайтов полностью перешли на протокол шифрования SSL/TLS. Попытка обратиться к ресурсу https://... через обычное незащищенное соединение приведет либо к ошибке со стороны платформы, либо к сбросу сессии сервером.

Разбор типичных ошибок в коде

Рассмотрим пример кода, с помощью которого часто пытаются решить задачу начинающие разработчики:


Соединение = Новый HTTPСоединение("http://www.duim.ru");
Соединение.Получить("https://www.duim.ru/upload/iblock/286/duim_price_05_10_2018.xlsx", "C:\Новая папка\2018.xlsx");

В этом коротком фрагменте кода допущено сразу три критические ошибки:

Решение №1: Скачивание файла через HTTPСоединение с подменой User-Agent

Чтобы гарантированно обойти блокировки веб-сервера, мы должны сымитировать поведение реального браузера. Для этого нам понадобится использовать связку объектов 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 или картинки.

Решение №2: Использование стандартных подсистем (БСП)

Если вы работаете в любой современной типовой конфигурации 1С (такой как 1С:Бухгалтерия, 1С:Управление торговлей или 1С:ERP), вам не нужно писать код парсинга URL-адресов и настройки сокетов вручную. В составе БСП уже есть мощная и отлаженная подсистема "Получение файлов из Интернета".

Преимущества использования БСП очевидны:

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


&НаСервере
Процедура СкачатьФайлЧерезБСП(Знач URLИсточника, Знач ПутьДляСохранения)

    // Инициализируем стандартные параметры получения файла
    ПараметрыПолучения = ПолучениеФайловИзИнтернетаКлиентСервер.ПараметрыПолученияФайла();
    ПараметрыПолучения.ПутьДляСохранения = ПутьДляСохранения;
    
    // Обязательно указываем User-Agent в параметрах заголовков, чтобы избежать ошибки 403
    ПараметрыПолучения.Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)");
    
    // Выполняем скачивание на стороне сервера
    Результат = ПолучениеФайловИзИнтернета.СкачатьФайлНаСервере(URLИсточника, ПараметрыПолучения);
    
    // Проверяем результат выполнения операции
    Если Результат.Статус Тогда
        ЗаписатьЛогСобытий("Файл успешно скачан средствами БСП по пути: " + Результат.Путь);
    Иначе
        ЗаписатьЛогСобытий("Ошибка при скачивании через БСП: " + Результат.СообщениеОбОшибке);
    КонецЕсли;

КонецПроцедуры

Использование БСП значительно сокращает количество строк кода, снижает вероятность возникновения ошибок "человеческого фактора" и гарантирует стабильную работу механизма загрузки при обновлении платформы.

Важные нюансы безопасности SSL/TLS в новых версиях платформы 1С

Начиная с версии платформы 8.3.10, фирма 1С существенно ужесточила правила валидации SSL-сертификатов внешних веб-ресурсов при установке защищенного соединения. Если целевой сайт использует самоподписанный SSL-сертификат, устаревшие протоколы шифрования (например, TLS 1.0 или 1.1) или цепочка доверия его сертификата нарушена, платформа прервет операцию скачивания с ошибкой "Удаленный узел не прошел проверку".

Если вы на 100% уверены в безопасности целевого ресурса и вам требуется обойти жесткую проверку подлинности сертификатов (например, при тестировании в закрытом локальном контуре), вы можете инициализировать объект защищенного соединения без валидации цепочки сертификатов:


// Создание защищенного соединения без проверки сертификатов сервера
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);

Важно: Не рекомендуется использовать отключение проверки сертификатов в рабочей среде (продакшене) для публичных сайтов, так как это подвергает вашу систему риску атак типа Man-in-the-Middle (перехват данных злоумышленниками).

← На главную