Как вызвать веб-сервис или HTTP-сервис 1С из стороннего Windows-приложения

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

При интеграции сторонних систем с платформой 1С часто возникает задача создания максимально простого внешнего клиента. Представим классическую ситуацию: на стороне 1С опубликован веб-сервис (SOAP) или HTTP-сервис, принимающий один строковый параметр. Нам необходимо разработать ультралегкое Windows-приложение с одним полем ввода и одной кнопкой, при нажатии на которую данные будут отправляться в базу 1С.

В этой статье мы подробно разберем, как решить эту задачу различными способами — от простейших скриптов, не требующих компиляции, до полноценных скомпилированных приложений. Мы проанализируем преимущества каждого подхода, сравним протоколы SOAP и HTTP и выберем оптимальные инструменты для разработки.

Выбор архитектуры: SOAP против HTTP-сервисов

Прежде чем перейти к написанию кода клиентской части, давайте разберем важный архитектурный вопрос, затронутый нашими коллегами на форуме: что использовать — стандартный веб-сервис (SOAP) или HTTP-сервис?

Веб-сервисы (SOAP) используют протокол XML для обмена данными. Основная сложность при работе с SOAP в простейших сторонних приложениях без использования тяжелых специализированных библиотек — это необходимость вручную формировать конверт запроса (SOAP Envelope) и парсить XML-ответ. Это довольно трудоемкий процесс, требующий написания избыточного кода.

HTTP-сервисы (REST) работают напрямую с HTTP-запросами (GET, POST и т.д.). В качестве формата передачи данных обычно используется лаконичный JSON. Вызвать HTTP-сервис намного проще: это аналогично выполнению обычного запроса в браузере. Если у вас есть возможность изменить логику на стороне 1С, настоятельно рекомендуется переписать веб-сервис на HTTP-сервис. Это существенно упростит разработку клиента на любом языке программирования.

Ниже мы подробно рассмотрим несколько практических вариантов реализации клиентского приложения.

Решение 1. HTML-страница с JavaScript (Решение без компиляции)

Самый простой и быстрый способ отправить запрос к сервису 1С — создать обычную локальную HTML-страницу с кнопкой и скриптом на JavaScript. Этот метод вообще не требует установки компиляторов, сред разработки или дополнительных библиотек.

Рассмотрим по шагам реализацию этого подхода:

  1. Создаем на рабочем столе текстовый файл и сохраняем его с расширением .html.
  2. Внутри файла размечаем простейшую форму с текстовым полем ввода и кнопкой отправки.
  3. Используем стандартный JavaScript-метод fetch для отправки асинхронного POST-запроса к HTTP-сервису 1С.

Посмотрим на пример структуры такого HTML-файла:


<!DOCTYPE html>
<html>
<head>
    <title>Отправка данных в 1С</title>
    <meta charset="utf-8">
</head>
<body>
    <div style="margin: 50px;">
        <label for="inputText">Введите строку:</label><br><br>
        <input type="text" id="inputText" style="width: 300px;"><br><br>
        <button onclick="sendData()">Отправить в 1С</button>
    </div>

    <script>
        async function sendData() {
            const val = document.getElementById('inputText').value;
            const url = 'http://localhost/YourBase/hs/YourService/YourMethod';
            
            try {
                const response = await fetch(url, {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/json',
                        'Authorization': 'Basic ' + btoa('1C_User:1C_Password')
                    },
                    body: JSON.stringify({ parameter: val })
                });
                
                if (response.ok) {
                    alert('Данные успешно отправлены!');
                } else {
                    alert('Ошибка при отправке: ' + response.status);
                }
            } catch (error) {
                alert('Сетевая ошибка: ' + error.message);
            }
        }
    </script>
</body>
</html>

Преимущества: Полная кроссплатформенность, мгновенный запуск на любом компьютере, отсутствие необходимости компиляции.

Недостатки: Код авторизации (логин/пароль к 1С) находится в открытом виде внутри скрипта, что небезопасно, если к файлу имеют доступ посторонние пользователи.

Решение 2. Скрипт на PowerShell (Быстрое создание GUI без стороннего ПО)

PowerShell по умолчанию встроен во все современные операционные системы семейства Windows. Он обладает мощнейшим функционалом для работы с веб-службами и позволяет создавать полноценный графический интерфейс (GUI) средствами системной библиотеки Windows Forms.

Выясним, как построить приложение на PowerShell:

Для работы с классическими SOAP веб-сервисами 1С мы можем использовать специализированный командлет New-WebServiceProxy. Он автоматически считывает WSDL-описание сервиса и генерирует прокси-класс. Нам не нужно вручную парсить XML-пакеты!

Проанализируем пример кода скрипта PowerShell, создающего форму с кнопкой:


Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

# Создаем графическое окно
$form = New-Object System.Windows.Forms.Form
$form.Text = "Отправка в 1С"
$form.Size = New-Object System.Drawing.Size(350,180)
$form.StartPosition = "CenterScreen"

# Поле ввода
$textBox = New-Object System.Windows.Forms.TextBox
$textBox.Location = New-Object System.Drawing.Point(20,30)
$textBox.Size = New-Object System.Drawing.Size(290,20)
$form.Controls.Add($textBox)

# Кнопка отправки
$button = New-Object System.Windows.Forms.Button
$button.Location = New-Object System.Drawing.Point(20,70)
$button.Size = New-Object System.Drawing.Size(120,30)
$button.Text = "Отправить"
$form.Controls.Add($button)

# Действие при нажатии кнопки
$button.Add_Click({
    $text = $textBox.Text
    $wsdlUrl = "http://localhost/YourBase/ws/YourWebService?wsdl"
    
    # Настройка авторизации
    $secpasswd = ConvertTo-SecureString "1C_Password" -AsPlainText -Force
    $credentials = New-Object System.Management.Automation.PSCredential ("1C_User", $secpasswd)
    
    try {
        # Создаем прокси-объект веб-сервиса
        $proxy = New-WebServiceProxy -Uri $wsdlUrl -Credential $credentials
        # Вызываем метод веб-сервиса 1С
        $result = $proxy.YourMethod($text)
        [System.Windows.Forms.MessageBox]::Show("Успешно! Ответ от 1С: $result")
    }
    catch {
        [System.Windows.Forms.MessageBox]::Show("Ошибка: " + $_.Exception.Message)
    }
})

$form.ShowDialog()

Для работы с HTTP-сервисами (JSON/REST) вместо New-WebServiceProxy мы можем использовать командлет Invoke-RestMethod, который автоматически преобразует полученные JSON-ответы в стандартные объекты PowerShell.

Решение 3. AutoHotkey (Ультра-минималистичный код и компиляция в EXE)

Если вам требуется передать конечному пользователю именно исполняемый файл .exe, но вы не хотите разворачивать сложные среды разработки, отличным выбором станет бесплатный скриптовый язык AutoHotkey (AHK).

Рассмотрим подробнее процесс создания такого приложения:

  1. Устанавливаем бесплатный дистрибутив AutoHotkey.
  2. Создаем файл скрипта с расширением .ahk.
  3. Используем стандартный системный COM-объект WinHttp.WinHttpRequest.5.1 для отправки POST-запроса.

Ниже представлен готовый скрипт, реализующий графический интерфейс и отправку HTTP POST-запроса на языке AutoHotkey:


#NoEnv
SendMode Input
SetWorkingDir %A_ScriptDir%

; Создаем интерфейс программы
Gui, Add, Text, x20 y20 w280 h20, Введите строку для отправки в 1С:
Gui, Add, Edit, vMyInput x20 y40 w260 h20
Gui, Add, Button, gSendData x20 y80 w100 h30, Отправить
Gui, Show, w300 h130, Отправка в 1С
return

SendData:
Gui, Submit, NoHide
if (MyInput = "") {
    MsgBox, 48, Предупреждение, Поле ввода не должно быть пустым!
    return
}

; Формируем тело запроса
jsonPayload := "{""parameter"": """ . MyInput . """}"

; Создаем системный COM-объект для отправки HTTP-запросов
whr := ComObjCreate("WinHttp.WinHttpRequest.5.1")
url := "http://localhost/YourBase/hs/YourService/YourMethod"

try {
    whr.Open("POST", url, true)
    whr.SetRequestHeader("Content-Type", "application/json")
    
    ; Базовая авторизация в формате Base64 (в примере закодированы '1C_User:1C_Password')
    whr.SetRequestHeader("Authorization", "Basic MUdfVXNlcjoxQ19QYXNzd29yZA==")
    
    whr.Send(jsonPayload)
    whr.WaitForResponse()
    
    status := whr.Status
    if (status == 200) {
        MsgBox, 64, Успех, Данные успешно доставлены в 1С!
    } else {
        MsgBox, 16, Ошибка, Сервер вернул код ошибки: %status%
    }
} catch e {
    MsgBox, 16, Ошибка соединения, Не удалось связаться с сервером 1С.
}
return

GuiClose:
ExitApp

Чтобы превратить этот скрипт в полноценное Windows-приложение, используем бесплатную утилиту Ahk2Exe, которая идет в комплекте с AutoHotkey. Она упакует скрипт в один независимый файл .exe, готовый для работы на любом компьютере без необходимости установки дополнительных библиотек или интерпретаторов.

Решение 4. Разработка на Python с Tkinter и PyInstaller

Python — это современный кроссплатформенный стандарт для быстрого прототипирования и разработки утилит. Мы можем использовать встроенную графическую библиотеку Tkinter и упаковать проект в один файл через PyInstaller.

Разберем по шагам создание приложения на Python:

Для взаимодействия с SOAP-сервисами в Python используется мощная библиотека zeep, а для HTTP-сервисов — стандартная и интуитивно понятная библиотека requests. Ниже представлен пример кода формы для отправки запроса на HTTP-сервис:


import tkinter as tk
from tkinter import messagebox
import requests

def send_data():
    input_text = entry.get()
    if not input_text:
        messagebox.showwarning("Внимание", "Поле ввода пустое!")
        return
        
    url = "http://localhost/YourBase/hs/YourService/YourMethod"
    auth_credentials = ("1C_User", "1C_Password")
    payload = {"parameter": input_text}
    
    try:
        response = requests.post(url, json=payload, auth=auth_credentials)
        if response.status_code == 200:
            messagebox.showinfo("Успех", "Данные успешно отправлены в 1С!")
        else:
            messagebox.showerror("Ошибка", f"Код ошибки сервера: {response.status_code}")
    except Exception as e:
        messagebox.showerror("Сетевая ошибка", f"Не удалось отправить запрос: {str(e)}")

# Настройка главного окна GUI
root = tk.Tk()
root.title("Отправка в 1С")
root.geometry("320x150")

label = tk.Label(root, text="Введите строку:")
label.pack(pady=10)

entry = tk.Entry(root, width=35)
entry.pack(pady=5)

button = tk.Button(root, text="Отправить данные", command=send_data)
button.pack(pady=10)

root.mainloop()

После отладки скрипта мы можем легко скомпилировать его в автономный .exe файл. Для этого выполним в командной строке всего одну команду:

pyinstaller --onefile --noconsole main.py

Утилита самостоятельно соберет интерпретатор Python, все зависимости (включая графическую библиотеку) в один компактный исполняемый файл, который появится в папке dist.

Решение 5. Разработка на C# в среде Visual Studio Community

Если перед вами стоит задача разработать профессиональное Windows-приложение, оптимальным выбором будет использование языка C# и платформы .NET. На форуме упоминалась устаревшая среда разработки SharpDevelop, однако на сегодняшний день лучшим бесплатным стандартом является Visual Studio Community Edition.

Разберем, как реализовать подключение к SOAP веб-сервису 1С средствами Visual Studio:

  1. Создайте новый проект типа Windows Forms App (.NET Framework).
  2. В обозревателе решений нажмите правой кнопкой мыши по пункту "Ссылки" (References) и выберите "Добавить ссылку на службу..." (Add Service Reference...).
  3. В открывшемся окне введите URL-адрес WSDL-описания вашего веб-сервиса 1С (например, http://localhost/YourBase/ws/YourWebService?wsdl) и нажмите "Перейти".
  4. Среда Visual Studio автоматически прочитает спецификацию WSDL, сгенерирует строго типизированные прокси-классы и методы.
  5. Вам останется лишь создать форму с кнопкой и вызвать метод автоматически сгенерированного класса в коде обработчика события клика:

private void buttonSend_Click(object sender, EventArgs e)
{
    string textToSend = textBoxInput.Text;
    
    // Создаем экземпляр автоматически сгенерированного клиента веб-сервиса
    using (var client = new Your1CWebServiceClient())
    {
        // Настраиваем авторизацию на клиенте
        client.ClientCredentials.UserName.UserName = "1C_User";
        client.ClientCredentials.UserName.Password = "1C_Password";
        
        try
        {
            // Вызываем метод веб-сервиса напрямую как функцию C#
            string response = client.YourMethod(textToSend);
            MessageBox.Show("Успешный ответ от 1С: " + response);
        }
        catch (Exception ex)
        {
            MessageBox.Show("Ошибка при отправке: " + ex.Message);
        }
    }
}

Это классический, наиболее надежный промышленный метод интеграции, который позволяет работать с веб-сервисами как с локальными объектами в коде.

Полезные инструменты для отладки и тестирования запросов

Разрабатывая интеграцию, программисту крайне важно контролировать то, какие сетевые пакеты отправляет его программа и как на них реагирует сервер 1С. Для этих целей отлично подходят специализированные инструменты тестирования:

curl -u 1C_User:1C_Password -X POST -H "Content-Type: application/json" -d "{\"parameter\":\"test\"}" http://localhost/YourBase/hs/YourService/YourMethod

При использовании Postman вы можете воспользоваться великолепной функцией автоматической генерации кода. После настройки успешного тестового запроса нажмите кнопку "Code" на боковой панели Postman. Программа автоматически сгенерирует готовые фрагменты кода для отправки этого запроса на десятках языков программирования (включая C#, Python, JavaScript и PHP). Этот код можно сразу скопировать и вставить в проект разрабатываемой утилиты.

Подведем итоги: какой инструмент выбрать вам?

Мы проанализировали спектр бесплатных технологий для решения поставленной задачи. Выбор конкретного подхода зависит от ваших текущих ресурсов и требований:

← На главную