При переходе на новые релизы платформы 1С:Предприятие разработчики часто сталкиваются с неожиданным изменением поведения привычных механизмов. Одной из таких неприятных неожиданностей стал отказ работы встроенного элемента формы «Поле HTML документа» при выходе в интернет через корпоративный прокси-сервер с авторизацией (будь то NTLM или базовая авторизация по логину и паролю). В версиях платформы 8.3.13 все работало отлично, но начиная с версии 8.3.14.1565 (и в последующих сборках, таких как 8.3.14.1630), страницы внутри формы просто перестали загружаться. При этом программный код 1С, использующий отправку HTTP-запросов, продолжает успешно функционировать.
В этой статье мы подробно разберем, почему произошли эти изменения, проанализируем архитектурные новшества платформы 1С, выявим зарегистрированные баги и рассмотрим несколько практических способов обхода и решения данной проблемы.
Для того чтобы понять природу проблемы, нам необходимо обратиться к официальным технологическим изменениям платформы 1С:Предприятие. Начиная с версии 8.3.14, разработчики 1С совершили важное архитектурное изменение — они полностью отказались от использования компонентов Internet Explorer в клиентских приложениях для Windows для отображения HTML-контента. Вместо устаревшего движка Trident (на котором работал IE) в платформу была интегрирована библиотека WebKit.
Это нововведение принесло как плюсы, так и минусы:
Документ у Поля HTML изменился с COMОбъект на ВнешнийОбъект. Любые настройки прокси, заданные в свойствах обозревателя Windows (Internet Options), новые релизы платформы стали попросту игнорировать.По этой причине привычные схемы настройки сетевых подключений через панель управления Windows перестали оказывать какое-либо влияние на отображение веб-страниц внутри встроенного браузера 1С.
Многие системные администраторы и программисты пытались решить проблему «в лоб» — прописывая настройки подключения в конфигурационном файле inetcfg.xml. Однако в первых релизах ветки 8.3.14 разработчики столкнулись со следующими сложностями:
inetcfg.xml предназначен в первую очередь для настройки сетевых подключений на стороне сервера 1С:Предприятие, а также для некоторых предопределенных утилит. На тонкого и толстого клиента в части отображения интерактивного HTML-контента эти настройки в ранних версиях WebKit не распространялись.Еще одно серьезное препятствие — это тип авторизации на вашем прокси-сервере. В крупных корпоративных сетях часто используется протокол NTLM (или Kerberos) для прозрачной авторизации пользователей домена на прокси.
Реализованный внутри 1С движок WebKit имеет жесткие ограничения на используемые протоколы аутентификации. В отличие от системного Internet Explorer, который умеет «подхватывать» доменные учетные данные пользователя Windows автоматически, WebKit в 1С не поддерживает NTLM-авторизацию для отображения веб-страниц напрямую. Стабильно поддерживается только базовая авторизация (Basic) с явной передачей имени пользователя и пароля.
Рассмотрим ниже три основных метода решения и обхода этой проблемы.
Если вам требуется отобразить статическую страницу или страницу с минимальным набором скриптов, наиболее надежным и кроссплатформенным решением будет предварительная загрузка контента средствами встроенного языка 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 все еще находится за прокси-сервером и не имеет к нему доступа, стили и картинки не загрузятся, и страница отобразится некорректно («поплывет» верстка).
Поскольку WebKit является частью открытого проекта Chromium/Webkit, он умеет считывать настройки прокси-сервера из переменных окружения операционной системы Windows. Если платформа 1С не передает настройки прокси в WebKit должным образом из-за багов конкретного релиза, мы можем настроить глобальные переменные окружения на компьютере пользователя.
Проанализируем, как это сделать:
Win + Pause/Break или введите в поиске «Изменение переменных среды текущего пользователя»).HTTP_PROXYhttp://логин:пароль@адрес_прокси:порт (например, http://user:pass@192.168.1.100:8080)HTTPS_PROXYhttp://логин:пароль@адрес_прокси:портПосле этого встроенный WebKit при попытке инициализации сетевого запроса считает эти переменные окружения и пойдет в интернет через указанный прокси-сервер с авторизацией.
Если ваша корпоративная сеть строго ограничена авторизацией по протоколу NTLM, а встроенный WebKit в 1С отказывается работать с ней напрямую, лучшим решением со стороны системного администрирования будет развертывание локального прокси-клиента на рабочем месте пользователя. Наиболее популярной и легковесной утилитой для этих целей является cntlm.
Разберем принцип работы данной схемы по шагам:
cntlm. Она запускается локально на адресе 127.0.0.1 (порт по умолчанию 3128).cntlm.ini прописываются реквизиты вашей корпоративной учетной записи (домен, имя пользователя, хэш пароля) и адрес реального корпоративного NTLM-прокси-сервера.127.0.0.1:3128 без авторизации.cntlm, которая мгновенно авторизует этот запрос по протоколу NTLM на корпоративном прокси-сервере и возвращает результат обратно в 1С.Этот способ является наиболее надежным в крупных корпоративных инфраструктурах, так как он полностью изолирует механизмы 1С от сложностей доменной авторизации Microsoft.
Если у вас есть возможность обновить платформу 1С:Предприятие, настоятельно рекомендуем перейти на версии 8.3.17 и выше, а еще лучше — на актуальные релизы 8.3.21+.
В современных версиях платформы разработчики 1С провели колоссальную работу над стабильностью WebKit:
Таким образом, для решения проблемы вам необходимо либо использовать программную прослойку скачивания контента через HTTPСоединение, либо настроить переменные окружения операционной системы, либо организовать локальный авторизационный прокси-сервер с помощью утилиты cntlm, если в вашей сети используется доменная авторизация NTLM.