SOAP или REST в 1С 8.3: как выбрать тип сервиса под конкретную интеграцию
Содержание
Главная разница между Web и HTTP сервисами 1С — в протоколе и строгости контракта. Web-сервис работает по SOAP: обмен идёт XML-конвертами, а описание методов и типов платформа сама отдаёт в виде WSDL. HTTP-сервис — это «голый» HTTP: вы сами задаёте адреса ресурсов, методы GET/POST/PUT/DELETE, формат тела (чаще JSON) и коды ответа.
Если коротко про выбор: внешняя система требует SOAP и WSDL (банк, госсервис, старая шина, другая 1С через WS-ссылку) — делайте Web-сервис. Сайт, мобильное приложение, интернет-магазин, микросервис на Python или JavaScript — делайте HTTP-сервис. Оба механизма есть в платформе 1С 8.3, публикуются на одном веб-сервере и могут жить в одной конфигурации одновременно.
Как устроен Web-сервис 1С на SOAP
Web-сервис — объект конфигурации в ветке Общие → Web-сервисы. У него есть операции (аналог процедур) с параметрами и возвращаемым значением. Типы параметров берутся из пакетов XDTO — это описание XML-схемы, по которой платформа проверяет и разбирает данные.
Что получает разработчик «бесплатно»:
- 📄 WSDL генерируется автоматически. После публикации описание доступно по адресу вида
http://server/base/ws/имя.1cws?wsdl. Клиент на любом языке строит по нему заготовку кода. - ✅ Проверка типов. Если клиент прислал строку там, где ждут число, ошибка случится ещё на этапе разбора конверта, до вашего кода.
- 🔁 Готовый клиент в самой 1С. Объект
WS-ссылкиимпортирует чужой WSDL, а в коде вызов выглядит как вызов метода объекта. - ⚠️ Ошибки в виде SOAP Fault. Исключение, вызванное в операции через
ВызватьИсключение, клиент получает в стандартном формате Fault.
Цена этой строгости — конверт. Даже ответ «true» обёрнут в Envelope, Body и пространства имён. Любое изменение сигнатуры операции меняет WSDL, и клиентов приходится перегенерировать.
Пример вызова чужого SOAP-сервиса из 1С без WS-ссылки, через динамическое определение:
Определения = Новый WSОпределения("https://partner.example/service?wsdl", "user", "pass");
Прокси = Определения.СоздатьПрокси("http://partner.example/ns", "OrderService", "OrderServiceSoap");
Результат = Прокси.GetOrderStatus("A-1025");
Три последних параметра — пространство имён, имя сервиса и имя точки подключения. Их берут из самого WSDL: атрибут targetNamespace, элементы service и port.
Чем отличаются HTTP-сервисы и в чём их плюсы
HTTP-сервисы появились в платформе 8.3.5. Это объект Общие → HTTP-сервисы со своей иерархией:
- Корневой URL — часть адреса, например
api. - Шаблоны URL — путь ресурса с параметрами в фигурных скобках:
/orders/{number}. - Методы — для каждого шаблона свой обработчик на GET, POST, PUT, DELETE и других HTTP-методах.
Опубликованный сервис отвечает по адресу http://server/base/hs/api/orders/A-1025. Обработчик получает объект HTTPСервисЗапрос и обязан вернуть HTTPСервисОтвет:
Функция OrdersGET(Запрос)
Номер = Запрос.ПараметрыURL["number"];
Данные = Новый Структура("number, status", Номер, "shipped");
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись, Данные);
ТекстОтвета = Запись.Закрыть();
Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Ответ.УстановитьТелоИзСтроки(ТекстОтвета, КодировкаТекста.UTF8);
Возврат Ответ;
КонецФункции
Сильные стороны HTTP-сервиса:
- 🪶 Лёгкий трафик. JSON без конверта и пространств имён, тело можно сжать на веб-сервере.
- 🌐 Любой клиент. Браузерный
fetch,curl, Postman, мобильное приложение — никаких генераторов кода не нужно. - 🧩 Полный контроль. Вы сами ставите код ответа (200, 201, 400, 404, 409), заголовки, кэширование, отдаёте файлы и картинки как двоичные данные.
- 🔄 Свободная эволюция. Новое поле в JSON старые клиенты просто проигнорируют. Версию API можно вынести в шаблон:
/v1/orders,/v2/orders.
Обратная сторона: контракта никто не проверяет. Валидацию входящих данных, разбор параметров запроса (Запрос.ПараметрыЗапроса) и формат ошибок пишет разработчик.
Сравнение Web и HTTP сервисов по ключевым параметрам
| Параметр | Web-сервис (SOAP) | HTTP-сервис (REST) |
|---|---|---|
| Формат данных | XML-конверт SOAP | Любой: JSON, XML, файл, текст |
| Описание интерфейса | WSDL создаётся платформой | Нет, документацию пишут вручную |
| Адрес | /ws/имя.1cws | /hs/корень/шаблон |
| Проверка типов | По XDTO, автоматически | Вручную в коде обработчика |
| Обработка ошибок | SOAP Fault | Коды HTTP + своё тело ошибки |
| Клиент в 1С | WS-ссылки, WSПрокси | HTTPСоединение, HTTPЗапрос |
| Объём трафика | Выше из-за конверта | Ниже |
| Порог входа для внешних разработчиков | Нужен SOAP-инструментарий | Достаточно curl |
| Где уместнее | Корпоративные шины, B2B, госсистемы | Сайты, мобильные приложения, микросервисы |
Таблица не про «лучше/хуже». Оба механизма выполняются на сервере 1С одинаково: запрос приходит на веб-сервер, модуль расширения веб-сервера передаёт его в информационную базу, там стартует сеанс и выполняется ваш код.
Производительность и накладные расходы: что реально тормозит
На простом методе разница в скорости между SOAP и REST в 1С заметна, но редко решает. Основные затраты — не в протоколе, а вокруг него.
Что добавляет SOAP:
- сериализация и разбор XML через XDTO — на больших пакетах (тысячи строк) это ощутимо по процессору и памяти;
- размер конверта: в обмене справочниками XML бывает в разы тяжелее аналогичного JSON;
- проверка по схеме при каждом вызове.
Что тормозит оба типа одинаково:
- 🐢 Старт сеанса на каждый вызов. Аутентификация, инициализация параметров сеанса, модуль сеанса — всё это выполняется при каждом новом сеансе. Если в модуле сеанса (
УстановкаПараметровСеанса) тяжёлые запросы, каждый вызов API будет медленным. - 🐢 Тяжёлый код обработчика. Запрос без индекса или чтение объекта целиком там, где хватило бы одного поля.
- 🐢 Синхронная длинная операция. Клиент ждёт, веб-сервер держит соединение, срабатывает таймаут.
Повторное использование сеансов снимает первый пункт. Режим задаётся при публикации и хранится в файле default.vrd атрибутом reuseSessions у конкретного сервиса. Значения:
| Значение | Поведение |
|---|---|
dontuse | Каждый вызов — новый сеанс (по умолчанию) |
autouse | Сеанс берётся из пула и возвращается в него после вызова |
use | Клиент сам управляет сеансом через cookie или заголовки |
Рядом задают sessionMaxAge (время жизни сеанса в пуле, секунды) и poolSize (размер пула). Для потока мелких запросов от сайта autouse обычно даёт самый заметный прирост.
Длинные операции — выгрузку за год, пересчёт остатков — не держите внутри вызова. Принимайте задание, запускайте фоновое задание и сразу возвращайте 202 с идентификатором. Клиент потом опрашивает статус отдельным GET.
Когда выбрать SOAP, а когда REST: сценарии
Несколько типовых ситуаций подробнее:
- 🏦 Банк, страховая, госинформсистема. Они почти всегда публикуют WSDL и требуют SOAP, часто с подписью сообщений. Выбора нет.
- 🛒 Сайт и 1С. Каталог, цены, остатки, заказы. REST и JSON — стандарт для веб-разработчиков. Дайте им
/v1/products,/v1/stock,/v1/orders. - 📱 Мобильное приложение торгового агента. Короткие частые запросы, слабый мобильный канал — лёгкий JSON и повторное использование сеансов.
- 🔗 Интеграционная шина. Если шина умеет оба протокола, решают договорённости. SOAP удобен там, где важна формальная схема и версии контракта согласуются документом.
Совмещать можно: один и тот же модуль с бизнес-логикой (общий модуль) вызывается и из операции Web-сервиса, и из метода HTTP-сервиса. Транспорт отдельно, логика отдельно.
Отладка и документирование сервисов
Отладка в Конфигураторе
Остановиться на точке останова внутри обработчика можно в обоих типах сервисов. Порядок:
- Включите в Конфигураторе отладку по протоколу HTTP:
Сервис → Параметры → Отладка. - При публикации на веб-сервере включите в публикации отладку — в
default.vrdпоявится элементdebugс адресом сервера отладки. - В меню
Отладка → Подключениеоткройте настройку автоматического подключения и отметьте «Web-сервис» и «HTTP-сервис». - Поставьте точку останова и вызовите сервис из Postman или
curl.
Для серверной базы отладка на сервере должна быть разрешена при запуске службы агента. Не включайте отладку на рабочей базе в часы работы пользователей: остановка на точке держит сеанс и может блокировать данные для других.
Чем тестировать
- SoapUI — загружает WSDL и сам строит запросы ко всем операциям Web-сервиса.
- Postman, Insomnia, curl — для HTTP-сервисов. Простейшая проверка:
curl -u api_user:password -H "Accept: application/json" \
"http://server/base/hs/api/orders/A-1025"
- Журнал регистрации — записывайте в него входящие параметры и ошибки через
ЗаписьЖурналаРегистрациис отдельным событием, например «API.Заказы». Иначе после сбоя у партнёра вы не докажете, что именно пришло.
Документация
У Web-сервиса документация — это WSDL плюс короткое описание смысла операций. У HTTP-сервиса автоматического описания нет. Практика: вести файл в формате OpenAPI (Swagger) и показывать его внешним разработчикам. Без этого каждый новый подрядчик будет выяснять поля методом проб.
Минимум, который должен быть в описании REST-API 1С: адреса и методы, обязательные поля, пример запроса и ответа, перечень кодов ошибок и формат тела ошибки.
Публикация и внедрение: практические рекомендации
Оба типа сервисов публикуются одной процедурой: Администрирование → Публикация на веб-сервере в Конфигураторе. Нужен установленный веб-сервер (IIS или Apache) и модуль расширения веб-сервера из дистрибутива платформы той же версии, что и сервер 1С. В окне публикации на вкладках отмечают, какие Web-сервисы и HTTP-сервисы выставить наружу.
Рекомендации, которые сэкономят время после запуска:
- Отдельный пользователь для API. Создайте пользователя информационной базы с ролью, где разрешено только нужное. Не публикуйте сервис под администратором.
- Только HTTPS снаружи. Basic-аутентификация передаёт логин и пароль в каждом запросе; без шифрования их видно в канале.
- Версия в адресе.
/v1/в шаблоне URL или отдельный Web-сервисOrdersV2— и старые клиенты не ломаются при изменениях. - Единый формат ошибки. Для REST — JSON вида
{"error": "код", "message": "текст"}и честный код HTTP. Не отдавайте 200 с текстом «Ошибка» внутри. - Идемпотентность записи. Если клиент повторил POST после таймаута, заказ не должен задвоиться. Принимайте внешний идентификатор и проверяйте, нет ли уже такого документа.
- Ограничение объёма. Списки отдавайте страницами (
?offset=0&limit=100), а не целиком. - Повторное использование сеансов — для частых коротких запросов, как описано выше.
После обновления платформы на сервере переустановите модуль расширения веб-сервера той же версии и перезапустите веб-сервер. Перезапуск IIS или Apache обрывает все текущие подключения к опубликованным базам, включая веб-клиент, — делайте это вне рабочего времени.
Частые вопросы
Можно ли в одной конфигурации держать и Web-сервис, и HTTP-сервис?
HTTP-сервис в 1С — это уже REST?
Чем HTTP-сервис отличается от стандартного интерфейса OData?
Работают ли сервисы в файловой базе?
Как передать файл через сервис?
УстановитьТелоИзДвоичныхДанных с нужным Content-Type. В Web-сервисе — параметром типа base64Binary в пакете XDTO, что увеличивает объём примерно на треть.