SOAP-интеграция в 1С:Предприятии 8.3: как работают веб-сервисы от WSDL до ответа

· 10 мин

Содержание

Веб-сервис 1С — это объект конфигурации, который открывает наружу набор операций по протоколу SOAP. Внешняя программа отправляет XML-запрос на адрес вида http://сервер/база/ws/имя.1cws, платформа вызывает процедуру из модуля веб-сервиса и возвращает ответ тоже в XML. Описание всех операций и типов данных сервис отдаёт сам — в виде WSDL по адресу с суффиксом ?wsdl.

Работает это одинаково во всех конфигурациях на платформе 8.3: БП, УТ, ЗУП, ERP. Разница только в том, какие веб-сервисы в них уже есть. Нужен веб-сервер (Apache или IIS) с модулем расширения 1С, без него сервис снаружи недоступен.

Как устроен веб-сервис 1С: SOAP, WSDL и две стороны обмена

В любой SOAP-интеграции две роли. Поставщик публикует сервис и ждёт запросов. Потребитель читает WSDL и вызывает операции. 1С умеет быть и тем, и другим.

Путь одного запроса выглядит так:

  1. Клиент отправляет POST-запрос с SOAP-конвертом (Envelope, внутри Body с именем операции и параметрами).
  2. Веб-сервер принимает его и передаёт модулю расширения 1С (wsap24.dll для Apache 2.4 или wsisapi.dll для IIS).
  3. Модуль по файлу default.vrd понимает, к какой базе обращаться, и открывает сеанс от имени пользователя 1С.
  4. Платформа разбирает XML, приводит параметры к типам из WSDL и вызывает функцию модуля веб-сервиса.
  5. Результат функции сериализуется обратно в XML и уходит клиенту. Если в коде произошло исключение — клиент получает SOAP Fault с текстом ошибки.

Что входит в описание сервиса:

  • 📄 WSDL — XML-документ со списком операций, параметров и адресов точек подключения;
  • 🧩 XSD-типы — структура данных, которую сервис принимает и отдаёт;
  • 🔌 Точки подключения — 1С создаёт две: для SOAP 1.1 и SOAP 1.2 (имена вида ИмяСервисаSoap и ИмяСервисаSoap12).

WSDL — это контракт. Пока он не меняется, потребителю всё равно, как переписан код внутри 1С. Поменяли имя операции или тип параметра — потребителю придётся заново загрузить описание.

Веб-сервисы и HTTP-сервисы 1С: в чём разница и что выбрать

HTTP-сервисы появились в платформе 8.3.5. Веб-сервисы существуют намного дольше, ещё с 8.1. Оба объекта лежат в ветке Общие дерева конфигурации и публикуются одним диалогом, но работают по-разному.

ПризнакВеб-сервис (SOAP)HTTP-сервис (REST)
ФорматТолько XML в SOAP-конвертеЛюбой: JSON, XML, текст, файлы
ОписаниеWSDL формируется автоматическиНет, документацию пишете сами
АдресацияОдна точка, операция внутри XMLШаблоны URL, методы GET, POST, PUT, DELETE
ТипизацияСтрогая, через XDTO и XSDНет, разбираете тело запроса сами
Адрес/ws/имя.1cws/hs/корневойURL/…
Клиент в 1СWSОпределения, WSПрокси, WS-ссылкиHTTPСоединение, HTTPЗапрос
Типичные партнёрыБанки, госсистемы, корпоративные шины, старые .NET и Java-системыСайты, мобильные приложения, маркетплейсы, сервисы с JSON-API

Как выбирать на практике:

  • ✅ Веб-сервис — если партнёр сам прислал WSDL, требует SOAP или вам важна строгая проверка типов на входе;
  • ✅ HTTP-сервис — если интеграция с сайтом, ботом или фронтендом на JavaScript: JSON им привычнее, а запрос можно проверить обычным браузером или curl;
  • ✅ Стандартный интерфейс OData — если нужно просто читать и писать справочники и документы без своего кода. Он включается в той же публикации, но в ряде конфигураций требует отдельно указать состав объектов.

Отказываться от SOAP ради «моды на REST» не стоит. Для обмена со строго типизированной учётной системой веб-сервис часто проще: клиент получает готовый прокси, а неверный тип отсекается ещё до вашего кода.

Создание веб-сервиса в конфигураторе 1С

Ниже — минимальный рабочий сервис, который по номеру заказа возвращает его статус. Если конфигурация типовая и стоит на поддержке, делайте сервис в расширении конфигурации: так он переживёт обновление и не снимет базу с поддержки.

Объект и его свойства

  1. Откройте конфигуратор, в дереве раскройте Общие → Веб-сервисы, нажмите «Добавить».
  2. Задайте имя, например Orders.
  3. Заполните свойства:
    • Пространство имён URI — уникальная строка вида http://example.ru/orders. Это не обязательно реальный сайт, это идентификатор;
    • Пакеты XDTO — пакеты с типами, которые нужны сервису (про них ниже);
    • Имя файла публикации — например orders.1cws. Оно попадёт в адрес;
    • Повторное использование сеансов и Время жизни сеанса — влияют на скорость под нагрузкой.

Операции и параметры

  1. На вкладке «Операции» добавьте операцию GetOrderStatus.
  2. Укажите Тип возвращаемого значения — например xs:string из пространства http://www.w3.org/2001/XMLSchema.
  3. Добавьте параметр Number с типом xs:string и направлением «Входной».
  4. В свойстве «Имя метода» нажмите лупу: платформа создаст функцию-заготовку в модуле сервиса.

Модуль веб-сервиса

Функция GetOrderStatus(Number)
	
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	Заказ.Проведен КАК Проведен,
	|	Заказ.ПометкаУдаления КАК ПометкаУдаления
	|ИЗ
	|	Документ.ЗаказКлиента КАК Заказ
	|ГДЕ
	|	Заказ.Номер = &Номер";
	Запрос.УстановитьПараметр("Номер", Number);
	
	Выборка = Запрос.Выполнить().Выбрать();
	Если Не Выборка.Следующий() Тогда
		ВызватьИсключение "Заказ " + Number + " не найден";
	КонецЕсли;
	
	Если Выборка.ПометкаУдаления Тогда
		Возврат "deleted";
	ИначеЕсли Выборка.Проведен Тогда
		Возврат "posted";
	Иначе
		Возврат "draft";
	КонецЕсли;
	
КонецФункции

Документ ЗаказКлиента здесь для примера: подставьте свой объект. ВызватьИсключение превращается у клиента в SOAP Fault с вашим текстом — это нормальный способ сообщить об ошибке бизнес-логики.

Код модуля выполняется на сервере с правами пользователя, под которым открыт сеанс. Если пользователю не хватает прав на чтение документа, клиент получит ошибку, а не пустой ответ.

Публикация веб-сервиса 1С на веб-сервере

Сам по себе объект в конфигурации никому не виден. Его нужно опубликовать.

  1. Установите Apache 2.4 или включите роль IIS. При установке платформы отметьте компонент «Модули расширения веб-сервера».
  2. Запустите конфигуратор от имени администратора Windows: диалогу нужны права на запись в каталог веб-сервера и в его настройки.
  3. Откройте Администрирование → Публикация на веб-сервере.
  4. Укажите имя публикации (оно станет частью адреса, лучше латиницей), веб-сервер и каталог.
  5. На вкладке «Основные» оставьте флажок «Публиковать Web-сервисы по умолчанию» и проверьте галочки у нужных сервисов в списке.
  6. Нажмите «Опубликовать». Для Apache диалог предложит перезапустить службу — согласитесь вне рабочего времени, если на этом же сервере уже работают другие публикации: на время перезапуска они недоступны.

После публикации в каталоге появится default.vrd. Фрагмент про веб-сервисы выглядит так:

<ws pointEnableCommon="true">
	<point name="Orders" alias="orders.1cws" enable="true"/>
</ws>

Проверка: откройте в браузере http://сервер/имя_публикации/ws/orders.1cws?wsdl. Если вернулся XML с тегом definitions — сервис жив. Браузер спросит логин и пароль: это пользователь информационной базы 1С, а не Windows.

Для Linux порядок тот же, только публикацию удобнее делать утилитой webinst из каталога платформы. Модуль для Apache там — wsap24.so.

Как 1С сама вызывает внешний веб-сервис

Обратная задача: 1С выступает клиентом. Способов два.

Динамически, через WSОпределения

WSDL читается в момент выполнения кода. Удобно, когда адрес хранится в настройках и меняется между тестовым и рабочим контуром.

АдресWSDL = "http://srv/trade/ws/orders.1cws?wsdl";
Определения = Новый WSОпределения(АдресWSDL, "Обмен", "Пароль123");

Прокси = Новый WSПрокси(Определения,
	"http://example.ru/orders", // пространство имён URI
	"Orders",                   // имя сервиса
	"OrdersSoap");              // точка подключения
Прокси.Пользователь = "Обмен";
Прокси.Пароль = "Пароль123";

Статус = Прокси.GetOrderStatus("000123");
Сообщить("Статус заказа: " + Статус);

Имя сервиса и точки подключения берите из WSDL: из тегов service и port. Ошибка в любой из трёх строк конструктора даёт исключение ещё до вызова операции.

Статически, через WS-ссылку

В дереве конфигурации есть ветка Общие → WS-ссылки. Туда загружают WSDL один раз, и платформа хранит его внутри конфигурации. Плюсы: не нужно скачивать описание при каждом вызове, в коде проще создать прокси методом WSСсылки.ИмяСсылки.СоздатьWSПрокси(...). Минус: изменился WSDL у партнёра — ссылку надо обновить и выпустить новую версию конфигурации или расширения.

Пароль в тексте модуля, как в примере, — только для теста. В рабочей базе храните учётные данные в защищённом хранилище, например в подсистеме безопасного хранения БСП, если она есть в конфигурации.

XDTO: какие данные можно передавать через веб-сервисы 1С

Строка и число — простой случай. Как только нужно передать заказ с табличной частью, понадобятся пакеты XDTO — описание XML-типов внутри конфигурации.

Простые и составные типы

  • 🔤 Простые — xs:string, xs:decimal, xs:int, xs:boolean, xs:dateTime. Платформа сама превращает их в Строку, Число, Булево, Дату;
  • 🧱 Объектные — свои типы в пакете XDTO: «Заказ» со свойствами «Номер», «Дата», «Сумма» и списком «Строки»;
  • 📦 Двоичные данные — xs:base64Binary, так передают файлы и печатные формы.

Пакет создают в ветке Общие → XDTO-пакеты: задают пространство имён, добавляют тип объекта и его свойства. У свойства-списка указывают верхнюю границу -1 — это значит «сколько угодно элементов».

Как вернуть объект из операции

Функция GetOrder(Number)
	
	ПИ = "http://example.ru/orders";
	Заказ = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПИ, "Order"));
	Заказ.Number = Number;
	Заказ.Amount = 15400.50;
	
	ТипСтроки = ФабрикаXDTO.Тип(ПИ, "OrderLine");
	Для Каждого Товар Из ПолучитьСтрокиЗаказа(Number) Цикл
		Строка = ФабрикаXDTO.Создать(ТипСтроки);
		Строка.Item = Товар.Наименование;
		Строка.Qty = Товар.Количество;
		Заказ.Lines.Добавить(Строка);
	КонецЦикла;
	
	Возврат Заказ;
	
КонецФункции

ПолучитьСтрокиЗаказа — ваша функция, которая возвращает таблицу или массив структур. Тип возвращаемого значения операции в этом случае — Order из вашего пакета.

Вместо ручной сборки можно отдать объект 1С через СериализаторXDTO. Но тогда в XML уйдёт внутренняя структура конфигурации с её именами реквизитов. Для внешнего партнёра свой пакет почти всегда лучше: контракт не сломается после обновления.

Защита и авторизация веб-сервисов 1С

Опубликованный сервис — это дверь в учётную базу. Настройте её до того, как дадите адрес партнёру.

  • 🔐 Отдельный пользователь 1С только для обмена, с ролью, где есть права ровно на нужные объекты. Не давайте ему «Полные права»;
  • 🔒 HTTPS. Авторизация по умолчанию — Basic: логин и пароль идут в заголовке почти открытым текстом (Base64). Без TLS их видно в сети. Сертификат настраивают на веб-сервере;
  • 🚫 Не прописывайте пользователя в публикации. В диалоге публикации и в default.vrd можно задать логин и пароль по умолчанию — тогда сервис пускает всех без вопросов. Это оправдано только во внутренней сети с ограничением по IP;
  • 🌐 Ограничение по адресам — средствами веб-сервера или файрвола, если партнёр ходит с фиксированных IP;
  • 🧾 Проверка входных данных в коде: длина строк, допустимые значения. XDTO проверит тип, но не смысл.

Привилегированный режим (УстановитьПривилегированныйРежим(Истина)) в модуле сервиса включайте точечно, на конкретную операцию. Иначе ограничения роли обмена теряют смысл.

Ошибки веб-сервисов 1С и как их отлаживать

Диагностика: выберите симптом

Отладка кода веб-сервиса

Точку останова в модуле сервиса можно поймать штатным отладчиком.

  1. Включите отладку в публикации: в default.vrd добавьте элемент <debug enable="true" protocol="http" url="http://localhost:1550"/>, где адрес — сервер отладки. Перезапуск веб-сервера оборвёт текущие запросы, делайте это на тестовом стенде.
  2. В конфигураторе откройте Отладка → Подключение, нажмите «Автоматическое подключение» и отметьте веб-сервисы.
  3. Поставьте точку останова и вызовите операцию с клиента.

Для проверки снаружи удобен SoapUI или Postman: загружаете WSDL, программа сама строит шаблон запроса. Так сразу видно, где проблема — в сервисе или в коде потребителя.

Если запросы идут медленно под нагрузкой, посмотрите свойство «Повторное использование сеансов». Без него каждый вызов открывает новый сеанс базы, а это ощутимые доли секунды на каждый запрос.

Частые вопросы

Можно ли опубликовать веб-сервис без веб-сервера?
Нет. Платформа сама не слушает HTTP-порт для SOAP. Нужен Apache или IIS с модулем расширения 1С.
Работают ли веб-сервисы в файловой базе?
Да. Публикация файловой базы делается тем же диалогом, но при заметной нагрузке файловый режим упирается в блокировки, лучше переходить на клиент-сервер.
Какой адрес давать партнёру — с ?wsdl или без?
Для загрузки описания — с ?wsdl. Сами вызовы идут на адрес точки подключения из WSDL, обычно тот же адрес без суффикса.
Можно ли добавить веб-сервис в типовую конфигурацию без снятия с поддержки?
Да, через расширение конфигурации. Веб-сервисы и XDTO-пакеты поддерживаются в расширениях на современных версиях платформы 8.3.
Сервис отвечает в браузере, а 1С-клиент не подключается. Почему?
Чаще всего неверно указано пространство имён, имя сервиса или точки подключения в конструкторе WSПрокси. Скопируйте их из тегов WSDL дословно, с учётом регистра.