При разработке интеграций между 1С и внешними веб-сервисами программисты часто сталкиваются с ситуацией: необходимо программно авторизоваться на сайте средствами 1С, а затем открыть этот сайт в браузере так, чтобы пользователю не пришлось вводить логин и пароль повторно. Однако на практике простое сохранение полученного HTML-кода во временный файл и его запуск через НачатьЗапускПриложения не дает нужного результата — сессия теряется, данные не отображаются, а сайт снова просит авторизацию. Разберем детально, почему это происходит и какими способами можно решить эту задачу.
Проанализируем ситуацию. Когда мы используем объект HTTPСоединение, платформа 1С выступает в роли самостоятельного клиента (аналога браузера). Все куки (Cookies), токены и заголовки авторизации, которые сервер присылает в ответ на запрос, сохраняются внутри этого объекта или в памяти текущего сеанса 1С. Внешний браузер (Chrome, Edge или Firefox) — это абсолютно другой процесс со своим собственным хранилищем данных. Он ничего не знает о тех манипуляциях, которые вы провели внутри 1С.
Основные причины неудачи при сохранении HTML в файл:
/js/app.js. Если открыть файл с диска, браузер будет искать их по адресу C:\js\app.js, а не на сервере.Рассмотрим наиболее жизнеспособный вариант в экосистеме 1С — использование элемента формы Поле HTML документа. Это позволяет не покидать контекст приложения и управлять сессией более гибко.
Посмотрим на пример того, как это работает. Вместо того чтобы пытаться «вытолкнуть» данные во внешний браузер, мы загружаем их во встроенный. В тонком клиенте на Windows этот элемент использует движок системы (обычно WebKit или Internet Explorer в режиме совместимости). Если один раз выполнить авторизацию непосредственно через это поле (например, методом Перейти() с нужными заголовками), сессия сохранится в контексте этого окна до его закрытия.
Выясним, как передать данные авторизации. Рассмотрим пример формирования запроса:
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", "Basic " + КодированнаяСтрока);
// Где КодированнаяСтрока — это Base64 от "логин:пароль"
Элементы.ПолеHTMLПросмотра.Перейти(АдресСайта, Заголовки);
Преимущество: После такой загрузки все последующие клики пользователя внутри этого поля будут происходить в рамках уже установленной сессии.
Если специфика задачи требует открытия именно внешнего браузера через файл, разберем, как исправить проблему «недогруженной» информации. Выясним причину: браузер не может найти ресурсы. Для этого нам нужно программно модифицировать полученный HTML-текст, добавив в него тег base.
Проанализируем алгоритм действий:
<head>.Пример кода на 1С:
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
ТекстHTML = Ответ.ПолучитьТелоКакСтроку();
// Вставляем тег BASE для корректных путей
КореньСайта = "https://gis-system.ru/";
ТекстHTML = СтрЗаменить(ТекстHTML, "<head>", "<head><base href=""" + КореньСайта + """>");
// Сохраняем во временный файл
ИмяФайла = КаталогВременныхФайлов() + "page.html";
ТекстЗаписи = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8);
ТекстЗаписи.Записать(ТекстHTML);
ТекстЗаписи.Закрыть();
// Открываем браузер
НачатьЗапускПриложения(ИмяФайла);
Важно: Этот метод решит проблему с картинками и стилями, но может не решить проблему с авторизацией, если сервер требует живые Cookies для подгрузки данных карт.
В случаях со сложными ГИС-системами, где используется много JavaScript и динамических токенов, обычного HTTP-запроса недостаточно. Рассмотрим профессиональный подход — использование Selenium WebDriver. Это библиотека, которая позволяет 1С напрямую управлять установленным в системе браузером (Chrome, Firefox).
Как мы можем это реализовать:
Это самый надежный способ «миновать» окно авторизации для пользователя, так как авторизация происходит непосредственно в самом браузере, а не в 1С.
Если вы все же используете HTTPСоединение, проанализируем заголовки ответа. Сервер часто присылает заголовок Set-Cookie. В теории, эти данные можно попытаться передать браузеру, но современные системы безопасности браузеров запрещают установку куки «извне» для чужих доменов.
Однако, если вы контролируете целевой сайт (являетесь его разработчиком или имеете доступ к API), можно использовать передачу Session ID прямо в URL. Посмотрим на структуру ссылки:
https://gis-site.ru/map?session_id=TOKEN_FROM_1C
В этом случае скрипты на сайте должны уметь принимать этот токен и устанавливать сессию самостоятельно. Если сайт сторонний, этот метод, скорее всего, не сработает.
Подведем итог нашему исследованию. Прямая передача авторизованного «состояния» из объекта HTTPСоединение во внешний браузер невозможна из-за архитектурных ограничений безопасности Windows и самих браузеров.
Рекомендуемый порядок действий:
Поле HTML документа и метод Перейти() с заголовками.<base>, чтобы не терять оформление страницы.Помните, что безопасность современных веб-приложений строится на защите от атак типа «человек посередине», и попытка программно подсунуть браузеру чужую сессию часто расценивается защитными механизмами сайта как попытка взлома.