При автоматизации взаимодействия 1С с веб-ресурсами программисты часто сталкиваются с необходимостью управлять элементами экранных форм. Одной из типичных задач является выбор значения в выпадающем списке (тег select) путем установки атрибута selected для конкретной опции (тег option). В этой статье мы подробно разберем, как реализовать такое взаимодействие, проанализируем ошибки начинающих и рассмотрим наиболее эффективный способ получения данных с сайта без имитации действий пользователя.
Рассмотрим ситуацию, когда нам необходимо программно «нажать» на пункт списка. В 1С работа с HTML-документом может вестись через встроенные средства платформы (типы ДокументHTML, ЭлементHTML). Проанализируем типичный код, который часто не срабатывает у новичков, и выясним причину.
Часто программисты пытаются просто создать атрибут и добавить его к элементу, забывая о связях объектов. Посмотрим на правильный пример установки атрибута через setAttributeNode:
// Предположим, ЭлементДом — это нужный нам тег <option>
НовыйАтрибут = ДокументHTML.createAttribute("selected");
АтрибутЭлемента = ЭлементДом.setAttributeNode(НовыйАтрибут);
АтрибутЭлемента.Значение = "true";
Однако стоит учитывать, что современные сайты часто используют JavaScript-фреймворки (React, Vue, Angular). Простое изменение атрибута в DOM-дереве может не инициировать программную логику сайта. В таких случаях мы рекомендуем использовать метод setAttribute для событий или прямое выполнение JavaScript-кода.
Если вы работаете с полем HTML-документа на форме 1С, попробуйте следующий подход для установки обработчиков или изменения состояния:
ЭлементДом = Элементы.ПолеХТМЛ.Документ.getElementById("ID_ЭЛЕМЕНТА");
// Установка значения напрямую через свойство (если доступно в COM-объекте)
ЭлементДом.value = "3";
// Или вызов события изменения, чтобы сайт «понял», что выбор сделан
ТекстСкрипта = "document.getElementById('ID_ЭЛЕМЕНТА').dispatchEvent(new Event('change'));";
Элементы.ПолеХТМЛ.Документ.parentWindow.eval(ТекстСкрипта);
Проанализируем ситуацию глубже. Зачем нам имитировать выбор в списке, если наша цель — получить конечные данные (например, курсы валют)? Большинство современных сайтов подгружают информацию через фоновые запросы. Выясним, как «перехватить» такой запрос и выполнить его напрямую из 1С, минуя визуальное управление браузером.
Этот способ является наиболее надежным и производительным, так как он не зависит от изменений в дизайне сайта или верстки списка. Разберем по шагам, как реализовать получение курса валют через HTTP-сервис.
Шаг 1: Подготовка параметров запроса. Нам необходимо сформировать строку запроса и закодировать её для передачи в URL.
// Формируем структуру запроса в формате JSON
СтрокаЗапроса = "{""fields"":""last"",""rics"":""USDEUR""}";
// Кодируем строку для URL, чтобы спецсимволы не нарушили запрос
СтрокаЗапросаURL = КодироватьСтроку(СтрокаЗапроса, СпособКодированияСтроки.КодировкаURL);
Шаг 2: Создание HTTP-соединения и выполнение запроса. Используем объекты HTTPСоединение и HTTPЗапрос для связи с сервером.
Сервер = "www.reuters.com";
HTTPСоединение = Новый HTTPСоединение(Сервер, 443, , , , 30, Новый ЗащищенноеСоединениеOpenSSL());
// Формируем путь к API с параметрами
ПутьКРесурсу = "pf/api/v3/content/fetch/quote-by-rics-v1?query=" + СтрокаЗапросаURL + "&d=108&_website=reuters";
HTTPЗапрос = Новый HTTPЗапрос(ПутьКРесурсу);
ОтветHTTP = HTTPСоединение.ВызватьHTTPМетод("GET", HTTPЗапрос);
ТелоHTTP = ОтветHTTP.ПолучитьТелоКакСтроку();
Шаг 3: Обработка результата. Полученный ответ обычно приходит в формате JSON. Разберем, как извлечь из него нужные цифры с помощью встроенных средств 1С.
Если ОтветHTTP.КодСостояния = 200 Тогда
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ТелоHTTP);
ДанныеJSON = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
// Извлекаем значение курса из сложной структуры JSON
// В данном примере структура: result -> market_data -> currencypairs[0] -> last
КурсСтрокой = ДанныеJSON.result.market_data.currencypairs[0].last;
// Преобразуем в число (используем функцию из БСП или собственную)
КурсЧислом = Число(КурсСтрокой);
Сообщить("Актуальный курс: " + КурсЧислом);
КонецЕсли;
Разберем основные преимущества программного обращения к данным по сравнению с управлением элементами HTML-страницы:
select__native-select__2WA65) часто генерируются автоматически и могут измениться при следующем обновлении сайта. API меняется значительно реже.ПолеHTMLДокумента системе приходится рендерить всю страницу, загружать картинки, стили и выполнять скрипты. HTTP-запрос получает только «голые» данные.Важный совет: Чтобы найти адрес API и формат запроса, используйте инструменты разработчика в браузере (клавиша F12). Перейдите на вкладку Network (Сеть), выберите тип XHR или Fetch и смените валюту в списке на сайте. Вы увидите запрос, который уходит на сервер. Именно его и нужно повторить в коде 1С.
Таким образом, мы рассмотрели два пути решения задачи. Если вам необходимо именно визуальное управление — используйте setAttributeNode или инъекцию JavaScript. Однако для задач сбора данных (парсинга) всегда старайтесь найти прямой путь через HTTP-запросы и формат JSON.