Интеграция через веб-сервисы 1С: SOAP, WSDL и публикация
Содержание
Внешняя система должна получить из 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.
Веб-сервис выполняется на сервере, поэтому вид клиентского интерфейса (Такси, обычные или управляемые формы) на него не влияет. Публиковать можно файловую базу и клиент-серверную через веб-сервер.
Подготовка: что понадобится до публикации
Проверьте четыре вещи, иначе потеряете время на непонятных ошибках.
- Веб-сервер установлен, и вместе с платформой поставлен компонент «Модули расширения веб-серверов» (при установке платформы его отмечают отдельно).
- База доступна серверу: для файловой базы у пользователя службы веб-сервера есть права на каталог базы, для клиент-серверной — доступен кластер.
- В базе есть пользователь для интеграции, не совпадающий с рабочей учётной записью бухгалтера.
- Запущен Конфигуратор от имени администратора ОС: иначе публикация не запишет файлы в каталог веб-сервера.
Если сервис нужен партнёру из интернета, поставьте веб-сервер в отдельной сетевой зоне и открывайте наружу только порт 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 и настраивает виртуальный каталог. Через него веб-сервер знает, какую базу и какие сервисы отдавать.
Публикация из Конфигуратора
- Откройте нужную базу в Конфигураторе.
- В меню выберите
Администрирование → Публикация на веб-сервере. - Задайте имя (оно станет частью адреса), выберите веб-сервер и каталог.
- На вкладке со списком сервисов отметьте веб-сервис и при необходимости HTTP-сервисы. Без галки сервис не появится по адресу.
- Нажмите «Опубликовать».
Адрес сервиса получается такой: 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С передают уже проверенную учётную запись.
Главные правила:
- Только HTTPS. Basic передаёт пароль в открытом виде в кодировке Base64, и без шифрования канала его перехватывают за секунды. Сертификат ставят на веб-сервере.
- Отдельный пользователь для интеграции с минимальными правами: роль даёт доступ только к данным, которые нужны операциям.
- Не включайте для такого пользователя права администратора и интерактивный вход.
- Ограничьте адреса, с которых можно обращаться, на уровне файрвола или веб-сервера.
- Не кладите пароль в код обработчиков и в журналы.
Внутри обработчика можно проверять права текущего пользователя через ПравоДоступа и отдельную роль. Тогда даже при утечке пароля злоумышленник получит только то, что разрешено этой ролью.
Каждый запрос от внешней системы занимает лицензию, если не работает повторное использование сеансов. При большой нагрузке может не хватить лицензий на клиент-серверную базу, и запросы получат отказ.
Отладка и тестирование интеграции
Проверяйте сервис по слоям: сначала публикация, затем контракт, потом логика.
Быстрая проверка
- Откройте
http://сервер/имя_публикации/ws/имя_сервиса?wsdlв браузере. Нужен XML, а не страница ошибки. - Загрузите этот WSDL в SoapUI или аналог: инструмент сам построит запросы ко всем операциям.
- Отправьте тестовый запрос с реальными параметрами и посмотрите 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-сервиса?
Можно ли вызвать веб-сервис без публикации на веб-сервере?
Нужен ли отдельный пользователь для интеграции?
Как узнать, какие операции есть у сервиса?
?wsdl или загрузите его в SoapUI. Там перечислены операции, параметры и типы.Можно ли обращаться к веб-сервису 1С из другой 1С?
WSОпределения, создайте WSПрокси и вызывайте операции как методы объекта.Что делать, если после обновления конфигурации сервис перестал отвечать?
default.vrd сохранилась запись о нём. Иногда после переопубликации списка сервисов нужно отметить заново.