При интеграции сторонних систем с платформой 1С часто возникает задача создания максимально простого внешнего клиента. Представим классическую ситуацию: на стороне 1С опубликован веб-сервис (SOAP) или HTTP-сервис, принимающий один строковый параметр. Нам необходимо разработать ультралегкое Windows-приложение с одним полем ввода и одной кнопкой, при нажатии на которую данные будут отправляться в базу 1С.
В этой статье мы подробно разберем, как решить эту задачу различными способами — от простейших скриптов, не требующих компиляции, до полноценных скомпилированных приложений. Мы проанализируем преимущества каждого подхода, сравним протоколы SOAP и HTTP и выберем оптимальные инструменты для разработки.
Прежде чем перейти к написанию кода клиентской части, давайте разберем важный архитектурный вопрос, затронутый нашими коллегами на форуме: что использовать — стандартный веб-сервис (SOAP) или HTTP-сервис?
Веб-сервисы (SOAP) используют протокол XML для обмена данными. Основная сложность при работе с SOAP в простейших сторонних приложениях без использования тяжелых специализированных библиотек — это необходимость вручную формировать конверт запроса (SOAP Envelope) и парсить XML-ответ. Это довольно трудоемкий процесс, требующий написания избыточного кода.
HTTP-сервисы (REST) работают напрямую с HTTP-запросами (GET, POST и т.д.). В качестве формата передачи данных обычно используется лаконичный JSON. Вызвать HTTP-сервис намного проще: это аналогично выполнению обычного запроса в браузере. Если у вас есть возможность изменить логику на стороне 1С, настоятельно рекомендуется переписать веб-сервис на HTTP-сервис. Это существенно упростит разработку клиента на любом языке программирования.
Ниже мы подробно рассмотрим несколько практических вариантов реализации клиентского приложения.
Самый простой и быстрый способ отправить запрос к сервису 1С — создать обычную локальную HTML-страницу с кнопкой и скриптом на JavaScript. Этот метод вообще не требует установки компиляторов, сред разработки или дополнительных библиотек.
Рассмотрим по шагам реализацию этого подхода:
.html.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С) находится в открытом виде внутри скрипта, что небезопасно, если к файлу имеют доступ посторонние пользователи.
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.
Если вам требуется передать конечному пользователю именно исполняемый файл .exe, но вы не хотите разворачивать сложные среды разработки, отличным выбором станет бесплатный скриптовый язык AutoHotkey (AHK).
Рассмотрим подробнее процесс создания такого приложения:
.ahk.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, готовый для работы на любом компьютере без необходимости установки дополнительных библиотек или интерпретаторов.
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.
Если перед вами стоит задача разработать профессиональное Windows-приложение, оптимальным выбором будет использование языка C# и платформы .NET. На форуме упоминалась устаревшая среда разработки SharpDevelop, однако на сегодняшний день лучшим бесплатным стандартом является Visual Studio Community Edition.
Разберем, как реализовать подключение к SOAP веб-сервису 1С средствами Visual Studio:
http://localhost/YourBase/ws/YourWebService?wsdl) и нажмите "Перейти".
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). Этот код можно сразу скопировать и вставить в проект разрабатываемой утилиты.
Мы проанализировали спектр бесплатных технологий для решения поставленной задачи. Выбор конкретного подхода зависит от ваших текущих ресурсов и требований:
.exe без лишних файлов рядом — напишите скрипт на AutoHotkey и скомпилируйте его утилитой Ahk2Exe за 2 клика.PyInstaller.