При работе с внешними веб-ресурсами в 1С:Предприятии часто возникает задача получения HTML-кода веб-страницы или данных из веб-сервиса. Эта задача может быть сопряжена с рядом нюансов, таких как использование защищенного соединения (HTTPS), кодирование параметров запроса, настройка прокси-серверов и последующий парсинг полученных данных. В этом руководстве мы подробно разберем, как подойти к решению этой проблемы, используя различные подходы и учитывая возможные сложности.
Мы вместе рассмотрим основные шаги, проанализируем потенциальные трудности и предложим эффективные решения, основанные на опыте разработчиков 1С.
Первым и самым важным шагом является установление соединения с целевым веб-сервером и отправка запроса. Для этого в 1С используются объекты HTTPСоединение и HTTPЗапрос. Особое внимание следует уделить работе с HTTPS, так как большинство современных сайтов используют именно этот протокол для обеспечения безопасности.
Инициализация HTTPСоединения:
Для создания соединения используем конструктор Новый HTTPСоединение(). Если ресурс использует HTTPS, нам потребуется указать порт 443 и использовать объект ЗащищенноеСоединениеOpenSSL(). Это обеспечит шифрование передаваемых данных и проверку сертификатов.
Важный момент: Если вы столкнулись с ошибками при установлении защищенного соединения, причина может быть в блокировке антивирусами, сетевыми экранами, прокси-серверами или проблемах с SSL-сертификатами (просроченные, самоподписанные). Также убедитесь, что служба "Агент сервера 1С:Предприятие" (если вы работаете на сервере) запущена под учетной записью, имеющей доступ в интернет.
СоединениеHTTP = Новый HTTPСоединение("app.fgislk.gov.ru", 443,,,,, Новый ЗащищенноеСоединениеOpenSSL());
В данном примере мы указываем домен app.fgislk.gov.ru и стандартный порт 443 для HTTPS. Последний параметр, Новый ЗащищенноеСоединениеOpenSSL(), критически важен для защищенных соединений.
Создание HTTPЗапроса:
После установления соединения мы формируем сам запрос к ресурсу. Для этого используется объект Новый HTTPЗапрос(), в который передается адрес ресурса на сервере.
ЗапросHTTP = Новый HTTPЗапрос("/pudpd/api/pudpd/public/qr/html?d=...");
Здесь /pudpd/api/pudpd/public/qr/html?d=... — это относительный путь к ресурсу на сервере.
Отправка запроса и получение ответа:
Для отправки запроса используйте метод Получить() объекта HTTPСоединение, который вернет объект HTTPОтвет.
Ответ = СоединениеHTTP.Получить(ЗапросHTTP);
Мы обязательно должны проверять код состояния HTTP-ответа. Код 200 означает успешное выполнение запроса.
Если Ответ.КодСостояния = 200 Тогда
HTMLСтрока = Ответ.ПолучитьТелоКакСтроку();
// Дальнейшая обработка HTMLСтрока
Иначе
Сообщить("Ошибка при получении страницы. Код ответа: " + Ответ.КодСостояния);
КонецЕсли;
Метод Ответ.ПолучитьТелоКакСтроку() позволяет получить содержимое страницы в виде строки.
Часто веб-страницы принимают параметры в 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 — это закодированный символ /. Это абсолютно нормально и является правильным поведением.
Если запросы выполняются с сервера 1С или в корпоративной сети, где доступ в интернет осуществляется через прокси-сервер, могут потребоваться дополнительные настройки.
Настройка DNS-сервера:
В некоторых случаях, особенно при проблемах с разрешением доменных имен, может помочь явное указание DNS-сервера. Например, можно попробовать прописать публичный DNS-сервер Яндекса 77.88.8.8 на уровне операционной системы, с которой выполняется запрос.
Использование ИнтернетПрокси:
В 1С мы можем настроить параметры прокси-сервера для HTTP-запросов с помощью объекта ИнтернетПрокси. Это особенно актуально, если прокси-сервер требует авторизации.
Прокси = Новый ИнтернетПрокси;
Прокси.Установить("адрес_прокси", порт_прокси);
Прокси.Пользователь = "логин";
Прокси.Пароль = "пароль";
// Затем передайте объект Прокси в HTTPСоединение
СоединениеHTTP = Новый HTTPСоединение("app.fgislk.gov.ru", 443, Прокси,,,, Новый ЗащищенноеСоединениеOpenSSL());
Мы можем указать прокси как для HTTP, так и для HTTPS протоколов отдельно. Если прокси не требует авторизации, поля Пользователь и Пароль можно оставить пустыми.
Файл inetcfg.xml:
Настройки прокси по умолчанию могут быть заданы в файле inetcfg.xml, который находится в каталоге CONF исполняемых файлов 1С. Эти настройки имеют приоритет над системными настройками Windows и могут быть полезны для централизованного управления прокси на серверах 1С.
После получения HTML-кода страницы в виде строки, часто возникает задача извлечения конкретных данных. Для этого в 1С предусмотрены объекты для работы с DOM-моделью (Document Object Model) HTML-документа.
Чтение HTML-строки:
Используем объект ЧтениеHTML для загрузки полученной HTML-строки.
Если Ответ.КодСостояния = 200 Тогда
HTMLСтрока = Ответ.ПолучитьТелоКакСтроку();
ЧтениеHTML = Новый ЧтениеHTML;
ЧтениеHTML.УстановитьСтроку(HTMLСтрока);
Иначе
Сообщить("Код ответа: " + Ответ.КодСостояния);
Возврат;
КонецЕсли;
Построение DOM-модели:
Объект ПостроительDOM позволяет преобразовать HTML-код в объектную модель, с которой удобно работать.
ПостроительDOM = Новый ПостроительDOM;
ДокументHTML = ПостроительDOM.Прочитать(ЧтениеHTML);
Теперь объект ДокументHTML представляет собой дерево элементов, аналогичное тому, как веб-браузеры представляют страницу.
Обход и поиск элементов:
Для навигации по DOM-модели мы можем использовать метод СоздатьОбходДерева(), начиная с корневого элемента, например, ДокументHTML.Тело.
Обход = ДокументHTML.СоздатьОбходДерева(ДокументHTML.Тело);
Пока Обход.Следующий() Цикл
ТекущийУзел = Обход.ТекущийУзел;
// Анализируем ТекущийУзел: его тип, имя, атрибуты, содержимое
// Например, если ТекущийУзел.Имя = "div" и у него есть нужный атрибут
// Мы можем извлечь его текстовое содержимое: ТекущийУзел.ТекстовоеСодержимое
КонецЦикла;
Мы можем искать элементы по их тегам, атрибутам, классам и т.д., что позволяет извлекать нужные данные. Однако, следует помнить, что прямой парсинг HTML может быть хрупким: любое изменение в разметке сайта может сломать ваш алгоритм. Если есть возможность, предпочтительнее использовать API.
Важно понимать, что не всегда то, что выглядит как обычная веб-страница, является таковой. Как было отмечено в исходной теме, адрес app.fgislk.gov.ru/pudpd/api/... явно указывает на API (Application Programming Interface) какого-то приложения.
Если вы взаимодействуете с API, то наиболее корректным, надежным и "цивилизованным" способом является использование методов, предоставляемых разработчиком API. Это включает:
Использование правильных HTTP-методов: Вместо всегда использовать Получить() (GET), API может требовать Отправить() (POST), Поместить() (PUT) или Удалить() (DELETE).
Передачу данных в определенном формате: API часто ожидают данные в форматах JSON или XML, а не просто URL-параметрами. В 1С для работы с JSON используйте ЗаписьJSON и ЧтениеJSON, для XML — ЗаписьXML и ЧтениеXML.
Авторизацию: Многие API требуют авторизации (например, через токены OAuth, API-ключи или, как в случае с ФГИС ЛК, через ЕСИА).
Для взаимодействия с такими системами, как ФГИС ЛК (Федеральная государственная информационная система лесного комплекса), настоятельно рекомендуем изучить официальную документацию, которая обычно содержит описание всех доступных методов API и правил взаимодействия. Обращение к API обеспечивает стабильность и предсказуемость, в отличие от "партизанского" парсинга HTML.
В процессе работы с HTTP-запросами в 1С могут возникать различные проблемы. Вот несколько общих рекомендаций:
Обработка кодов состояния HTTP-ответа: Всегда проверяйте Ответ.КодСостояния. Коды 200 (Успех), 3xx (Перенаправления), 4xx (Ошибки клиента, например, 404 Not Found, 403 Forbidden), 5xx (Ошибки сервера) помогут вам понять причину проблемы.
Обработка перенаправлений (Redirects): Некоторые сайты могут перенаправлять запросы (например, с HTTP на HTTPS или на другой URL). В 1С объект HTTPСоединение по умолчанию следует перенаправлениям, но будьте готовы к тому, что АдресРесурса может измениться.
Проблемы безопасности: Использование HTTPS критически важно для защиты передаваемой информации. Избегайте передачи конфиденциальных данных по HTTP.
Производительность: Частые HTTP-запросы могут замедлять работу приложения. По возможности кешируйте данные или используйте асинхронные запросы.
Логирование ошибок: В случае возникновения ошибок, подробно логируйте информацию (URL, параметры, код ответа, текст ошибки), чтобы облегчить отладку.
Сетевые проблемы и права: Ошибки типа "Ошибка работы с Интернет" часто указывают на проблемы с доступом в сеть с компьютера или сервера, где выполняется запрос, блокировку файрволлом или недостаточные права пользователя, от имени которого работает процесс 1С.
Мы рассмотрели все основные аспекты получения кода веб-страницы в 1С. Помните, что выбор метода (прямой парсинг HTML или взаимодействие с API) зависит от конкретной задачи и возможностей целевого веб-ресурса. Всегда стремитесь к более надежным и поддерживаемым решениям, таким как работа через API.
← К списку