SOAP-интеграция в 1С:Предприятии 8.3: как работают веб-сервисы от WSDL до ответа
Содержание
Веб-сервис 1С — это объект конфигурации, который открывает наружу набор операций по протоколу SOAP. Внешняя программа отправляет XML-запрос на адрес вида http://сервер/база/ws/имя.1cws, платформа вызывает процедуру из модуля веб-сервиса и возвращает ответ тоже в XML. Описание всех операций и типов данных сервис отдаёт сам — в виде WSDL по адресу с суффиксом ?wsdl.
Работает это одинаково во всех конфигурациях на платформе 8.3: БП, УТ, ЗУП, ERP. Разница только в том, какие веб-сервисы в них уже есть. Нужен веб-сервер (Apache или IIS) с модулем расширения 1С, без него сервис снаружи недоступен.
Как устроен веб-сервис 1С: SOAP, WSDL и две стороны обмена
В любой SOAP-интеграции две роли. Поставщик публикует сервис и ждёт запросов. Потребитель читает WSDL и вызывает операции. 1С умеет быть и тем, и другим.
Путь одного запроса выглядит так:
- Клиент отправляет POST-запрос с SOAP-конвертом (
Envelope, внутриBodyс именем операции и параметрами). - Веб-сервер принимает его и передаёт модулю расширения 1С (
wsap24.dllдля Apache 2.4 илиwsisapi.dllдля IIS). - Модуль по файлу
default.vrdпонимает, к какой базе обращаться, и открывает сеанс от имени пользователя 1С. - Платформа разбирает XML, приводит параметры к типам из WSDL и вызывает функцию модуля веб-сервиса.
- Результат функции сериализуется обратно в 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С
Ниже — минимальный рабочий сервис, который по номеру заказа возвращает его статус. Если конфигурация типовая и стоит на поддержке, делайте сервис в расширении конфигурации: так он переживёт обновление и не снимет базу с поддержки.
Объект и его свойства
- Откройте конфигуратор, в дереве раскройте
Общие → Веб-сервисы, нажмите «Добавить». - Задайте имя, например
Orders. - Заполните свойства:
- Пространство имён URI — уникальная строка вида
http://example.ru/orders. Это не обязательно реальный сайт, это идентификатор; - Пакеты XDTO — пакеты с типами, которые нужны сервису (про них ниже);
- Имя файла публикации — например
orders.1cws. Оно попадёт в адрес; - Повторное использование сеансов и Время жизни сеанса — влияют на скорость под нагрузкой.
- Пространство имён URI — уникальная строка вида
Операции и параметры
- На вкладке «Операции» добавьте операцию
GetOrderStatus. - Укажите Тип возвращаемого значения — например
xs:stringиз пространстваhttp://www.w3.org/2001/XMLSchema. - Добавьте параметр
Numberс типомxs:stringи направлением «Входной». - В свойстве «Имя метода» нажмите лупу: платформа создаст функцию-заготовку в модуле сервиса.
Модуль веб-сервиса
Функция GetOrderStatus(Number)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Заказ.Проведен КАК Проведен,
| Заказ.ПометкаУдаления КАК ПометкаУдаления
|ИЗ
| Документ.ЗаказКлиента КАК Заказ
|ГДЕ
| Заказ.Номер = &Номер";
Запрос.УстановитьПараметр("Номер", Number);
Выборка = Запрос.Выполнить().Выбрать();
Если Не Выборка.Следующий() Тогда
ВызватьИсключение "Заказ " + Number + " не найден";
КонецЕсли;
Если Выборка.ПометкаУдаления Тогда
Возврат "deleted";
ИначеЕсли Выборка.Проведен Тогда
Возврат "posted";
Иначе
Возврат "draft";
КонецЕсли;
КонецФункции
Документ ЗаказКлиента здесь для примера: подставьте свой объект. ВызватьИсключение превращается у клиента в SOAP Fault с вашим текстом — это нормальный способ сообщить об ошибке
бизнес-логики.
Код модуля выполняется на сервере с правами пользователя, под которым открыт сеанс. Если пользователю не хватает прав на чтение документа, клиент получит ошибку, а не пустой ответ.
Публикация веб-сервиса 1С на веб-сервере
Сам по себе объект в конфигурации никому не виден. Его нужно опубликовать.
- Установите Apache 2.4 или включите роль IIS. При установке платформы отметьте компонент «Модули расширения веб-сервера».
- Запустите конфигуратор от имени администратора Windows: диалогу нужны права на запись в каталог веб-сервера и в его настройки.
- Откройте
Администрирование → Публикация на веб-сервере. - Укажите имя публикации (оно станет частью адреса, лучше латиницей), веб-сервер и каталог.
- На вкладке «Основные» оставьте флажок «Публиковать Web-сервисы по умолчанию» и проверьте галочки у нужных сервисов в списке.
- Нажмите «Опубликовать». Для 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С и как их отлаживать
Отладка кода веб-сервиса
Точку останова в модуле сервиса можно поймать штатным отладчиком.
- Включите отладку в публикации: в
default.vrdдобавьте элемент<debug enable="true" protocol="http" url="http://localhost:1550"/>, где адрес — сервер отладки. Перезапуск веб-сервера оборвёт текущие запросы, делайте это на тестовом стенде. - В конфигураторе откройте
Отладка → Подключение, нажмите «Автоматическое подключение» и отметьте веб-сервисы. - Поставьте точку останова и вызовите операцию с клиента.
Для проверки снаружи удобен SoapUI или Postman: загружаете WSDL, программа сама строит шаблон запроса. Так сразу видно, где проблема — в сервисе или в коде потребителя.
Если запросы идут медленно под нагрузкой, посмотрите свойство «Повторное использование сеансов». Без него каждый вызов открывает новый сеанс базы, а это ощутимые доли секунды на каждый запрос.
Частые вопросы
Можно ли опубликовать веб-сервис без веб-сервера?
Работают ли веб-сервисы в файловой базе?
Какой адрес давать партнёру — с ?wsdl или без?
?wsdl. Сами вызовы идут на адрес точки подключения из WSDL, обычно тот же адрес без суффикса.