При автоматизации взаимодействия 1С с внешними веб-ресурсами, такими как портал Инфостарт, разработчики часто сталкиваются с необходимостью получения данных из закрытых разделов (например, списка заказов, данных о продажах или партнерской статистики). Основная сложность здесь заключается не в самом получении HTML-кода страницы, а в прохождении процедуры авторизации. Без корректных данных в заголовках запроса сервер вернет либо страницу входа, либо ошибку доступа.
В этой статье мы подробно разберем, как программно имитировать действия пользователя, настроить передачу авторизационных данных и корректно считать информацию с сайта, используя встроенные механизмы платформы 1С:Предприятие 8.3.
Прежде чем писать код в 1С, нам необходимо выяснить, какие именно данные сайт ожидает получить для подтверждения того, что запрос исходит от авторизованного пользователя. Для этого воспользуемся инструментами анализа трафика. Рассмотрим два основных способа:
F12. Во вкладке Network (Сеть) мы можем проанализировать каждый запрос. Нас интересуют заголовки (Headers) запроса к целевой странице.Проанализируем ситуацию: когда вы авторизуетесь на сайте, сервер отправляет вашему браузеру специальные метки — Cookies. В последующих запросах браузер автоматически прикрепляет эти метки к заголовкам, и сервер «узнает» вас. Наша задача — повторить это поведение в 1С.
Современные ресурсы, включая Инфостарт, работают исключительно по протоколу HTTPS. Это означает, что при создании объекта HTTPСоединение в 1С мы обязаны использовать защищенное соединение. Если этого не сделать, запрос завершится ошибкой или будет сброшен сервером.
Разберем пример инициализации соединения:
// Определяем параметры сервера
Сервер = "infostart.ru";
// Для HTTPS обязательно создаем объект ЗащищенноеСоединениеOpenSSL
Защита = Новый ЗащищенноеСоединениеOpenSSL();
// Создаем соединение
Соединение = Новый HTTPСоединение(Сервер, , , , , 15, Защита);
Обратите внимание, что мы используем стандартный конструктор ЗащищенноеСоединениеOpenSSL(), который в большинстве случаев автоматически подбирает нужные сертификаты из хранилища операционной системы.
Как выяснилось в ходе обсуждения на форуме, для доступа к странице заказов на Инфостарте критически важно передать заголовок Cookie, содержащий параметры INFOSTART_SM_LOGIN и INFOSTART_SM_UIDH. Эти данные можно получить один раз вручную через F12 или реализовать механизм автоматического логина (об этом ниже).
Рассмотрим, как добавить эти данные в наш HTTPЗапрос:
// Путь к нужной странице
АдресСтраницы = "/profile/partner/authorship/";
// Создаем объект запроса
Запрос = Новый HTTPЗапрос(АдресСтраницы);
// Формируем строку кук (вставьте свои актуальные значения)
СтрокаКуки = "INFOSTART_SM_LOGIN=ВашЛогин; INFOSTART_SM_UIDH=ВашХешАвторизации;";
// Добавляем заголовки
Запрос.Заголовки.Вставить("Cookie", СтрокаКуки);
// Рекомендуется также добавить User-Agent, чтобы запрос выглядел как от браузера
Запрос.Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0 Safari/537.36");
Использование User-Agent крайне важно. Некоторые сайты блокируют запросы, если в заголовке указано стандартное 1C+Enterprise, так как это явно указывает на работу робота.
Теперь выполним сам запрос и проанализируем ответ сервера. Нам нужно убедиться, что код состояния равен 200 (ОК), что означает успешную загрузку страницы.
Попытка
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
ТекстСтраницы = Ответ.ПолучитьТелоКакСтроку();
// Здесь можно приступать к парсингу HTML
ИначеЕсли Ответ.КодСостояния = 302 Тогда
// Обработка редиректа, если сайт перенаправляет на страницу входа
Сообщить("Требуется обновление авторизации (код 302)");
Иначе
Сообщить("Ошибка при получении данных: " + Ответ.КодСостояния);
КонецЕсли;
Исключение
Сообщить("Не удалось установить соединение: " + ОписаниеОшибки());
КонецПопытки;
Подставлять куки вручную неудобно, так как их срок действия ограничен. Чтобы автоматизировать процесс, мы можем сначала выполнить POST-запрос на адрес авторизации сайта.
Рассмотрим алгоритм действий:
POST запрос на /auth/ (или актуальный URL авторизации), передавая в теле запроса логин и пароль в формате application/x-www-form-urlencoded.Set-Cookie.GET запросах.В 1С извлечение кук из ответа выглядит так:
КукиДляЗапросов = "";
Для Каждого Заголовок Из Ответ.Заголовки Цикл
Если ВРег(Заголовок.Ключ) = "SET-COOKIE" Тогда
// Накапливаем куки через точку с запятой
КукиДляЗапросов = КукиДляЗапросов + Заголовок.Значение + "; ";
КонецЕсли;
КонецЦикла;
Когда HTML-код страницы "Мои заказы" уже находится в переменной ТекстСтраницы, возникает вопрос: как вытащить оттуда полезную информацию? Рассмотрим три подхода:
СтрПодобнаПоРегулярномуВыражению.HTMLFile. Это позволяет обращаться к элементам страницы по именам классов или идентификаторам, что делает код устойчивым к мелким изменениям верстки.Пример использования HTMLFile для парсинга:
HTMLДокумент = Новый COMОбъект("HTMLFile");
HTMLДокумент.write(ТекстСтраницы);
// Получаем все таблицы на странице
Таблицы = HTMLДокумент.getElementsByTagName("table");
// Перебираем строки таблицы заказов
// (Код зависит от структуры конкретной страницы)
Проанализировав ситуацию, мы можем выделить несколько советов для обеспечения надежной выгрузки:
Location. Часто данные находятся именно по новому адресу, на который вас перенаправляют.Таким образом, мы выяснили, что ключевым моментом в программной выгрузке заказов является правильное управление заголовками HTTP и использование защищенного соединения. Реализовав один раз механизм авторизации, вы сможете автоматизировать сбор любой статистики с портала непосредственно в вашу базу 1С.