Веб-сервисы SOAP в 1С 8.3: публикация своего сервиса и вызов чужого

· 10 мин

Содержание

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 и сеанс

Схема вызова простая, и её полезно держать в голове при поиске ошибок.

  1. Клиент загружает WSDL — XML-описание сервиса. В нём перечислены операции, параметры, типы данных и адрес точки подключения.
  2. По этому описанию клиент собирает SOAP-конверт: XML с именем операции и значениями параметров.
  3. Конверт уходит POST-запросом на веб-сервер (Apache или IIS).
  4. Модуль расширения веб-сервера 1С передаёт запрос в информационную базу. База открывает сеанс под пользователем из запроса.
  5. Выполняется процедура-обработчик операции в модуле веб-сервиса. Результат упаковывается в ответный 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 нет
ODataREST по стандарту ODataЧтение и запись объектов без программирования сервисаНужно включить состав объектов, логику операций не добавить
COM-соединениеCOM, только WindowsОбмен двух баз 1С в одной локальной сетиНе работает через интернет, медленно, привязано к версии платформы
Обмен файламиXML через каталог, FTP, почтуРедкие пакетные выгрузкиНет синхронного ответа

HTTP-сервисы и стандартный интерфейс OData появились в платформе 8.3.5. До этого веб-сервисы были единственным встроенным способом принять вызов извне. Поэтому в старых интеграциях SOAP встречается чаще.

Плюс WS — строгий контракт. Клиент заранее знает типы всех параметров, а многие системы (банки, госсервисы, корпоративные шины) работают только с SOAP. Минус — объём XML и привязка к схеме: поменяли тип параметра — клиентам нужно заново читать WSDL.

Настройка WS-соединения на стороне 1С: создание и публикация веб-сервиса

Работа идёт в Конфигураторе. Для типовой конфигурации на поддержке удобнее делать сервис в расширении, чтобы не снимать конфигурацию с поддержки.

Шаг 1. Создайте объект веб-сервиса

  1. Откройте дерево конфигурации: Общие → Web-сервисы, добавьте новый элемент.
  2. Задайте имя, например Exchange.
  3. Заполните свойство URI пространства имен, например http://example.org/exchange. Это идентификатор, а не адрес сайта: он нужен клиенту при создании прокси.
  4. В свойстве Пакеты XDTO укажите пакеты с вашими типами (для простых параметров достаточно стандартного пространства XML Schema).
  5. Проверьте Имя файла публикации — оно и станет частью адреса (Exchange.1cws).

Шаг 2. Опишите операции

На закладке операций добавьте операцию, например GetBalance. Укажите тип возвращаемого значения и параметры. У каждого параметра есть направление: входной, выходной или входной-выходной.

В свойстве операции укажите имя процедуры-обработчика. Сам код пишется в модуле веб-сервиса:

Функция GetBalance(ИНН)

	Контрагент = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", ИНН);
	Если Не ЗначениеЗаполнено(Контрагент) Тогда
		Возврат 0;
	КонецЕсли;

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

	Выборка = Запрос.Выполнить().Выбрать();
	Выборка.Следующий();
	Возврат Выборка.Сумма;

КонецФункции

Пример написан для Бухгалтерии 3.0: он возвращает сальдо по счёту 62.01 для контрагента по ИНН. Для другой конфигурации замените запрос на свой.

Шаг 3. Опубликуйте базу на веб-сервере

Предварительно на сервер нужно установить веб-сервер (Apache 2.4 или IIS) и компоненту платформы «Модули расширения веб-сервера» — она ставится тем же дистрибутивом, что и 1С.

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

Платформа создаст в каталоге публикации файл default.vrd. В нём хранятся строка подключения к базе и секция ws со списком опубликованных сервисов. При переносе публикации или ручной правке смотрят именно туда.

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

Шаг 4. Заведите пользователя и проверьте

Создайте в базе отдельного пользователя для интеграции. Затем откройте адрес WSDL в браузере, введите его логин и пароль. Для проверки вызова операций удобна бесплатная программа SoapUI: она читает WSDL и сама строит шаблон запроса.

Веб-сервис готов к работе
Выполнено: 0 / 7

Подключение 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-соединения: как не открыть базу всему интернету

Опубликованный веб-сервис — дверь в базу. Её закрывают в несколько слоёв.

  1. Только HTTPS. По HTTP логин и пароль передаются в заголовке почти открытым текстом. Сертификат ставится на уровне Apache или IIS, база об этом не знает.
  2. Отдельный пользователь с узкой ролью. Не давайте интеграции права администратора. Создайте роль, которая читает и пишет только нужные объекты.
  3. Привилегированный режим — точечно. Если операции не хватает прав, включайте УстановитьПривилегированныйРежим(Истина) в одном месте кода, а не расширяйте права пользователя.
  4. Ограничение по IP. Разрешите доступ к пути /ws/ только с адресов партнёра — правилами веб-сервера или межсетевого экрана.
  5. Проверка входных данных. Не подставляйте параметр операции в текст запроса склейкой строк, только через УстановитьПараметр. Проверяйте длину и формат.
  6. Пароли не в коде. В конфигурациях на БСП для этого есть безопасное хранилище данных. Пароль в тексте модуля увидит каждый, кто откроет конфигурацию.
  7. Публикуйте только нужное. В публикации отмечайте конкретные сервисы. Тонкий клиент и OData без надобности не включайте.

Встроенная аутентификация 1С на веб-сервере работает по схеме Basic. Без HTTPS её перехват в общей сети — вопрос минут.

В свойствах веб-сервиса есть настройка повторного использования сеансов и время жизни сеанса. Если вызовы частые, повторное использование снижает накладные расходы на открытие сеанса на каждый запрос. Но код операции тогда не должен хранить данные одного вызова в переменных модуля сеанса — их увидит следующий вызов.

Ошибки WS-соединения и их решения

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

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

После изменения операций WSDL меняется. Клиент со статической WS-ссылкой продолжит работать по старому описанию и получит ошибку при первом же вызове изменённой операции. Обновите ссылку в Конфигураторе клиента.

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

Работает ли веб-сервис 1С в файловой базе?
Да. Публикация на Apache или IIS доступна и для файловой базы, и для клиент-серверной. При частых вызовах от нескольких клиентов файловая база быстрее упрётся в блокировки.
Можно ли передать через WS таблицу значений?
Не напрямую. Опишите структуру в пакете XDTO либо сериализуйте таблицу в XML или JSON и передайте строкой, а на приёмной стороне разберите обратно.
Нужна ли отдельная лицензия на веб-сервисы?
Отдельного вида лицензии нет. Вызов открывает сеанс в базе, поэтому учитывайте правила лицензирования вашей поставки и проверьте число сеансов в консоли кластера при нагрузочном тесте.
Как вызвать веб-сервис 1С из Python или PHP?
Любой SOAP-клиент читает WSDL опубликованной базы: в Python это, например, библиотека zeep, в PHP — встроенный класс SoapClient. Передайте логин и пароль пользователя 1С через Basic-аутентификацию.
Чем WS-ссылка лучше динамического WSОпределения?
WS-ссылка хранит описание в конфигурации, поэтому вызов не тратит время на загрузку WSDL. Динамический способ гибче: адрес можно хранить в настройках и менять без доработки конфигурации.