Как получить код веб-страницы в 1С:Предприятии?

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

При работе с внешними веб-ресурсами в 1С:Предприятии часто возникает задача получения HTML-кода веб-страницы или данных из веб-сервиса. Эта задача может быть сопряжена с рядом нюансов, таких как использование защищенного соединения (HTTPS), кодирование параметров запроса, настройка прокси-серверов и последующий парсинг полученных данных. В этом руководстве мы подробно разберем, как подойти к решению этой проблемы, используя различные подходы и учитывая возможные сложности.

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

1. Установление HTTP/HTTPS соединения и выполнение запроса

Первым и самым важным шагом является установление соединения с целевым веб-сервером и отправка запроса. Для этого в 1С используются объекты HTTPСоединение и HTTPЗапрос. Особое внимание следует уделить работе с HTTPS, так как большинство современных сайтов используют именно этот протокол для обеспечения безопасности.

  1. Инициализация HTTPСоединения:

    Для создания соединения используем конструктор Новый HTTPСоединение(). Если ресурс использует HTTPS, нам потребуется указать порт 443 и использовать объект ЗащищенноеСоединениеOpenSSL(). Это обеспечит шифрование передаваемых данных и проверку сертификатов.

    Важный момент: Если вы столкнулись с ошибками при установлении защищенного соединения, причина может быть в блокировке антивирусами, сетевыми экранами, прокси-серверами или проблемах с SSL-сертификатами (просроченные, самоподписанные). Также убедитесь, что служба "Агент сервера 1С:Предприятие" (если вы работаете на сервере) запущена под учетной записью, имеющей доступ в интернет.

    
    СоединениеHTTP = Новый HTTPСоединение("app.fgislk.gov.ru", 443,,,,, Новый ЗащищенноеСоединениеOpenSSL());
    

    В данном примере мы указываем домен app.fgislk.gov.ru и стандартный порт 443 для HTTPS. Последний параметр, Новый ЗащищенноеСоединениеOpenSSL(), критически важен для защищенных соединений.

  2. Создание HTTPЗапроса:

    После установления соединения мы формируем сам запрос к ресурсу. Для этого используется объект Новый HTTPЗапрос(), в который передается адрес ресурса на сервере.

    
    ЗапросHTTP = Новый HTTPЗапрос("/pudpd/api/pudpd/public/qr/html?d=...");
    

    Здесь /pudpd/api/pudpd/public/qr/html?d=... — это относительный путь к ресурсу на сервере.

  3. Отправка запроса и получение ответа:

    Для отправки запроса используйте метод Получить() объекта HTTPСоединение, который вернет объект HTTPОтвет.

    
    Ответ = СоединениеHTTP.Получить(ЗапросHTTP);
    

    Мы обязательно должны проверять код состояния HTTP-ответа. Код 200 означает успешное выполнение запроса.

    
    Если Ответ.КодСостояния = 200 Тогда
        HTMLСтрока = Ответ.ПолучитьТелоКакСтроку();
        // Дальнейшая обработка HTMLСтрока
    Иначе
        Сообщить("Ошибка при получении страницы. Код ответа: " + Ответ.КодСостояния);
    КонецЕсли;
    

    Метод Ответ.ПолучитьТелоКакСтроку() позволяет получить содержимое страницы в виде строки.

2. Корректное URL-кодирование параметров запроса

Часто веб-страницы принимают параметры в URL-строке (например, ?d=значение&x=другое_значение). Если эти параметры содержат специальные символы, пробелы или кириллицу, их необходимо закодировать в соответствии с правилами URL-кодирования. В противном случае запрос может быть некорректным или привести к ошибкам.

Для этого в 1С существует функция КодироватьСтроку() со способом кодирования СпособКодированияСтроки.КодировкаURL.

Рассмотрим подробнее пример:


ПараметрD = "Мой параметр с пробелами и кириллицей";
ПараметрX = "Значение 2";

ПараметрD_URL = КодироватьСтроку(ПараметрD, СпособКодированияСтроки.КодировкаURL);
ПараметрX_URL = КодироватьСтроку(ПараметрX, СпособКодированияСтроки.КодировкаURL);

АдресРесурса = СтрШаблон("/pudpd/api/pudpd/public/qr/html?d=%1&x=%2", ПараметрD_URL, ПараметрX_URL);

// Теперь используем сформированный АдресРесурса в HTTPЗапросе
ЗапросHTTP = Новый HTTPЗапрос(АдресРесурса);

Обратите внимание, что после кодирования строка "NJM/3eDJG6Lcv+IrMoDf......" может выглядеть как "NJM%2F3eDJG6Lcv%2BIrMoDf......", где %2F — это закодированный символ /. Это абсолютно нормально и является правильным поведением.

3. Настройка сетевых параметров и прокси-сервера

Если запросы выполняются с сервера 1С или в корпоративной сети, где доступ в интернет осуществляется через прокси-сервер, могут потребоваться дополнительные настройки.

  1. Настройка DNS-сервера:

    В некоторых случаях, особенно при проблемах с разрешением доменных имен, может помочь явное указание DNS-сервера. Например, можно попробовать прописать публичный DNS-сервер Яндекса 77.88.8.8 на уровне операционной системы, с которой выполняется запрос.

  2. Использование ИнтернетПрокси:

    В 1С мы можем настроить параметры прокси-сервера для HTTP-запросов с помощью объекта ИнтернетПрокси. Это особенно актуально, если прокси-сервер требует авторизации.

    
    Прокси = Новый ИнтернетПрокси;
    Прокси.Установить("адрес_прокси", порт_прокси);
    Прокси.Пользователь = "логин";
    Прокси.Пароль = "пароль";
    
    // Затем передайте объект Прокси в HTTPСоединение
    СоединениеHTTP = Новый HTTPСоединение("app.fgislk.gov.ru", 443, Прокси,,,, Новый ЗащищенноеСоединениеOpenSSL());
    

    Мы можем указать прокси как для HTTP, так и для HTTPS протоколов отдельно. Если прокси не требует авторизации, поля Пользователь и Пароль можно оставить пустыми.

  3. Файл inetcfg.xml:

    Настройки прокси по умолчанию могут быть заданы в файле inetcfg.xml, который находится в каталоге CONF исполняемых файлов 1С. Эти настройки имеют приоритет над системными настройками Windows и могут быть полезны для централизованного управления прокси на серверах 1С.

4. Парсинг HTML-документа и работа с DOM

После получения HTML-кода страницы в виде строки, часто возникает задача извлечения конкретных данных. Для этого в 1С предусмотрены объекты для работы с DOM-моделью (Document Object Model) HTML-документа.

  1. Чтение HTML-строки:

    Используем объект ЧтениеHTML для загрузки полученной HTML-строки.

    
    Если Ответ.КодСостояния = 200 Тогда
        HTMLСтрока = Ответ.ПолучитьТелоКакСтроку();
    
        ЧтениеHTML = Новый ЧтениеHTML;
        ЧтениеHTML.УстановитьСтроку(HTMLСтрока);
    Иначе
        Сообщить("Код ответа: " + Ответ.КодСостояния);
        Возврат;
    КонецЕсли;
    
  2. Построение DOM-модели:

    Объект ПостроительDOM позволяет преобразовать HTML-код в объектную модель, с которой удобно работать.

    
    ПостроительDOM = Новый ПостроительDOM;
    ДокументHTML = ПостроительDOM.Прочитать(ЧтениеHTML);
    

    Теперь объект ДокументHTML представляет собой дерево элементов, аналогичное тому, как веб-браузеры представляют страницу.

  3. Обход и поиск элементов:

    Для навигации по DOM-модели мы можем использовать метод СоздатьОбходДерева(), начиная с корневого элемента, например, ДокументHTML.Тело.

    
    Обход = ДокументHTML.СоздатьОбходДерева(ДокументHTML.Тело);
    
    Пока Обход.Следующий() Цикл
        ТекущийУзел = Обход.ТекущийУзел;
        // Анализируем ТекущийУзел: его тип, имя, атрибуты, содержимое
        // Например, если ТекущийУзел.Имя = "div" и у него есть нужный атрибут
        // Мы можем извлечь его текстовое содержимое: ТекущийУзел.ТекстовоеСодержимое
    КонецЦикла;
    

    Мы можем искать элементы по их тегам, атрибутам, классам и т.д., что позволяет извлекать нужные данные. Однако, следует помнить, что прямой парсинг HTML может быть хрупким: любое изменение в разметке сайта может сломать ваш алгоритм. Если есть возможность, предпочтительнее использовать API.

5. Взаимодействие с Web API как предпочтительный метод

Важно понимать, что не всегда то, что выглядит как обычная веб-страница, является таковой. Как было отмечено в исходной теме, адрес app.fgislk.gov.ru/pudpd/api/... явно указывает на API (Application Programming Interface) какого-то приложения.

Если вы взаимодействуете с API, то наиболее корректным, надежным и "цивилизованным" способом является использование методов, предоставляемых разработчиком API. Это включает:

  1. Использование правильных HTTP-методов: Вместо всегда использовать Получить() (GET), API может требовать Отправить() (POST), Поместить() (PUT) или Удалить() (DELETE).

  2. Передачу данных в определенном формате: API часто ожидают данные в форматах JSON или XML, а не просто URL-параметрами. В 1С для работы с JSON используйте ЗаписьJSON и ЧтениеJSON, для XML — ЗаписьXML и ЧтениеXML.

  3. Авторизацию: Многие API требуют авторизации (например, через токены OAuth, API-ключи или, как в случае с ФГИС ЛК, через ЕСИА).

Для взаимодействия с такими системами, как ФГИС ЛК (Федеральная государственная информационная система лесного комплекса), настоятельно рекомендуем изучить официальную документацию, которая обычно содержит описание всех доступных методов API и правил взаимодействия. Обращение к API обеспечивает стабильность и предсказуемость, в отличие от "партизанского" парсинга HTML.

6. Общие рекомендации и устранение неполадок

В процессе работы с HTTP-запросами в 1С могут возникать различные проблемы. Вот несколько общих рекомендаций:

  1. Обработка кодов состояния HTTP-ответа: Всегда проверяйте Ответ.КодСостояния. Коды 200 (Успех), 3xx (Перенаправления), 4xx (Ошибки клиента, например, 404 Not Found, 403 Forbidden), 5xx (Ошибки сервера) помогут вам понять причину проблемы.

  2. Обработка перенаправлений (Redirects): Некоторые сайты могут перенаправлять запросы (например, с HTTP на HTTPS или на другой URL). В 1С объект HTTPСоединение по умолчанию следует перенаправлениям, но будьте готовы к тому, что АдресРесурса может измениться.

  3. Проблемы безопасности: Использование HTTPS критически важно для защиты передаваемой информации. Избегайте передачи конфиденциальных данных по HTTP.

  4. Производительность: Частые HTTP-запросы могут замедлять работу приложения. По возможности кешируйте данные или используйте асинхронные запросы.

  5. Логирование ошибок: В случае возникновения ошибок, подробно логируйте информацию (URL, параметры, код ответа, текст ошибки), чтобы облегчить отладку.

  6. Сетевые проблемы и права: Ошибки типа "Ошибка работы с Интернет" часто указывают на проблемы с доступом в сеть с компьютера или сервера, где выполняется запрос, блокировку файрволлом или недостаточные права пользователя, от имени которого работает процесс 1С.

Мы рассмотрели все основные аспекты получения кода веб-страницы в 1С. Помните, что выбор метода (прямой парсинг HTML или взаимодействие с API) зависит от конкретной задачи и возможностей целевого веб-ресурса. Всегда стремитесь к более надежным и поддерживаемым решениям, таким как работа через API.

← К списку