В процессе автоматизации бизнес-процессов часто возникает необходимость упростить взаимодействие пользователя с внешними веб-ресурсами. Типичный пример — необходимость открытия страницы активации сервиса (например, отраслевого ИТС) с уже подставленными данными логина, пароля или адреса электронной почты — поможет расширение для автозаполнения логинов и паролей на сайтах. Рассмотрим подробнее, какими способами можно реализовать заполнение полей на стороннем сайте средствами 1С:Предприятие.
Прежде чем приступать к сложному программированию, проанализируем самый простой и эффективный способ. Многие веб-сервисы поддерживают передачу данных для полей формы непосредственно в адресной строке, используя так называемые GET-запросы. Разберем по шагам, как это проверить и реализовать.
Для начала нам необходимо выяснить имена атрибутов name или id у интересующих нас полей на целевой странице. Откроем страницу в браузере, нажмем F12 (инструменты разработчика) и исследуем код элементов ввода. Если мы видим теги типа input name="email", есть высокая вероятность, что сайт примет данные через URL.
Сформируем строку адреса в 1С и вызовем стандартное приложение (браузер):
АдресСайта = "https://example.com/activation";
Параметры = "?email=" + ЭлектроннаяПочта + "&login=" + ЛогинПользователя;
ПолнаяСсылка = АдресСайта + Параметры;
ЗапуститьПриложение(ПолнаяСсылка);
Этот метод является наиболее безопасным и быстрым, так как не требует внедрения в структуру страницы. Однако он работает только в том случае, если разработчики сайта предусмотрели такую возможность.
Если передача через URL невозможна, мы можем использовать встроенный в 1С инструмент — Поле HTML-документа. Этот элемент управления позволяет загрузить страницу непосредственно в форму 1С и программно изменять её содержимое. На его основе создаются даже сложные элементы, такие как универсальные поля ввода для веб-клиента или полноценные редакторы форматированного текста. Выясним, как это работает на практике.
Разместим на управляемой форме реквизит с типом «Строка» и установим для него вид «Поле HTML-документа». Основная задача здесь — дождаться полной загрузки страницы, прежде чем пытаться заполнить поля. Для этого проанализируем событие ДокументСформирован.
Пример программного заполнения полей после загрузки:
&НаКлиенте
Процедура ПолеHTMLДокументСформирован(Элемент)
// Получаем доступ к объектной модели документа (DOM)
ДокументHTML = Элементы.ПолеHTML.Документ;
// Ищем элементы по их ID и устанавливаем значения
ПолеEmail = ДокументHTML.getElementById("email");
Если ПолеEmail <> Неопределено Тогда
ПолеEmail.value = "user@mail.ru";
КонецЕсли;
ПолеLogin = ДокументHTML.getElementById("login");
Если ПолеLogin <> Неопределено Тогда
ПолеLogin.value = "my_login_123";
КонецЕсли;
КонецПроцедуры
Важно помнить, что современные сайты часто используют динамическую подгрузку контента (AJAX). В таких ситуациях событие ДокументСформирован может сработать раньше, чем нужные поля появятся в структуре документа. Чтобы решить эту проблему, рассмотрим использование обработчика ожидания, который будет проверять наличие элементов на странице каждые несколько секунд.
Иногда прямое обращение к элементам через 1С может быть громоздким. В таких случаях эффективнее выполнить произвольный JavaScript-код в контексте открытой страницы. Этот подход позволяет не только заполнять поля, но и реализовывать сложные интерактивные диаграммы или даже встраивать целые пользовательские интерфейсы на Vue.js — для этого подойдет инструмент создания интерактивных дашбордов и HTML-интерфейсов в 1С. Это позволяет использовать всю мощь языка JS для поиска элементов, например, через querySelector или getElementsByClassName.
Проанализируем пример использования метода ВыполнитьScript:
КодJS = "
| (function() {
| var emailField = document.querySelector('input[type=\"email\"]');
| var loginField = document.querySelector('input[name=\"login\"]');
| if (emailField) emailField.value = 'test@example.com';
| if (loginField) loginField.value = 'admin';
| })();
|";
Элементы.ПолеHTML.ВыполнитьScript(КодJS);
Преимущество этого метода: JavaScript выполняется быстрее внутри движка браузера, и вы можете реализовывать сложную логику поиска элементов, которую трудно описать на языке 1С при работе с COM-объектами или встроенными типами платформы.
Рассмотрим ситуацию, когда нам нужно вывести пользователю сообщение и кнопку, которая перенаправит его на сайт с уже готовыми данными. Мы можем динамически создать HTML-файл на диске, записать в него нужный скрипт перенаправления или форму, и открыть его через 1С.
Посмотрим на пример формирования такого файла:
&НаСервере
Процедура СформироватьИОткрытьЛокальнуюСтраницу(ТекстСообщения)
ПутьHTML = "C:\Temp\redirect.html";
Текст = Новый ТекстовыйДокумент;
Текст.ДобавитьСтроку("<html><body onload='document.forms[0].submit()'>");
Текст.ДобавитьСтроку("<p>" + ТекстСообщения + "</p>");
Текст.ДобавитьСтроку("<form method='POST' action='https://site.ru/login'>");
Текст.ДобавитьСтроку("<input type='hidden' name='email' value='user@mail.ru'>");
Текст.ДобавитьСтроку("</form></body></html>");
Текст.Записать(ПутьHTML);
#НаКлиенте
ЗапуститьПриложение(ПутьHTML);
КонецПроцедуры
Этот способ позволяет имитировать отправку POST-запроса, что часто требуется для авторизации, когда передача логина и пароля в открытом виде через URL (GET) запрещена политикой безопасности сайта. Более подробно обмен с сайтом через POST-запросы рассмотрен в отдельной пошаговой инструкции.
Выясним причину, почему код может работать по-разному на разных компьютерах. Начиная с версии платформы 8.3.14, 1С позволяет выбирать движок для Поля HTML-документа: Internet Explorer или Chromium.
Элементы.ПолеHTML.Документ вернет COM-объект, работа с которым требует синтаксиса, отличного от Chromium.При использовании Chromium рекомендуется отдавать предпочтение методу ВыполнитьScript, так как он обеспечивает наибольшую кроссплатформенность и стабильность работы формы в тонком и веб-клиентах.
Мы разобрали основные стратегии взаимодействия 1С с внешними веб-интерфейсами. Выбор конкретного метода зависит от сложности целевого сайта:
HTTPСоединение для отправки данных напрямую на сервер. Для этого потребуется понимание работы с HTTP-запросами и API целевого сервиса.