Как настроить версию эмуляции Internet Explorer в 1С и правильно скачивать файлы из сети?

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

При интеграции 1С с веб-сервисами или загрузке файлов из интернета разработчики часто сталкиваются с ошибками соединений, блокировками по User-Agent или устаревшим движком отображения страниц. Попытка настроить эмуляцию версии Internet Explorer через системный реестр для методов передачи файлов часто не приносит результата. Разберем по шагам, как устроена работа со встроенным браузером в 1С, почему ключ реестра не влияет на скачивание файлов и какими штатными средствами платформы следует решать задачу загрузки данных.

Почему параметр FEATURE_BROWSER_EMULATION не влияет на метод КопироватьФайл()

Проанализируем механизм работы платформы при выполнении метода КопироватьФайл() и отображении веб-страниц:

  1. Назначение параметра реестра: Ключ FEATURE_BROWSER_EMULATION управляет исключительно компонентом отображения веб-страниц (Microsoft WebBrowser Control / MSHTML), который используется внутри элемента формы ПолеHTMLДокумента. Он определяет, в каком режиме совместимости (IE7, IE8, IE9, IE10 или IE11) будет отображаться верстка страницы.
  2. Механизм работы КопироватьФайл(): При указании веб-адреса в качестве источника метод КопироватьФайл() выполняет базовый сетевой запрос через низкоуровневые библиотеки платформы, минуя компонент WebBrowser. Этот метод не использует движок рендеринга Internet Explorer, не позволяет настраивать HTTP-заголовки (включая User-Agent), обрабатывать авторизацию или сложные сценарии перенаправления (редиректы).

Правильная настройка FEATURE_BROWSER_EMULATION для встроенного браузера 1С

Если перед нами стоит задача заставить элемент формы ПолеHTMLДокумента использовать стандарты современных версий IE (например, IE10 или IE11), необходимо учесть разрядность операционной системы и клиентского приложения 1С.

Рассмотрим нюансы внесения параметров в системный реестр Windows:

  1. Разрядность приложения (32-бит на 64-битной Windows): Если 32-разрядный клиент 1С (x86) запущен на 64-разрядной операционной системе, параметры эмуляции необходимо регистрировать в специальной ветке WOW6432Node:
    HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION
    Для 64-разрядного клиента 1С или на 32-разрядной ОС используется стандартный путь:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION
    Также настройку можно задать в профиле текущего пользователя:
    HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION
  2. Имя исполняемого файла: Внутри ветки необходимо создать параметр типа REG_DWORD, имя которого в точности совпадает с именем исполняемого файла процесса 1С:
    1cv8.exe — для толстого клиента;
    1cv8c.exe — для тонкого клиента;
    rphost.exe — для кода, исполняемого на стороне сервера 1С или в фоновом задании.
  3. Значение параметра: В качестве десятичного значения указывается целевой режим совместимости:
    11001 (0x2AF9) — Internet Explorer 11 (принудительные стандарты Edge);
    10001 (0x2711) — Internet Explorer 10 (принудительные стандарты IE10);
    10000 (0x2710) — Internet Explorer 10 (в зависимости от директивы !DOCTYPE);
    9999 (0x270F) — Internet Explorer 9;
    8888 (0x22B8) — Internet Explorer 8.

Решение проблемы загрузки файлов: объекты HTTPСоединение и HTTPЗапрос

Для гарантированного скачивания файлов с веб-ресурсов, особенно при работе по защищенному протоколу HTTPS и при необходимости передачи пользовательского User-Agent, необходимо использовать специализированные объекты платформы HTTPСоединение и HTTPЗапрос.

Рассмотрим пример кода для загрузки файла с явным указанием необходимых заголовков:


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

// Инициализируем HTTP-соединение с сервером
СерверИсточник = "example.com";
Соединение = Новый HTTPСоединение(СерверИсточник, 443, , , , 30, Защита);

// Формируем запрос с указанием пути к файлу и нужного User-Agent
ОтносительныйПуть = "/files/document.pdf";
Запрос = Новый HTTPЗапрос(ОтносительныйПуть);
Запрос.Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko");

// Указываем локальный путь для сохранения результата
ПутьДляСохранения = "C:\Temp\document.pdf";

// Выполняем загрузку файла напрямую на диск
Попытка
    Ответ = Соединение.Получить(Запрос, ПутьДляСохранения);
    Если Ответ.КодСостояния = 200 Тогда
        // Файл успешно сохранен
    Иначе
        // Обработка ошибки сервера (например, 404 или 403)
    КонецЕсли;
Исключение
    // Обработка ошибок сетевого подключения
КонецПопытки;

Особенности протоколов безопасности в Windows Server 2008 R2

Если сетевой запрос на сервере под управлением Windows Server 2008 R2 завершается ошибкой подключения к защищенному сайту, причина чаще всего заключается в отсутствии поддержки современного протокола TLS 1.2 в системных компонентах по умолчанию. Для устранения этой неполадки выполним следующие действия:

  1. Системные обновления: Проверим установку пакетов обновления Windows, добавляющих поддержку современных криптографических наборов и TLS 1.2 в подсистему Schannel.
  2. Настройка реестра Schannel: Включим использование TLS 1.2 для клиентской части операционной системы в ветке:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client
    Установим параметры: DisabledByDefault = 0 (DWORD) и Enabled = 1 (DWORD).
  3. Системные протоколы WinINet: Убедимся, что параметр DefaultSecureProtocols в ветках интернет-настроек реестра позволяет использовать современные алгоритмы шифрования.

Альтернативный вариант: загрузка через COM-объект WinHttp

В случаях, когда стандартных возможностей платформы недостаточно или требуется тонкая настройка параметров безопасности Windows, скачивание файла можно выполнить с помощью системного COM-объекта WinHttp.WinHttpRequest.5.1.

Посмотрим на пример реализации:


HTTP = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
HTTP.Open("GET", "https://example.com/files/document.pdf", Ложь);
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko");

// Установка флагов поддержки протоколов TLS 1.1 и TLS 1.2 (0x00000800 | 0x00002000)
// Константа 2560 включает поддержку актуальных протоколов
HTTP.Option(9, 2560);

HTTP.Send();

Если HTTP.Status = 200 Тогда
    Поток = Новый COMОбъект("ADODB.Stream");
    Поток.Type = 1; // Двоичные данные (adTypeBinary)
    Поток.Open();
    Поток.Write(HTTP.ResponseBody);
    Поток.SaveToFile("C:\Temp\document.pdf", 2); // adSaveCreateOverWrite
    Поток.Close();
КонецЕсли;
← На главную