При интеграции 1С со сторонними приложениями часто возникает необходимость передать данные в 1С при наступлении определённого события. Для этого на стороне 1С публикуется HTTP-сервис, а стороннее приложение выполняет GET-запрос по указанному URL.
Однако на практике многие программы умеют лишь запускать внешние исполняемые файлы (.exe) с передачей параметров. Если в качестве такого файла указывать браузер (например, Internet Explorer или Google Chrome), при каждом срабатывании события у пользователя открывается окно браузера, что сильно мешает повседневной работе.
В этой статье мы разберем, как реализовать вызов HTTP-сервиса 1С в фоновом режиме, исключив появление окон браузера и консоли Windows.
Разберем подробнее, почему возникают визуальные помехи для пользователя:
--silent-launch) в современных браузерах не предотвращает открытие окна, если в аргументах передаётся конкретный URL-адрес. Браузер принудительно отображает графический интерфейс для загрузки страницы.curl.exe сторонним приложением Windows создаёт консольное окно. Даже если запрос выполняется за доли секунды, пользователь видит мелькание чёрного окна командной строки./b для командной строки предотвращает открытие нового окна консоли, но если сама командная строка (cmd.exe) инициализируется внешним приложением в обычном режиме, окно всё равно успевает отобразиться.Если стороннее приложение умеет только запускать файлы формата .exe с аргументами, самым простым и эффективным решением является применение утилиты-обёртки, созданной на WinForms или C++.
Такая утилита запускает процесс curl.exe без создания консольного окна (устанавливая флаг CREATE_NO_WINDOW при вызове системных функций Windows).
Рассмотрим порядок настройки:
curl.exe и помещаем её в локальный каталог на компьютере пользователя.StartCurl.exe), который принимает в качестве параметров путь к curl.exe и целевой URL.Пример строки запуска:
StartCurl.exe "C:\Program Files\curl\src\curl.exe" "http://localhost/BaseName/hs/ServiceName/FunctionName?Id1=111&Id2=222"
При таком подходе запрос успешно отправляется на HTTP-сервис 1С, а пользователь не замечает никаких графических или консольных окон.
Если в системе есть возможность вызывать исполняемый файл wscript.exe, входящий в состав Windows, то можно обойтись без сторонних .exe файлов. В отличие от cscript.exe, интерпретатор wscript.exe является GUI-приложением и не создаёт окно консоли.
Проанализируем ситуацию, когда необходимо вызвать HTTP-сервис прямо из скрипта или передать исполнение объекту WScript.Shell.
Пример вызова cURL через COM-объект WScript.Shell в фоновом режиме (значение флага 0 скрывает окно):
WshShell = Новый COMОбъект("WScript.Shell");
// Второй параметр 0 означает скрытое окно, третий параметр 1 — ожидание завершения
WshShell.Run("curl ""http://localhost/BaseName/hs/ServiceName/FunctionName?Id1=111&Id2=222""", 0, 1);
Также можно создать универсальный файл VBScript (например, send_request.vbs), выполняющий HTTP-запрос через встроенный объект Windows:
Set Arg = WScript.Arguments
If Arg.Count > 0 Then
Set HTTP = CreateObject("MSXML2.ServerXMLHTTP.6.0")
HTTP.open "GET", Arg(0), False
HTTP.send
End If
Вызов такого скрипта из стороннего приложения выглядит следующим образом:
wscript.exe "C:\Scripts\send_request.vbs" "http://localhost/BaseName/hs/ServiceName/FunctionName?Id1=111&Id2=222"
Разберем ещё один вариант, когда требуется максимальная изоляция вызова от сеанса пользователя. В Windows можно настроить задачу в Планировщике заданий (Task Scheduler):
Send1CRequest.curl.exe с аргументом URL вашего сервиса 1С.schtasks /run /tn "Send1CRequest"
Для скрытого вызова HTTP-сервиса 1С без всплывающих окон наиболее удобными являются два варианта:
.exe-загрузчика для curl.exe, если внешняя система позволяет запускать только исполняемые файлы.wscript.exe, если система позволяет передавать скрипты интерпретаторам Windows.