Почему не работает Поле HTML документа через прокси-сервер в 1С 8.3.14 и как это исправить?

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

При переходе на новые релизы платформы 1С:Предприятие разработчики часто сталкиваются с неожиданным изменением поведения привычных механизмов. Одной из таких неприятных неожиданностей стал отказ работы встроенного элемента формы «Поле HTML документа» при выходе в интернет через корпоративный прокси-сервер с авторизацией (будь то NTLM или базовая авторизация по логину и паролю). В версиях платформы 8.3.13 все работало отлично, но начиная с версии 8.3.14.1565 (и в последующих сборках, таких как 8.3.14.1630), страницы внутри формы просто перестали загружаться. При этом программный код 1С, использующий отправку HTTP-запросов, продолжает успешно функционировать.

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

Выясняем причину: переход с Internet Explorer на WebKit

Для того чтобы понять природу проблемы, нам необходимо обратиться к официальным технологическим изменениям платформы 1С:Предприятие. Начиная с версии 8.3.14, разработчики 1С совершили важное архитектурное изменение — они полностью отказались от использования компонентов Internet Explorer в клиентских приложениях для Windows для отображения HTML-контента. Вместо устаревшего движка Trident (на котором работал IE) в платформу была интегрирована библиотека WebKit.

Это нововведение принесло как плюсы, так и минусы:

  1. Плюсы: Современный рендеринг веб-страниц, поддержка новых стандартов HTML5, CSS3 и современного JavaScript, а также кроссплатформенность (одинаковое поведение HTML-поля на Windows и Linux).
  2. Минусы: Кардинальное изменение работы с системным окружением. Ранее «Поле HTML документа» в Windows-клиенте являлось надстройкой над COM-объектом Internet Explorer и наследовало все его сетевые параметры. Соответственно, тип значения свойства Документ у Поля HTML изменился с COMОбъект на ВнешнийОбъект. Любые настройки прокси, заданные в свойствах обозревателя Windows (Internet Options), новые релизы платформы стали попросту игнорировать.

По этой причине привычные схемы настройки сетевых подключений через панель управления Windows перестали оказывать какое-либо влияние на отображение веб-страниц внутри встроенного браузера 1С.

Анализируем баги платформы 1С и работу inetcfg.xml

Многие системные администраторы и программисты пытались решить проблему «в лоб» — прописывая настройки подключения в конфигурационном файле inetcfg.xml. Однако в первых релизах ветки 8.3.14 разработчики столкнулись со следующими сложностями:

  1. Ограничение области действия inetcfg.xml: Традиционно конфигурационный файл inetcfg.xml предназначен в первую очередь для настройки сетевых подключений на стороне сервера 1С:Предприятие, а также для некоторых предопределенных утилит. На тонкого и толстого клиента в части отображения интерактивного HTML-контента эти настройки в ранних версиях WebKit не распространялись.
  2. Платформенная ошибка (Баг №10208275): В релизах линейки 8.3.14 (включая 8.3.14.1565 и 8.3.14.1630) существовала критическая ошибка платформы. Встроенный WebKit в клиентском приложении под управлением Windows некорректно обрабатывал настройки прокси-сервера. Из-за этого WebKit пытался идти в интернет напрямую, минуя прокси, что приводило к пустой странице или ошибкам соединения в корпоративных сетях. Данный баг был окончательно исправлен разработчиками 1С только в более поздних версиях платформы (начиная с 8.3.17).

Проблема NTLM-авторизации на прокси-серверах

Еще одно серьезное препятствие — это тип авторизации на вашем прокси-сервере. В крупных корпоративных сетях часто используется протокол NTLM (или Kerberos) для прозрачной авторизации пользователей домена на прокси.

Реализованный внутри 1С движок WebKit имеет жесткие ограничения на используемые протоколы аутентификации. В отличие от системного Internet Explorer, который умеет «подхватывать» доменные учетные данные пользователя Windows автоматически, WebKit в 1С не поддерживает NTLM-авторизацию для отображения веб-страниц напрямую. Стабильно поддерживается только базовая авторизация (Basic) с явной передачей имени пользователя и пароля.

Рассмотрим ниже три основных метода решения и обхода этой проблемы.

Решение 1. Программный обход проблемы через скачивание контента

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

Разберем этот метод по шагам на примере кода:


// Шаг 1. Создаем и настраиваем объект ИнтернетПрокси
Прокси = Новый ИнтернетПрокси;
Прокси.Установить("http", "192.168.1.100", 8080); // Укажите IP и порт вашего прокси
Прокси.Пользователь = "Domain\User"; // Имя пользователя прокси-сервера
Прокси.Пароль = "MyPassword123"; // Пароль пользователя

// Шаг 2. Создаем HTTP-соединение с использованием настроенного прокси
Соединение = Новый HTTPСоединение("example.com", , , , Прокси);

// Шаг 3. Формируем и отправляем GET-запрос к нужному ресурсу
Запрос = Новый HTTPЗапрос("/index.html");
Попытка
    Ответ = Соединение.Получить(Запрос);
    Если Ответ.КодСостояния = 200 Тогда
        // Получаем текст HTML-страницы
        ТекстHTML = Ответ.ПолучитьТелоКакСтроку();
        
        // Шаг 4. Загружаем полученный HTML в Поле HTML документа на форме
        // Предположим, что имя реквизита формы с типом "Строка" (связанного с Полем HTML) - "ПолеHTML"
        Элементы.ПолеHTML.УстановитьТекст(ТекстHTML);
    Иначе
        ВызватьИсключение "Ошибка сервера. Код состояния: " + Ответ.КодСостояния;
    КонецЕсли;
Исключение
    Сообщить("Не удалось загрузить страницу через прокси: " + ОписаниеОшибки());
КонецПопытки;

Важное ограничение данного метода: Этот способ отлично работает для простых документов. Однако если скачиваемая HTML-страница содержит относительные или абсолютные ссылки на внешние CSS-стили, картинки или JS-скрипты (например, размещенные на внешних CDN-серверах), то при рендере документа движок WebKit попытается загрузить их напрямую. Поскольку сам WebKit все еще находится за прокси-сервером и не имеет к нему доступа, стили и картинки не загрузятся, и страница отобразится некорректно («поплывет» верстка).

Решение 2. Использование переменных окружения операционной системы

Поскольку WebKit является частью открытого проекта Chromium/Webkit, он умеет считывать настройки прокси-сервера из переменных окружения операционной системы Windows. Если платформа 1С не передает настройки прокси в WebKit должным образом из-за багов конкретного релиза, мы можем настроить глобальные переменные окружения на компьютере пользователя.

Проанализируем, как это сделать:

  1. Откройте «Свойства системы» (нажмите сочетание клавиш Win + Pause/Break или введите в поиске «Изменение переменных среды текущего пользователя»).
  2. Нажмите кнопку «Переменные среды...».
  3. В разделе «Переменные среды пользователя» (или системных переменных, если нужно применить для всех пользователей ПК) нажмите кнопку «Создать...».
  4. Добавьте две переменные со следующими параметрами:
    • Имя переменной: HTTP_PROXY
    • Значение переменной: http://логин:пароль@адрес_прокси:порт (например, http://user:pass@192.168.1.100:8080)
    • Имя переменной: HTTPS_PROXY
    • Значение переменной: http://логин:пароль@адрес_прокси:порт
  5. Нажмите «ОК» для сохранения изменений и обязательно перезапустите сеанс 1С:Предприятия (а лучше перезагрузите компьютер), чтобы изменения вступили в силу.

После этого встроенный WebKit при попытке инициализации сетевого запроса считает эти переменные окружения и пойдет в интернет через указанный прокси-сервер с авторизацией.

Решение 3. Использование локального прокси-переходника (утилита Cntlm) для NTLM-авторизации

Если ваша корпоративная сеть строго ограничена авторизацией по протоколу NTLM, а встроенный WebKit в 1С отказывается работать с ней напрямую, лучшим решением со стороны системного администрирования будет развертывание локального прокси-клиента на рабочем месте пользователя. Наиболее популярной и легковесной утилитой для этих целей является cntlm.

Разберем принцип работы данной схемы по шагам:

  1. На компьютере пользователя устанавливается и настраивается служба cntlm. Она запускается локально на адресе 127.0.0.1 (порт по умолчанию 3128).
  2. В конфигурационном файле cntlm.ini прописываются реквизиты вашей корпоративной учетной записи (домен, имя пользователя, хэш пароля) и адрес реального корпоративного NTLM-прокси-сервера.
  3. В настройках 1С (через параметры прокси-сервера в интерфейсе или через конфигурационные файлы) в качестве прокси указывается адрес локального хоста: 127.0.0.1:3128 без авторизации.
  4. При отправке запроса из Поля HTML 1С, трафик идет на локальную службу cntlm, которая мгновенно авторизует этот запрос по протоколу NTLM на корпоративном прокси-сервере и возвращает результат обратно в 1С.

Этот способ является наиболее надежным в крупных корпоративных инфраструктурах, так как он полностью изолирует механизмы 1С от сложностей доменной авторизации Microsoft.

Дополнительные рекомендации для современных релизов (8.3.21+)

Если у вас есть возможность обновить платформу 1С:Предприятие, настоятельно рекомендуем перейти на версии 8.3.17 и выше, а еще лучше — на актуальные релизы 8.3.21+.

В современных версиях платформы разработчики 1С провели колоссальную работу над стабильностью WebKit:

Таким образом, для решения проблемы вам необходимо либо использовать программную прослойку скачивания контента через HTTPСоединение, либо настроить переменные окружения операционной системы, либо организовать локальный авторизационный прокси-сервер с помощью утилиты cntlm, если в вашей сети используется доменная авторизация NTLM.

← На главную