Как создать и настроить SOAP веб-сервис в 1С: подробное пошаговое руководство

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Интеграция информационных систем — одна из наиболее частых задач, с которыми сталкивается разработчик 1С. Классический сценарий, когда 1С сама выступает инициатором запросов к сайту через HTTP API, прост и понятен. Однако часто возникает обратная задача: сторонний ресурс (например, интернет-магазин, логистический портал или государственная система) сам отправляет запросы в 1С, используя строгий протокол SOAP. В этой ситуации нам необходимо развернуть полноценный SOAP-приемник на стороне 1С.

В этой статье мы подробно разберем, как спроектировать, реализовать, опубликовать и отладить SOAP веб-сервис в 1С. Мы пройдем весь путь от импорта сторонних XML-схем до практического тестирования готового решения.

Понятие SOAP и архитектура интеграции в 1С

Протокол SOAP базируется на строгой типизации данных и использовании формата XML. В отличие от REST/HTTP, где структура запроса может быть произвольной, в SOAP правила игры определяет специальный файл описания — WSDL (Web Services Description Language). Этот документ содержит полную информацию о доступных методах (операциях), входных и выходных параметрах, а также типах данных.

Для представления сложных типов данных в 1С используется объект метаданных XDTO-пакеты. Именно фабрика XDTO берет на себя рутинную работу по сериализации данных из объектов 1С в XML-формат и десериализации входящих XML-пакетов обратно в объекты платформы.

Проанализируем общую схему создания веб-сервиса в 1С:

  1. Получение требований к формату обмена (WSDL-файл или схемы XSD).
  2. Импорт этих требований в конфигурацию 1С для автоматического создания типов данных.
  3. Создание объекта конфигурации Web-сервисы, определение его операций и параметров.
  4. Написание программного кода обработки входящих данных.
  5. Публикация веб-сервиса на веб-сервере (IIS или Apache).
  6. Настройка прав доступа и авторизации запросов.
  7. Тестирование и отладка работы сервиса.

Рассмотрим подробнее каждый из этих шагов.

Шаг 1. Импорт сторонних требований через WSDL и XDTO

Часто интеграторы со стороны сайта предоставляют готовую схему данных (XSD) или описание самого сервиса (WSDL). Вручную переносить десятки XML-тегов в типы данных 1С — трудоемкий процесс, в котором легко ошибиться. Платформа 1С позволяет автоматизировать эту операцию.

Выясним, как импортировать описание веб-сервиса:

  1. Откроем Конфигуратор и перейдем в дерево метаданных.
  2. Найдем ветку Общие, а внутри нее — подсистему WS-ссылки.
  3. Нажмем правой кнопкой мыши и выберем пункт «Добавить».
  4. В открывшемся окне укажем путь к файлу WSDL (или URL-адрес, если схема опубликована в сети).

После этого платформа автоматически прочитает структуру данных и создаст соответствующую WS-ссылку. Внутри нее будут видны все типы данных. Чтобы использовать эти типы данных в собственном веб-сервисе, мы можем импортировать связанные XML-схемы в ветку XDTO-пакеты. Для этого достаточно открыть свойства созданной WS-ссылки, найти экспортируемые пакеты и импортировать их в основную конфигурацию.

Если интеграторы предоставили только XSD-файлы схем данных, мы переходим в ветку XDTO-пакеты, добавляем новый элемент и импортируем схему напрямую из файла. Теперь у нас есть готовые типы данных, которые понимает и внешняя система, и наша 1С.

Шаг 2. Создание веб-сервиса в конфигурации 1С

Перейдем непосредственно к созданию SOAP-приемника в 1С. Разберем по шагам, как настроить объект конфигурации Web-сервис:

  1. В дереве метаданных находим ветку Общие -> Web-сервисы и нажимаем «Добавить».
  2. Задаем имя сервиса (например, ExchangeWithWebsite).
  3. В поле Пространство имен указываем уникальный URI. Обычно здесь используют домен компании или проекта, например: http://www.mycompany.ru/integration/site.
  4. В поле Пакеты XDTO выберем импортированные на предыдущем шаге пакеты. Это свяжет наш сервис со схемами типов данных.
  5. Переходим на вкладку Операции и добавляем новую операцию (это метод, который будет вызывать внешний сайт, например, PostOrder).
  6. Для созданной операции определим Тип возвращаемого значения. Это может быть как простой тип (например, string из стандартного пространства имен XML), так и сложный тип из нашего пакета XDTO (например, объект-ответ с подтверждением получения).
  7. Добавим параметры операции. Для каждого параметра также обязательно указываем тип данных и направление передачи (обычно Входной).

Шаг 3. Написание программного кода обработки запроса

Теперь необходимо вдохнуть жизнь в созданный веб-сервис. Нажмем правой кнопкой мыши по объекту веб-сервиса в конфигураторе и выберем «Открыть модуль». Здесь создаются функции, которые будут выполняться в момент вызова операции внешним сайтом.

Посмотрим на пример реализации обработчика заказа, который принимает XML-данные от сайта, создает документ в 1С и возвращает структурированный ответ:


Функция PostOrder(OrderData) Экспорт
    
    // Переданные сайтом XML-данные автоматически десериализуются в объект XDTO
    // Проанализируем структуру полученного объекта OrderData
    Попытка
        
        // Открываем транзакцию для безопасности записи данных
        НачатьТранзакцию();
        
        // Создаем новый документ "Заказ клиента" в 1С
        НовыйЗаказ = Документы.ЗаказКлиента.СоздатьДокумент();
        НовыйЗаказ.Дата = ТекущаяДата();
        НовыйЗаказ.Комментарий = "Заказ загружен автоматически с сайта. Номер на сайте: " + OrderData.WebNumber;
        
        // Находим контрагента по ИНН, переданному с сайта
        КонтрагентСсылка = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", OrderData.Customer.INN);
        Если КонтрагентСсылка.Пустая() Тогда
            // Если контрагент не найден, создаем нового или вызываем исключение
            ВызватьИсключение "Контрагент с ИНН " + OrderData.Customer.INN + " не найден в базе 1С!";
        КонецЕсли;
        
        НовыйЗаказ.Контрагент = КонтрагентСсылка;
        
        // Заполняем табличную часть товары, обходя массив позиций заказа XDTO
        Для Каждого ТоварИзЗапроса Из OrderData.Items.Item Цикл
            НоваяСтрока = НовыйЗаказ.Товары.Добавить();
            
            // Поиск номенклатуры по артикулу
            НоменклатураСсылка = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", ТоварИзЗапроса.Article);
            Если НоменклатураСсылка.Пустая() Тогда
                ВызватьИсключение "Товар с артикулом " + ТоварИзЗапроса.Article + " не найден в 1С!";
            КонецЕсли;
            
            НоваяСтрока.Номенклатура = НоменклатураСсылка;
            НоваяСтрока.Количество = ТоварИзЗапроса.Quantity;
            НоваяСтрока.Цена = ТоварИзЗапроса.Price;
            НоваяСтрока.Сумма = ТоварИзЗапроса.Quantity * ТоварИзЗапроса.Price;
        КонецЦикла;
        
        // Записываем и проводим документ
        НовыйЗаказ.Записать(РежимЗаписиДокумента.Проведение);
        
        ЗафиксироватьТранзакцию();
        
        // Формируем успешный ответ в формате XDTO
        // Создаем объект ответа на основе фабрики XDTO и типа данных из импортированного пакета
        ТипОтвета = ФабрикаXDTO.Тип("http://www.mycompany.ru/integration/site", "OrderResponse");
        ОтветXDTO = ФабрикаXDTO.Создать(ТипОтвета);
        ОтветXDTO.Status = "Success";
        ОтветXDTO.OrderNumber1C = НовыйЗаказ.Номер;
        ОтветXDTO.ErrorMessage = "";
        
        Возврат ОтветXDTO;
        
    Исключение
        
        ОтменитьТранзакцию();
        
        // В случае ошибки формируем объект ответа с описанием проблемы
        ТипОтвета = ФабрикаXDTO.Тип("http://www.mycompany.ru/integration/site", "OrderResponse");
        ОтветXDTO = ФабрикаXDTO.Создать(ТипОтвета);
        ОтветXDTO.Status = "Error";
        ОтветXDTO.OrderNumber1C = "";
        ОтветXDTO.ErrorMessage = ОписаниеОшибки();
        
        Возврат ОтветXDTO;
        
    КонецПопытки;

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

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

Шаг 4. Публикация веб-сервиса на веб-сервере (IIS или Apache)

Написанный нами код пока существует только внутри базы данных 1С. Чтобы сторонний сайт смог достучаться до нашего метода, базу 1С и сам сервис необходимо опубликовать на веб-сервере. Обычно для этих целей используют Microsoft IIS или Apache HTTP Server.

Перед началом публикации убедимся, что на сервере, где крутится Apache или IIS, установлена платформа 1С той же разрядности и версии, что и основная рабочая база. При установке платформы обязательно должен быть выбран компонент «Модули расширения веб-сервера». Без него веб-сервер не сможет взаимодействовать с библиотеками 1С.

Разберем стандартный процесс публикации из Конфигуратора (запущенного от имени Администратора):

  1. Переходим в меню Администрирование -> Публикация на веб-сервере....
  2. Выбираем тип веб-сервера (например, Apache 2.4 или IIS) и указываем каталог на диске, где будут лежать конфигурационные файлы публикации (например, C:\inetpub\wwwroot\MyExchange).
  3. Задаем имя публикации в системе (например, MyExchange). По этому имени внешний сайт будет обращаться к нашей базе.
  4. Переходим на вкладку Web-сервисы.
  5. Устанавливаем галочку напротив нашего веб-сервиса ExchangeWithWebsite. Также рекомендуется убедиться, что активна галочка «Публиковать Web-сервисы по умолчанию».
  6. Нажимаем кнопку Опубликовать. Платформа предложит перезапустить веб-сервер — соглашаемся.

После этого платформа 1С создаст в указанном каталоге конфигурационный XML-файл default.vrd. Этот файл является связующим звеном между веб-сервером и нашей базой данных 1С. Проанализируем его структуру, так как нам часто придется править его вручную для тонкой настройки.


<?xml version="1.0" encoding="UTF-8"?>
<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
		xmlns:xs="http://www.w3.org/2001/XMLSchema"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		base="/MyExchange"
		ib="Srvr="1C-Server";Ref="TradeBase";">
	<ws enableAll="false">
		<point name="ExchangeWithWebsite"
				alias="ExchangeWithWebsite.1cws"
				enable="true"/>
	</ws>
</point>

В теге <point> в атрибуте ib прописана строка подключения к базе данных 1С, а внутри тега <ws> объявлен наш опубликованный веб-сервис. Любые изменения в составе публикуемых сервисов требуют обновления этого файла.

Шаг 5. Авторизация запросов: настройка безопасного доступа

По умолчанию платформа 1С требует обязательную авторизацию при любом обращении к базе через веб-сервер. Если сторонний сайт попытается отправить POST-запрос без авторизационных данных, веб-сервер вернет ошибку HTTP 401 (Unauthorized). Существует два основных способа решения этой проблемы.

Способ А. Передача учетных данных в заголовках запроса

Это самый правильный и безопасный вариант с точки зрения безопасности. Внешний сайт при отправке POST-запроса должен передавать стандартный HTTP-заголовок авторизации. Используется базовая авторизация (Basic Authentication):

Authorization: Basic [закодированная в Base64 строка вида Логин:Пароль пользователя 1С]

Для этих целей в 1С создается отдельный пользователь (например, site_integration) с минимально необходимыми правами для работы веб-сервиса (роль на использование этого веб-сервиса и на запись необходимых документов).

Способ Б. Анонимный доступ с жесткой привязкой пользователя в default.vrd

Если сторонний сайт не умеет передавать HTTP-заголовки авторизации (например, жестко зашит старый SOAP-клиент), мы можем настроить автоматический вход. Для этого мы отредактируем файл default.vrd, прописав пользователя и пароль прямо в строке подключения к информационной базе 1С:


ib="Srvr="1C-Server";Ref="TradeBase";usr="site_integration";pwd="SecretPass123";"

Важное предупреждение: При таком подходе любой внешний запрос к нашей публикации будет автоматически выполняться под этим пользователем 1С. Обязательно позаботьтесь о защите этого веб-ресурса на уровне веб-сервера (например, настройте фильтрацию по IP-адресам, чтобы запросы принимались исключительно с IP-адреса стороннего сайта).

Шаг 6. Настройка отладки веб-сервиса

Написать код в модуле веб-сервиса — это только половина дела. На этапе интеграции неизбежно будут возникать ошибки в логике программы. Настроить отладку для веб-сервисов сложнее, чем для обычного клиентского сеанса 1С. Разберем по шагам, как заставить отладчик останавливаться на точках останова в модуле веб-сервиса.

  1. Запуск сервера 1С в режиме отладки: Если ваша база работает в клиент-серверном варианте, сервер 1С должен быть запущен с ключом отладки. В реестре Windows в параметрах службы 1C:Enterprise 8.3 Server Agent в строке запуска должен присутствовать ключ -debug. После добавления ключа службу сервера необходимо перезапустить.
  2. Разрешение отладки в default.vrd: Нам необходимо явно сказать веб-серверу, что мы хотим отлаживать вызовы из него. Для этого откроем файл default.vrd текстовым редактором и добавим внутрь тега <point> следующую строчку: <debug enable="true" protocol="tcp" url="tcp://localhost"/> Если отладчик находится на другом компьютере (не там, где установлен веб-сервер), вместо localhost укажите IP-адрес компьютера разработчика, на котором запущен Конфигуратор.
  3. Настройка автоматического подключения в Конфигураторе: Откроем Конфигуратор, перейдем в меню Отладка -> Подключение.... В открывшемся окне нажмем кнопку Настройка автоматического подключения и установим галочку напротив пункта Web-сервисы.
  4. Перезапуск веб-сервера: Чтобы веб-сервер перечитал обновленный конфигурационный файл default.vrd, обязательно перезапустим службу Apache или IIS.

Теперь мы можем поставить точку останова на первой строчке нашей функции PostOrder в модуле веб-сервиса и ожидать внешнего вызова.

Шаг 7. Тестирование веб-сервиса до интеграции с сайтом

Разработчику не обязательно ждать, пока разработчики сайта настроят и запустят отправку POST-запросов со своей стороны. Мы можем протестировать всю цепочку самостоятельно.

Для начала убедимся, что наш сервис виден извне. Откроем обычный браузер и перейдем по адресу:

http://[адрес_вашего_сервера]/[имя_публикации]/ws/[имя_веб_сервиса]?wsdl

В нашем случае адрес будет выглядеть так: http://localhost/MyExchange/ws/ExchangeWithWebsite?wsdl. Если авторизация настроена верно и публикация прошла успешно, браузер отобразит XML-документ с описанием нашего веб-сервиса. Это означает, что точка входа активна.

Для симуляции POST-запросов от сайта и детального тестирования функционала рекомендуется использовать специализированные бесплатные утилиты тестирования API, такие как SoapUI или Postman.

Проанализируем процесс тестирования на примере программы SoapUI:

  1. Запустим SoapUI и выберем пункт Create New SOAP Project.
  2. В поле Initial WSDL вставим нашу ссылку на WSDL веб-сервиса (http://localhost/MyExchange/ws/ExchangeWithWebsite?wsdl).
  3. Программа автоматически проанализирует схему данных и сгенерирует дерево запросов для каждого метода.
  4. Откроем сгенерированный запрос для метода PostOrder. На экране появится готовый шаблон XML-пакета SOAP-запроса, в котором все параметры будут помечены вопросительными знаками.
  5. Заполним параметры тестовыми данными (например, укажем ИНН существующего контрагента в базе 1С и артикулы товаров).
  6. Если настроена базовая авторизация, в свойствах запроса в нижней левой части экрана SoapUI найдем вкладку Username / Password и введем логин и пароль пользователя 1С.
  7. Нажмем зеленую кнопку запуска (выполнить запрос).

В этот момент управление должно передаться в Конфигуратор 1С, и выполнение программы остановится на нашей точке останова. Мы сможем пошагово отследить, как считываются параметры, как создается документ и не возникает ли ошибок при записи. В левом окне SoapUI отобразится XML-ответ, возвращенный нашей функцией PostOrder.

Резюме и рекомендации

Развертывание SOAP веб-сервиса в 1С — это надежное и производительное решение для автоматизации двусторонней интеграции с внешними системами. Использование встроенных механизмов XDTO избавляет разработчика от необходимости вручную парсить XML-строки, гарантируя строгое соответствие переданных данных описанным схемам.

При промышленной эксплуатации созданных SOAP-сервисов всегда следуйте трем золотым правилам безопасности:

← На главную