Веб-сервисы SOAP в 1С 8.3: публикация своего сервиса и вызов чужого
Содержание
WS-соединение в 1С — это обмен через веб-сервисы по протоколу SOAP. Одна сторона публикует сервис и его описание WSDL, другая вызывает его операции по HTTP или HTTPS, как обычные функции. В 1С 8.3 своё приложение может работать в обе стороны: быть сервером (объект WS-сервис в ветке Общие → Web-сервисы) и клиентом (объекты WS-ссылки, WSОпределения и WSПрокси).
Частое заблуждение — путать WS с WebSocket. Буквы похожи, но это разные вещи. WS в терминах 1С — Web Services, классический SOAP с XML-конвертами. Он работает по схеме «запрос — ответ», без постоянного канала. Механизм общий для платформы: настраивается одинаково в Бухгалтерии 3.0, ЗУП 3.1, УТ 11 и любой другой конфигурации на 8.3.
Как работает WS-соединение в 1С: WSDL, SOAP и сеанс
Схема вызова простая, и её полезно держать в голове при поиске ошибок.
- Клиент загружает WSDL — XML-описание сервиса. В нём перечислены операции, параметры, типы данных и адрес точки подключения.
- По этому описанию клиент собирает SOAP-конверт: XML с именем операции и значениями параметров.
- Конверт уходит POST-запросом на веб-сервер (Apache или IIS).
- Модуль расширения веб-сервера 1С передаёт запрос в информационную базу. База открывает сеанс под пользователем из запроса.
- Выполняется процедура-обработчик операции в модуле веб-сервиса. Результат упаковывается в ответный SOAP-конверт.
Адрес описания у опубликованной базы выглядит так:
http://server/buh/ws/Exchange.1cws?wsdl
Здесь buh — имя публикации базы, ws — фиксированная часть пути, Exchange.1cws — имя файла публикации из свойств веб-сервиса.
Открыть адрес с ?wsdl в браузере — самый быстрый тест. Если вернулся XML со словами definitions и operation, сервис опубликован и база отвечает. Всё остальное ищите уже в коде или в правах.
Типы параметров описываются через пакеты XDTO. Простые типы (строка, число, дата, булево) доступны сразу. Для сложных структур нужен свой пакет XDTO или передача данных одной строкой в XML либо JSON.
Отличия WS от HTTP-сервисов, OData и COM-соединения
У 1С несколько способов связать базу с внешней системой. Веб-сервисы — не всегда лучший выбор.
| Способ | Протокол | Когда выбирать | Ограничения |
|---|---|---|---|
| WS-сервисы | SOAP поверх HTTP(S) | Партнёр требует SOAP и WSDL, нужен строгий контракт типов | Тяжёлый XML, сложнее отладка |
| HTTP-сервисы | REST, любой формат (обычно JSON) | Сайты, мобильные приложения, современные API | Контракт описываете сами, WSDL нет |
| OData | REST по стандарту OData | Чтение и запись объектов без программирования сервиса | Нужно включить состав объектов, логику операций не добавить |
| COM-соединение | COM, только Windows | Обмен двух баз 1С в одной локальной сети | Не работает через интернет, медленно, привязано к версии платформы |
| Обмен файлами | XML через каталог, FTP, почту | Редкие пакетные выгрузки | Нет синхронного ответа |
HTTP-сервисы и стандартный интерфейс OData появились в платформе 8.3.5. До этого веб-сервисы были единственным встроенным способом принять вызов извне. Поэтому в старых интеграциях SOAP встречается чаще.
Плюс WS — строгий контракт. Клиент заранее знает типы всех параметров, а многие системы (банки, госсервисы, корпоративные шины) работают только с SOAP. Минус — объём XML и привязка к схеме: поменяли тип параметра — клиентам нужно заново читать WSDL.
Настройка WS-соединения на стороне 1С: создание и публикация веб-сервиса
Работа идёт в Конфигураторе. Для типовой конфигурации на поддержке удобнее делать сервис в расширении, чтобы не снимать конфигурацию с поддержки.
Шаг 1. Создайте объект веб-сервиса
- Откройте дерево конфигурации:
Общие → Web-сервисы, добавьте новый элемент. - Задайте имя, например
Exchange. - Заполните свойство
URI пространства имен, напримерhttp://example.org/exchange. Это идентификатор, а не адрес сайта: он нужен клиенту при создании прокси. - В свойстве
Пакеты XDTOукажите пакеты с вашими типами (для простых параметров достаточно стандартного пространства XML Schema). - Проверьте
Имя файла публикации— оно и станет частью адреса (Exchange.1cws).
Шаг 2. Опишите операции
На закладке операций добавьте операцию, например GetBalance. Укажите тип возвращаемого значения и параметры. У каждого параметра есть направление: входной, выходной или входной-выходной.
В свойстве операции укажите имя процедуры-обработчика. Сам код пишется в модуле веб-сервиса:
Функция GetBalance(ИНН)
Контрагент = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", ИНН);
Если Не ЗначениеЗаполнено(Контрагент) Тогда
Возврат 0;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЕСТЬNULL(СУММА(Остатки.СуммаОстаток), 0) КАК Сумма
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(, Счет = &Счет, , Субконто1 = &Контрагент) КАК Остатки";
Запрос.УстановитьПараметр("Счет", ПланыСчетов.Хозрасчетный.РасчетыСПокупателями);
Запрос.УстановитьПараметр("Контрагент", Контрагент);
Выборка = Запрос.Выполнить().Выбрать();
Выборка.Следующий();
Возврат Выборка.Сумма;
КонецФункции
Пример написан для Бухгалтерии 3.0: он возвращает сальдо по счёту 62.01 для контрагента по ИНН. Для другой конфигурации замените запрос на свой.
Шаг 3. Опубликуйте базу на веб-сервере
Предварительно на сервер нужно установить веб-сервер (Apache 2.4 или IIS) и компоненту платформы «Модули расширения веб-сервера» — она ставится тем же дистрибутивом, что и 1С.
- Запустите Конфигуратор от имени администратора Windows — без этого публикация не сможет записать файлы веб-сервера.
- Откройте
Администрирование → Публикация на веб-сервере. - Задайте имя публикации (латиницей, например
buh) и каталог. - На закладке веб-сервисов включите флажок публикации и отметьте нужные сервисы.
- Нажмите «Опубликовать» и перезапустите веб-сервер, если программа предложит.
Платформа создаст в каталоге публикации файл default.vrd. В нём хранятся строка подключения к базе и секция ws со списком опубликованных сервисов. При переносе публикации или ручной правке смотрят именно туда.
Перезапуск Apache или IIS обрывает все текущие веб-подключения к опубликованным базам: тонкий клиент через браузер, другие сервисы, обмены. Делайте это вне рабочего времени или после предупреждения пользователей.
Шаг 4. Заведите пользователя и проверьте
Создайте в базе отдельного пользователя для интеграции. Затем откройте адрес WSDL в браузере, введите его логин и пароль. Для проверки вызова операций удобна бесплатная программа SoapUI: она читает WSDL и сама строит шаблон запроса.
Подключение 1С к внешнему WS-сервису
Обратная задача — вызвать чужой сервис из своей базы. Есть два пути.
Статическая WS-ссылка
В Конфигураторе: Общие → WS-ссылки → Добавить. Платформа попросит адрес WSDL, скачает описание и сохранит его в конфигурацию. В коде прокси создаётся так:
Прокси = WSСсылки.Банк.СоздатьWSПрокси("http://example.org/exchange", "Exchange", "ExchangeSoap");
Прокси.Пользователь = "integration";
Прокси.Пароль = ПарольИзХранилища;
Результат = Прокси.GetBalance("7701234567");
Плюс — описание лежит в конфигурации, и при старте не нужно ходить за WSDL. Минус — если поставщик сменил контракт, ссылку придётся обновить в Конфигураторе.
Динамическое подключение через WSОпределения
Без изменения конфигурации — например, из внешней обработки:
Адрес = "https://partner.example.org/api/Exchange.1cws?wsdl";
SSL = Новый ЗащищенноеСоединениеOpenSSL();
Определения = Новый WSОпределения(Адрес, "integration", ПарольИзХранилища, , 30, SSL);
Прокси = Новый WSПрокси(Определения, "http://example.org/exchange", "Exchange", "ExchangeSoap", , 30, SSL);
Прокси.Пользователь = "integration";
Прокси.Пароль = ПарольИзХранилища;
Результат = Прокси.GetBalance("7701234567");
Три значения для WSПрокси берутся из WSDL:
- 🔹 URI пространства имён — атрибут
targetNamespaceв корне описания; - 🔹 имя сервиса — элемент
service; - 🔹 имя точки подключения — элемент
portвнутриservice.
Число 30 — тайм-аут в секундах. Без него зависший партнёр подвесит сеанс пользователя надолго.
Логин и пароль в WSОпределения нужны, чтобы скачать WSDL, а в свойствах прокси — для самих вызовов. Если сервис закрыт паролем, задавайте их в обоих местах. Забытые свойства прокси — частая причина ошибки 401 при открывающемся в браузере WSDL.
Где применяют веб-сервисы 1С: примеры интеграций
Несколько типовых сценариев, в которых WS-соединение оправдано.
- 🏦 Банки и платёжные шлюзы. Часть банковских API для корпоративных клиентов исторически работает на SOAP.
- 🏭 Обмен между базами разных компаний холдинга. Центральная база публикует сервис «Получить остатки», филиалы вызывают его по расписанию через регламентное задание.
- 🛒 Интернет-магазин и складская база. Сайт запрашивает цены и остатки, отправляет заказы. Сегодня для этого чаще берут HTTP-сервисы с JSON, но готовые модули обмена для некоторых платформ используют SOAP.
- 📱 Мобильные и внешние приложения. Сотрудник на выезде проверяет задолженность клиента, приложение вызывает операцию вроде
GetBalanceиз примера выше. - 🔗 Корпоративные шины данных. Шины интеграции обычно умеют работать с SOAP по WSDL без дополнительной разработки.
Для разовой ручной выгрузки веб-сервис не нужен. Он оправдан, когда обмен регулярный, нужен ответ сразу и другая сторона живёт вне вашей локальной сети.
Безопасность WS-соединения: как не открыть базу всему интернету
Опубликованный веб-сервис — дверь в базу. Её закрывают в несколько слоёв.
- Только HTTPS. По HTTP логин и пароль передаются в заголовке почти открытым текстом. Сертификат ставится на уровне Apache или IIS, база об этом не знает.
- Отдельный пользователь с узкой ролью. Не давайте интеграции права администратора. Создайте роль, которая читает и пишет только нужные объекты.
- Привилегированный режим — точечно. Если операции не хватает прав, включайте
УстановитьПривилегированныйРежим(Истина)в одном месте кода, а не расширяйте права пользователя. - Ограничение по IP. Разрешите доступ к пути
/ws/только с адресов партнёра — правилами веб-сервера или межсетевого экрана. - Проверка входных данных. Не подставляйте параметр операции в текст запроса склейкой строк, только через
УстановитьПараметр. Проверяйте длину и формат. - Пароли не в коде. В конфигурациях на БСП для этого есть безопасное хранилище данных. Пароль в тексте модуля увидит каждый, кто откроет конфигурацию.
- Публикуйте только нужное. В публикации отмечайте конкретные сервисы. Тонкий клиент и OData без надобности не включайте.
Встроенная аутентификация 1С на веб-сервере работает по схеме Basic. Без HTTPS её перехват в общей сети — вопрос минут.
В свойствах веб-сервиса есть настройка повторного использования сеансов и время жизни сеанса. Если вызовы частые, повторное использование снижает накладные расходы на открытие сеанса на каждый запрос. Но код операции тогда не должен хранить данные одного вызова в переменных модуля сеанса — их увидит следующий вызов.
Ошибки WS-соединения и их решения
Сначала определите, на каком шаге сломалось: открывается ли WSDL в браузере, доходит ли вызов до базы, падает ли код операции.
/ws/ и имя файла публикации из свойств веб-сервиса. Откройте default.vrd и найдите сервис в секции ws. После изменения конфигурации опубликуйте базу повторно.Пользователь и Пароль у объекта прокси. Проверьте карточку пользователя в базе и код клиента.ЗащищенноеСоединениеOpenSSL в WSОпределения и WSПрокси, либо сертификат сервера не прошёл проверку. Проверьте адрес с https и цепочку сертификатов партнёра.После изменения операций WSDL меняется. Клиент со статической WS-ссылкой продолжит работать по старому описанию и получит ошибку при первом же вызове изменённой операции. Обновите ссылку в Конфигураторе клиента.