Как передать авторизацию из HTTP-запроса 1С во внешний браузер?

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

При разработке интеграций между 1С и внешними веб-сервисами программисты часто сталкиваются с ситуацией: необходимо программно авторизоваться на сайте средствами 1С, а затем открыть этот сайт в браузере так, чтобы пользователю не пришлось вводить логин и пароль повторно. Однако на практике простое сохранение полученного HTML-кода во временный файл и его запуск через НачатьЗапускПриложения не дает нужного результата — сессия теряется, данные не отображаются, а сайт снова просит авторизацию. Разберем детально, почему это происходит и какими способами можно решить эту задачу.

Анализ проблемы: почему сессия «не переходит» в браузер

Проанализируем ситуацию. Когда мы используем объект HTTPСоединение, платформа 1С выступает в роли самостоятельного клиента (аналога браузера). Все куки (Cookies), токены и заголовки авторизации, которые сервер присылает в ответ на запрос, сохраняются внутри этого объекта или в памяти текущего сеанса 1С. Внешний браузер (Chrome, Edge или Firefox) — это абсолютно другой процесс со своим собственным хранилищем данных. Он ничего не знает о тех манипуляциях, которые вы провели внутри 1С.

Основные причины неудачи при сохранении HTML в файл:

  1. Изоляция Cookies: Файлы куки, подтверждающие вашу личность на сервере, остаются в 1С. Браузер при открытии файла их не видит.
  2. Относительные пути: В коде страницы ссылки на стили (CSS) и скрипты (JS) часто указаны как /js/app.js. Если открыть файл с диска, браузер будет искать их по адресу C:\js\app.js, а не на сервере.
  3. Политика безопасности (CORS): Современные ГИС-системы и карты часто используют фреймы (iframe). Браузер блокирует загрузку контента во фреймы, если основная страница открыта как локальный файл, из-за соображений безопасности.

Решение 1: Использование встроенного «Поля HTML документа»

Рассмотрим наиболее жизнеспособный вариант в экосистеме 1С — использование элемента формы Поле HTML документа. Это позволяет не покидать контекст приложения и управлять сессией более гибко.

Посмотрим на пример того, как это работает. Вместо того чтобы пытаться «вытолкнуть» данные во внешний браузер, мы загружаем их во встроенный. В тонком клиенте на Windows этот элемент использует движок системы (обычно WebKit или Internet Explorer в режиме совместимости). Если один раз выполнить авторизацию непосредственно через это поле (например, методом Перейти() с нужными заголовками), сессия сохранится в контексте этого окна до его закрытия.

Выясним, как передать данные авторизации. Рассмотрим пример формирования запроса:


Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", "Basic " + КодированнаяСтрока);
// Где КодированнаяСтрока — это Base64 от "логин:пароль"
Элементы.ПолеHTMLПросмотра.Перейти(АдресСайта, Заголовки);

Преимущество: После такой загрузки все последующие клики пользователя внутри этого поля будут происходить в рамках уже установленной сессии.

Решение 2: Исправление отображения при сохранении в файл (Тег BASE)

Если специфика задачи требует открытия именно внешнего браузера через файл, разберем, как исправить проблему «недогруженной» информации. Выясним причину: браузер не может найти ресурсы. Для этого нам нужно программно модифицировать полученный HTML-текст, добавив в него тег base.

Проанализируем алгоритм действий:

  1. Получаем тело ответа от сервера как строку.
  2. Находим секцию <head>.
  3. Вставляем сразу после неё тег с указанием корня сайта.

Пример кода на 1С:


Ответ = Соединение.ОтправитьДляОбработки(Запрос);
ТекстHTML = Ответ.ПолучитьТелоКакСтроку();

// Вставляем тег BASE для корректных путей
КореньСайта = "https://gis-system.ru/";
ТекстHTML = СтрЗаменить(ТекстHTML, "<head>", "<head><base href=""" + КореньСайта + """>");

// Сохраняем во временный файл
ИмяФайла = КаталогВременныхФайлов() + "page.html";
ТекстЗаписи = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8);
ТекстЗаписи.Записать(ТекстHTML);
ТекстЗаписи.Закрыть();

// Открываем браузер
НачатьЗапускПриложения(ИмяФайла);

Важно: Этот метод решит проблему с картинками и стилями, но может не решить проблему с авторизацией, если сервер требует живые Cookies для подгрузки данных карт.

Решение 3: Автоматизация через Selenium WebDriver

В случаях со сложными ГИС-системами, где используется много JavaScript и динамических токенов, обычного HTTP-запроса недостаточно. Рассмотрим профессиональный подход — использование Selenium WebDriver. Это библиотека, которая позволяет 1С напрямую управлять установленным в системе браузером (Chrome, Firefox).

Как мы можем это реализовать:

  1. 1С запускает экземпляр браузера через драйвер.
  2. Командами драйвера мы приказываем браузеру найти поле ввода логина и пароля на странице.
  3. Программно имитируем нажатие кнопки «Вход».
  4. После этого браузер остается открытым, сессия активна, и пользователь продолжает работу в «родном» интерфейсе сайта.

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

Решение 4: Работа с Cookies (Set-Cookie)

Если вы все же используете HTTPСоединение, проанализируем заголовки ответа. Сервер часто присылает заголовок Set-Cookie. В теории, эти данные можно попытаться передать браузеру, но современные системы безопасности браузеров запрещают установку куки «извне» для чужих доменов.

Однако, если вы контролируете целевой сайт (являетесь его разработчиком или имеете доступ к API), можно использовать передачу Session ID прямо в URL. Посмотрим на структуру ссылки:

https://gis-site.ru/map?session_id=TOKEN_FROM_1C

В этом случае скрипты на сайте должны уметь принимать этот токен и устанавливать сессию самостоятельно. Если сайт сторонний, этот метод, скорее всего, не сработает.

Итоги и рекомендации

Подведем итог нашему исследованию. Прямая передача авторизованного «состояния» из объекта HTTPСоединение во внешний браузер невозможна из-за архитектурных ограничений безопасности Windows и самих браузеров.

Рекомендуемый порядок действий:

  1. Если достаточно работы внутри 1С — используйте Поле HTML документа и метод Перейти() с заголовками.
  2. Если нужен внешний браузер — рассмотрите возможность авторизации через URL (если сайт поддерживает передачу токенов в строке запроса).
  3. Для сложных интерактивных систем (карты, ГИС) используйте Selenium для прямой эмуляции действий пользователя в браузере.
  4. При сохранении HTML в файл всегда используйте тег <base>, чтобы не терять оформление страницы.

Помните, что безопасность современных веб-приложений строится на защите от атак типа «человек посередине», и попытка программно подсунуть браузеру чужую сессию часто расценивается защитными механизмами сайта как попытка взлома.

← На главную