Интеграция через веб-сервисы 1С: SOAP, WSDL и публикация

· 9 мин

Содержание

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

Веб-сервис 1С — объект конфигурации, который публикуется на веб-сервере и отвечает на запросы по протоколу SOAP. Контракт сервиса описан в файле WSDL, поэтому любая современная платформа (Java, .NET, PHP, Python) строит клиент автоматически. Дальше разберём устройство, публикацию, безопасность, отладку и скорость.

Как устроен веб-сервис: SOAP, WSDL и XDTO

Цепочка вызова простая. Клиент берёт WSDL, видит список операций и типов, формирует SOAP-запрос (XML-конверт) и отправляет его на адрес сервиса. Веб-сервер передаёт запрос в 1С, платформа запускает процедуру-обработчик и возвращает XML-ответ.

В цепочке работают четыре компонента:

  • 📄 WSDL — описание сервиса: операции, параметры, типы, адрес.
  • ✉️ SOAP — формат сообщений: XML-конверт с телом запроса.
  • 🧩 XDTO — механизм платформы, который переводит значения 1С в XML и обратно по схеме типов.
  • 🌐 Веб-сервер (Apache или IIS) — принимает HTTP и отдаёт запрос веб-серверному модулю 1С.

Рядом с веб-сервисами в конфигураторе есть HTTP-сервисы. Это другой объект: вы сами задаёте шаблоны URL и методы (GET, POST), формат тела выбираете произвольно, обычно JSON. WSDL у них нет.

КритерийВеб-сервис (SOAP)HTTP-сервис
ФорматXML по схеме XDTOлюбой, чаще JSON
Описание контрактаWSDL создаётся автоматическиописываете вручную
Типизациястрогаяна вашей стороне
Когда братьобмен с системами, которые умеют SOAP, строгий контрактмобильные приложения, сайты, простые интеграции

Если у партнёра уже есть клиент, который умеет только SOAP, выбор очевиден. Для нового сайта или мобильного приложения чаще проще HTTP-сервис с JSON.

Веб-сервис выполняется на сервере, поэтому вид клиентского интерфейса (Такси, обычные или управляемые формы) на него не влияет. Публиковать можно файловую базу и клиент-серверную через веб-сервер.

Подготовка: что понадобится до публикации

Проверьте четыре вещи, иначе потеряете время на непонятных ошибках.

  1. Веб-сервер установлен, и вместе с платформой поставлен компонент «Модули расширения веб-серверов» (при установке платформы его отмечают отдельно).
  2. База доступна серверу: для файловой базы у пользователя службы веб-сервера есть права на каталог базы, для клиент-серверной — доступен кластер.
  3. В базе есть пользователь для интеграции, не совпадающий с рабочей учётной записью бухгалтера.
  4. Запущен Конфигуратор от имени администратора ОС: иначе публикация не запишет файлы в каталог веб-сервера.

Если сервис нужен партнёру из интернета, поставьте веб-сервер в отдельной сетевой зоне и открывайте наружу только порт HTTPS. Для тестов хватит Apache, который идёт в поставке платформы под Windows, или IIS. На Linux используют Apache.

Создание и описание интерфейса сервиса

Откройте конфигурацию в Конфигураторе и добавьте объект в ветке Общие → Веб-сервисы. Для нового сервиса задайте основные свойства:

  • Имя — часть адреса. Выбирайте латиницу без пробелов: оно попадёт в URL.
  • Пространство имён URI — уникальный идентификатор схемы. Это не обязательно рабочая ссылка, но он не должен повторяться у разных ваших сервисов.
  • Имя файла описания WSDL — как будет называться файл описания.
  • Модуль — код обработчиков операций лежит в модуле веб-сервиса.

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

Каждая операция — это отдельная функция с набором параметров. Для каждой задайте:

  • имя операции и тип возвращаемого значения;
  • имя процедуры-обработчика в модуле;
  • параметры: имя, тип, направление (входной, выходной, оба), возможность передачи null.

Типы берутся из пакета XDTO: простые (xs:string, xs:decimal, xs:boolean, xs:dateTime) или собственные объекты, которые вы описали в разделе Общие → Пакеты XDTO.

Пример обработчика операции «ПолучитьОстаток», которая возвращает число:

Функция ПолучитьОстаток(КодТовара, КодСклада)
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ЕСТЬNULL(СУММА(Остатки.КоличествоОстаток), 0) КАК Количество
    |ИЗ
    |    РегистрНакопления.ТоварыНаСкладах.Остатки(
    |        , Номенклатура.Код = &КодТовара
    |            И Склад.Код = &КодСклада) КАК Остатки";
    Запрос.УстановитьПараметр("КодТовара", КодТовара);
    Запрос.УстановитьПараметр("КодСклада", КодСклада);
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
        Возврат Выборка.Количество;
    КонецЕсли;
    Возврат 0;
КонецФункции

Имена регистра и реквизитов в вашей конфигурации будут другими. Сама схема не меняется: принять параметры, выполнить запрос, вернуть значение нужного типа.

Три правила проектирования

  • 🎯 Делайте крупные операции. Одна операция «ПринятьЗаказ» с целым заказом лучше, чем десять вызовов «УстановитьКонтрагента», «ДобавитьСтроку» и так далее.
  • 🏷️ Передавайте коды и идентификаторы, а не внутренние ссылки 1С: ссылка за пределами базы не имеет смысла.
  • 📌 Не меняйте операцию, на которую уже подписан партнёр. Нужна другая сигнатура — добавьте новую операцию или версию сервиса.

Настройка публикации на веб-сервере

Публикация записывает на веб-сервер файл default.vrd и настраивает виртуальный каталог. Через него веб-сервер знает, какую базу и какие сервисы отдавать.

Публикация из Конфигуратора

  1. Откройте нужную базу в Конфигураторе.
  2. В меню выберите Администрирование → Публикация на веб-сервере.
  3. Задайте имя (оно станет частью адреса), выберите веб-сервер и каталог.
  4. На вкладке со списком сервисов отметьте веб-сервис и при необходимости HTTP-сервисы. Без галки сервис не появится по адресу.
  5. Нажмите «Опубликовать».

Адрес сервиса получается такой: http://сервер/имя_публикации/ws/имя_сервиса. А WSDL отдаётся по адресу http://сервер/имя_публикации/ws/имя_сервиса?wsdl. Откройте его в браузере: если видите XML с описанием операций, публикация работает.

Что лежит в default.vrd

Файл можно править руками. Раздел веб-сервисов выглядит примерно так:

<ws pointEnableCommon="false">
    <point name="ExchangeService" alias="ExchangeService.1cws" enable="true"
           reuseSessions="autouse" sessionMaxAge="20"
           poolSize="10" poolTimeout="5"/>
</ws>

Что здесь важно:

ПараметрЧто делает
enableвключает или отключает конкретный сервис
reuseSessionsрежим повторного использования сеансов (dontuse, use, autouse)
sessionMaxAgeкак долго живёт сеанс, в секундах
poolSizeразмер пула сеансов
poolTimeoutсколько запрос ждёт свободный сеанс из пула

Изменение default.vrd в рабочей публикации сказывается сразу, и часть сеансов может оборваться. Правьте файл в согласованное окно, пока интеграция простаивает.

Частые затруднения при публикации

  • Страница выдаёт 404: проверьте, что сервис отмечен в списке публикации и что имя в адресе совпадает с именем объекта.
  • Ошибка 500 на пустом месте: у учётной записи веб-сервера нет доступа к каталогу файловой базы.
  • WSDL открывается, а вызов падает: не хватает прав пользователя 1С на данные, к которым обращается обработчик.

Безопасность и аутентификация пользователей

Веб-сервис по умолчанию доступен любому, кто знает адрес, но выполнит операцию только после аутентификации. Платформа поддерживает несколько способов.

  • 🔑 Базовая аутентификация (Basic) — логин и пароль пользователя информационной базы в заголовке запроса. Самый распространённый вариант.
  • 🪪 Аутентификация операционной системы — для доменной среды, когда клиент работает под доменной учёткой.
  • 🔐 Внешний шлюз — если нужна авторизация по токену, её выносят в прокси перед публикацией, а в 1С передают уже проверенную учётную запись.

Главные правила:

  1. Только HTTPS. Basic передаёт пароль в открытом виде в кодировке Base64, и без шифрования канала его перехватывают за секунды. Сертификат ставят на веб-сервере.
  2. Отдельный пользователь для интеграции с минимальными правами: роль даёт доступ только к данным, которые нужны операциям.
  3. Не включайте для такого пользователя права администратора и интерактивный вход.
  4. Ограничьте адреса, с которых можно обращаться, на уровне файрвола или веб-сервера.
  5. Не кладите пароль в код обработчиков и в журналы.

Внутри обработчика можно проверять права текущего пользователя через ПравоДоступа и отдельную роль. Тогда даже при утечке пароля злоумышленник получит только то, что разрешено этой ролью.

Каждый запрос от внешней системы занимает лицензию, если не работает повторное использование сеансов. При большой нагрузке может не хватить лицензий на клиент-серверную базу, и запросы получат отказ.

Отладка и тестирование интеграции

Проверяйте сервис по слоям: сначала публикация, затем контракт, потом логика.

Быстрая проверка

  1. Откройте http://сервер/имя_публикации/ws/имя_сервиса?wsdl в браузере. Нужен XML, а не страница ошибки.
  2. Загрузите этот WSDL в SoapUI или аналог: инструмент сам построит запросы ко всем операциям.
  3. Отправьте тестовый запрос с реальными параметрами и посмотрите XML-ответ.

Отладка внутри 1С

  • Включите отладку на сервере и подключите отладчик Конфигуратора к вызову. Точки останова в обработчике сработают, как при обычной серверной процедуре.
  • Пишите события в журнал регистрации: приход запроса, ключевые параметры, время ответа. Параметры с персональными данными не логируйте.
  • Для вызова чужого сервиса из 1С используйте объекты WSОпределения и WSПрокси: они читают WSDL и позволяют вызывать операции из кода.

Таблица диагностики

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

Производительность и оптимизация запросов

Медленный веб-сервис почти всегда страдает от трёх причин: накладные расходы на сеанс, слишком много мелких вызовов и неэффективные запросы в обработчике.

Сеансы и лицензии

Для каждого вызова платформе нужен сеанс. Создание сеанса — дорогая операция: запускается рабочий процесс, загружаются модули, занимается лицензия. Поэтому в default.vrd включают повторное использование сеансов: reuseSessions="autouse" оставляет сеанс для следующего запроса, если клиент передаёт идентификатор сеанса в заголовках (IBSession).

Размер пула подбирайте под нагрузку. Если одновременно приходят 20 запросов, а пул рассчитан на 5, остальные ждут poolTimeout секунд и получают отказ.

Что ускорит обработчик

  • ⚡ Передавайте пакеты данных: один вызов на 200 строк заказа вместо 200 вызовов.
  • ⚡ Работайте запросом, а не перебором справочника с обращением к реквизитам через точку.
  • ⚡ Выбирайте только нужные поля и ставьте условия по индексированным реквизитам.
  • ⚡ Для длинных операций (выгрузка за год) отвечайте сразу, а результат отдавайте отдельным запросом по идентификатору задания.
  • ⚡ Не открывайте транзакцию на всю операцию, если она читает данные.

Пример прикидки

Допустим, передача заказа из 50 строк делается пошагово: 1 вызов на шапку и 50 на строки — всего 51. При 0,2 секунды на вызов (сеть плюс сеанс) получается около 10 секунд. Один вызов с полным заказом занимает 0,4–0,6 секунды. Выигрыш в 15–25 раз получается без оптимизации самого кода.

Замеряйте время обработчика через ТекущаяУниверсальнаяДатаВМиллисекундах() в начале и конце и пишите результат в журнал. Так видно, тормозит база или сеть.

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

Чем веб-сервис 1С отличается от HTTP-сервиса?
Веб-сервис работает по SOAP, контракт описан в WSDL и формируется автоматически. В HTTP-сервисе вы сами задаёте адреса и формат тела, чаще всего JSON.
Можно ли вызвать веб-сервис без публикации на веб-сервере?
Нет. Платформа отдаёт сервис только через веб-сервер с модулем расширения, поэтому публикация обязательна.
Нужен ли отдельный пользователь для интеграции?
Да. Создайте учётную запись с ролью, которая даёт только нужные права, и запретите ей интерактивный вход. При утечке пароля ущерб будет ограничен.
Как узнать, какие операции есть у сервиса?
Откройте адрес сервиса с суффиксом ?wsdl или загрузите его в SoapUI. Там перечислены операции, параметры и типы.
Можно ли обращаться к веб-сервису 1С из другой 1С?
Да. Подключите WSDL через WSОпределения, создайте WSПрокси и вызывайте операции как методы объекта.
Что делать, если после обновления конфигурации сервис перестал отвечать?
Проверьте, что публикация сервиса включена и что в default.vrd сохранилась запись о нём. Иногда после переопубликации списка сервисов нужно отметить заново.