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

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

При автоматизации взаимодействия 1С с веб-ресурсами программисты часто сталкиваются с необходимостью управлять элементами экранных форм. Одной из типичных задач является выбор значения в выпадающем списке (тег select) путем установки атрибута selected для конкретной опции (тег option). В этой статье мы подробно разберем, как реализовать такое взаимодействие, проанализируем ошибки начинающих и рассмотрим наиболее эффективный способ получения данных с сайта без имитации действий пользователя.

Метод 1: Манипуляция DOM-деревом через объектную модель 1С

Рассмотрим ситуацию, когда нам необходимо программно «нажать» на пункт списка. В 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(ТекстСкрипта);

Метод 2: Получение данных через HTTP-запросы (API сайта)

Проанализируем ситуацию глубже. Зачем нам имитировать выбор в списке, если наша цель — получить конечные данные (например, курсы валют)? Большинство современных сайтов подгружают информацию через фоновые запросы. Выясним, как «перехватить» такой запрос и выполнить его напрямую из 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;
    
    // Преобразуем в число (используем функцию из БСП или собственную)
    КурсЧислом = Число(КурсСтрокой);
    Сообщить("Актуальный курс: " + КурсЧислом);
КонецЕсли;

Почему работа с API лучше манипуляций с атрибутом selected?

Разберем основные преимущества программного обращения к данным по сравнению с управлением элементами HTML-страницы:

  1. Стабильность: Идентификаторы элементов (ID) и классы на сайте (вроде select__native-select__2WA65) часто генерируются автоматически и могут измениться при следующем обновлении сайта. API меняется значительно реже.
  2. Скорость: При использовании ПолеHTMLДокумента системе приходится рендерить всю страницу, загружать картинки, стили и выполнять скрипты. HTTP-запрос получает только «голые» данные.
  3. Масштабируемость: Если вам нужно получить курсы по 50 валютным парам, в случае с HTML-формой вам придется 50 раз менять значение в списке и ждать обновления страницы. В случае с API вы можете либо отправить один запрос со списком всех нужных валют, либо выполнить запросы в цикле за доли секунды.

Важный совет: Чтобы найти адрес API и формат запроса, используйте инструменты разработчика в браузере (клавиша F12). Перейдите на вкладку Network (Сеть), выберите тип XHR или Fetch и смените валюту в списке на сайте. Вы увидите запрос, который уходит на сервер. Именно его и нужно повторить в коде 1С.

Таким образом, мы рассмотрели два пути решения задачи. Если вам необходимо именно визуальное управление — используйте setAttributeNode или инъекцию JavaScript. Однако для задач сбора данных (парсинга) всегда старайтесь найти прямой путь через HTTP-запросы и формат JSON.

← На главную