В процессе автоматизации часто возникает задача передать данные из информационной базы 1С в стороннее веб-приложение. Это может быть ипотечный калькулятор на сайте банка, форма подачи заявки в государственные органы или внутренний портал контрагента. Поскольку прямого доступа к базе данных стороннего сайта у нас обычно нет, мы вынуждены взаимодействовать с его интерфейсом. Рассмотрим подробнее, как реализовать такую интеграцию, используя различные программные методы платформы 1С:Предприятие 8.
Самый распространенный и наглядный способ — это встраивание браузера непосредственно в форму 1С. Начиная с версии 8.3.14, платформа поддерживает современный движок Chromium (в дополнение к устаревшему Internet Explorer), что позволяет корректно отображать практически любые современные сайты.
Разберем по шагам алгоритм работы с этим инструментом:
Строка и перетащим его на форму, установив вид «Поле HTML документа».Проанализируем пример кода, который находит поле на странице по его идентификатору и заполняет его значением из реквизита документа 1С:
// В обработчике события ПриЗавершенииЗагрузки или по нажатию кнопки
ДокументHTML = Элементы.ПолеHTML.Документ;
Если ДокументHTML <> Неопределено Тогда
// Ищем элемент по ID (его можно узнать через F12 в браузере)
ПолеСумма = ДокументHTML.getElementById("calc_amount");
Если ПолеСумма <> Неопределено Тогда
ПолеСумма.value = Строка(Объект.СуммаДокумента);
КонецЕсли;
// Ищем элемент по имени, если ID отсутствует
ЭлементыПоИмени = ДокументHTML.getElementsByName("client_name");
Если ЭлементыПоИмени.length > 0 Тогда
ЭлементыПоИмени.item(0).value = Объект.Контрагент.Наименование;
КонецЕсли;
КонецЕсли;
Иногда прямое обращение к свойствам ДокументHTML через COM-объекты может работать медленно или иметь ограничения. В таких случаях более эффективным методом является инъекция JavaScript-кода. Это особенно актуально для современных SPA-приложений (на React или Angular), где простого изменения значения value может быть недостаточно для срабатывания внутренних событий сайта.
Выясним, как использовать метод ИсполнитьScript() для эмуляции действий пользователя:
// Формируем скрипт, который не только установит значение,
// но и вызовет событие 'change', чтобы сайт «увидел» изменения
ТекстСкрипта = "
| var input = document.getElementById('mortgage_term');
| input.value = '20';
| var event = new Event('change', { bubbles: true });
| input.dispatchEvent(event);
|
| // Нажимаем на кнопку расчета
| document.querySelector('.btn-calculate').click();
|";
Элементы.ПолеHTML.ИсполнитьScript(ТекстСкрипта);
Этот подход позволяет гибко управлять страницей, обходить некоторые защиты и имитировать реальную активность пользователя.
Если нам не требуется визуальное отображение процесса заполнения, мы можем проанализировать, какие данные и куда отправляет сайт при нажатии кнопки «Рассчитать». Обычно это POST-запрос к API сайта. Мы можем повторить этот запрос напрямую из 1С, используя объект HTTPСоединение.
Рассмотрим ситуацию: сайт отправляет данные в формате JSON. Мы можем сформировать такой же JSON в 1С и получить результат расчета в виде ответа сервера, минуя отрисовку интерфейса.
Соединение = Новый HTTPСоединение("api.bank.ru", 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("/v1/calculate");
// Структура данных для отправки
ПараметрыЗапроса = Новый Структура;
ПараметрыЗапроса.Вставить("amount", Объект.Сумма);
ПараметрыЗапроса.Вставить("period", 240);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ПараметрыЗапроса);
СтрокаJSON = ЗаписьJSON.Закрыть();
Запрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8);
Запрос.Заголовки.Вставить("Content-Type", "application/json");
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния = 200 Тогда
// Обрабатываем результат
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
Результат = ПрочитатьJSON(ЧтениеJSON);
Сообщить("Ежемесячный платеж: " + Результат.monthly_payment);
КонецЕсли;
Важно: Этот метод самый стабильный и быстрый, но он требует предварительного анализа сетевого трафика через инструменты разработчика в браузере (вкладка Network).
В случаях, когда сайт имеет сложную защиту от ботов или требует специфических версий браузеров, можно использовать Selenium. Это внешняя библиотека, которая управляет полноценным экземпляром Chrome или Firefox.
Для работы из 1С обычно используется либо COM-обертка (например, SeleniumWrapper), либо запуск сценариев на Python/PowerShell, которые 1С вызывает через ЗапуститьПриложение(). Selenium позволяет имитировать движения мыши, ввод с клавиатуры и ожидание появления элементов на странице, что делает его практически «всесильным» инструментом автоматизации.
Если веб-приложение открыто в обычном браузере (не внутри 1С), и мы не можем на него повлиять программно, остается метод «эмуляции нажатий клавиш». 1С может подготовить данные, скопировать их в буфер обмена и отправить команду активации окна браузера с последующей вставкой (Ctrl+V) и переходом по полям (Tab).
Рассмотрим пример использования объекта «WScript.Shell» для передачи данных:
Шелл = Новый COMОбъект("WScript.Shell");
Шелл.AppActivate("Заголовок окна браузера"); // Активируем окно
Приостановка(500); // Небольшая пауза для переключения фокуса
// Эмулируем ввод данных
Шелл.SendKeys(Строка(Объект.Сумма));
Шелл.SendKeys("{TAB}"); // Переход к следующему полю
Шелл.SendKeys(Строка(Объект.Срок));
Шелл.SendKeys("{ENTER}"); // Нажатие кнопки
Внимание: Данный метод считается крайне нестабильным («топорным»), так как любое всплывающее уведомление в Windows или случайное движение мыши пользователем может прервать процесс заполнения. Используйте его только в самом крайнем случае.
Подводя итог, проанализируем, какой метод выбрать:
Помните, что при работе с внешними сайтами их структура может измениться в любой момент. Поэтому при поиске элементов по ID или CSS-классам всегда добавляйте проверки на Неопределено, чтобы ваша обработка в 1С не завершалась с ошибкой при обновлении дизайна сайта банком.