Интеграция информационных систем — одна из наиболее частых задач, с которыми сталкивается разработчик 1С. Классический сценарий, когда 1С сама выступает инициатором запросов к сайту через HTTP API, прост и понятен. Однако часто возникает обратная задача: сторонний ресурс (например, интернет-магазин, логистический портал или государственная система) сам отправляет запросы в 1С, используя строгий протокол SOAP. В этой ситуации нам необходимо развернуть полноценный SOAP-приемник на стороне 1С.
В этой статье мы подробно разберем, как спроектировать, реализовать, опубликовать и отладить SOAP веб-сервис в 1С. Мы пройдем весь путь от импорта сторонних XML-схем до практического тестирования готового решения.
Протокол SOAP базируется на строгой типизации данных и использовании формата XML. В отличие от REST/HTTP, где структура запроса может быть произвольной, в SOAP правила игры определяет специальный файл описания — WSDL (Web Services Description Language). Этот документ содержит полную информацию о доступных методах (операциях), входных и выходных параметрах, а также типах данных.
Для представления сложных типов данных в 1С используется объект метаданных XDTO-пакеты. Именно фабрика XDTO берет на себя рутинную работу по сериализации данных из объектов 1С в XML-формат и десериализации входящих XML-пакетов обратно в объекты платформы.
Проанализируем общую схему создания веб-сервиса в 1С:
Web-сервисы, определение его операций и параметров.Рассмотрим подробнее каждый из этих шагов.
Часто интеграторы со стороны сайта предоставляют готовую схему данных (XSD) или описание самого сервиса (WSDL). Вручную переносить десятки XML-тегов в типы данных 1С — трудоемкий процесс, в котором легко ошибиться. Платформа 1С позволяет автоматизировать эту операцию.
Выясним, как импортировать описание веб-сервиса:
Общие, а внутри нее — подсистему WS-ссылки.После этого платформа автоматически прочитает структуру данных и создаст соответствующую WS-ссылку. Внутри нее будут видны все типы данных. Чтобы использовать эти типы данных в собственном веб-сервисе, мы можем импортировать связанные XML-схемы в ветку XDTO-пакеты. Для этого достаточно открыть свойства созданной WS-ссылки, найти экспортируемые пакеты и импортировать их в основную конфигурацию.
Если интеграторы предоставили только XSD-файлы схем данных, мы переходим в ветку XDTO-пакеты, добавляем новый элемент и импортируем схему напрямую из файла. Теперь у нас есть готовые типы данных, которые понимает и внешняя система, и наша 1С.
Перейдем непосредственно к созданию SOAP-приемника в 1С. Разберем по шагам, как настроить объект конфигурации Web-сервис:
Общие -> Web-сервисы и нажимаем «Добавить».ExchangeWithWebsite).http://www.mycompany.ru/integration/site.PostOrder).string из стандартного пространства имен XML), так и сложный тип из нашего пакета XDTO (например, объект-ответ с подтверждением получения).Входной).Теперь необходимо вдохнуть жизнь в созданный веб-сервис. Нажмем правой кнопкой мыши по объекту веб-сервиса в конфигураторе и выберем «Открыть модуль». Здесь создаются функции, которые будут выполняться в момент вызова операции внешним сайтом.
Посмотрим на пример реализации обработчика заказа, который принимает 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С под управлением специального сеанса. В нем недоступны никакие интерактивные функции (предупреждения, диалоги, открытие форм). Любая попытка вызвать клиентский метод приведет к аварийному завершению работы сервиса.
Написанный нами код пока существует только внутри базы данных 1С. Чтобы сторонний сайт смог достучаться до нашего метода, базу 1С и сам сервис необходимо опубликовать на веб-сервере. Обычно для этих целей используют Microsoft IIS или Apache HTTP Server.
Перед началом публикации убедимся, что на сервере, где крутится Apache или IIS, установлена платформа 1С той же разрядности и версии, что и основная рабочая база. При установке платформы обязательно должен быть выбран компонент «Модули расширения веб-сервера». Без него веб-сервер не сможет взаимодействовать с библиотеками 1С.
Разберем стандартный процесс публикации из Конфигуратора (запущенного от имени Администратора):
C:\inetpub\wwwroot\MyExchange).MyExchange). По этому имени внешний сайт будет обращаться к нашей базе.ExchangeWithWebsite. Также рекомендуется убедиться, что активна галочка «Публиковать Web-сервисы по умолчанию».После этого платформа 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> объявлен наш опубликованный веб-сервис. Любые изменения в составе публикуемых сервисов требуют обновления этого файла.
По умолчанию платформа 1С требует обязательную авторизацию при любом обращении к базе через веб-сервер. Если сторонний сайт попытается отправить POST-запрос без авторизационных данных, веб-сервер вернет ошибку HTTP 401 (Unauthorized). Существует два основных способа решения этой проблемы.
Это самый правильный и безопасный вариант с точки зрения безопасности. Внешний сайт при отправке POST-запроса должен передавать стандартный HTTP-заголовок авторизации. Используется базовая авторизация (Basic Authentication):
Authorization: Basic [закодированная в Base64 строка вида Логин:Пароль пользователя 1С]
Для этих целей в 1С создается отдельный пользователь (например, site_integration) с минимально необходимыми правами для работы веб-сервиса (роль на использование этого веб-сервиса и на запись необходимых документов).
Если сторонний сайт не умеет передавать HTTP-заголовки авторизации (например, жестко зашит старый SOAP-клиент), мы можем настроить автоматический вход. Для этого мы отредактируем файл default.vrd, прописав пользователя и пароль прямо в строке подключения к информационной базе 1С:
ib="Srvr="1C-Server";Ref="TradeBase";usr="site_integration";pwd="SecretPass123";"
Важное предупреждение: При таком подходе любой внешний запрос к нашей публикации будет автоматически выполняться под этим пользователем 1С. Обязательно позаботьтесь о защите этого веб-ресурса на уровне веб-сервера (например, настройте фильтрацию по IP-адресам, чтобы запросы принимались исключительно с IP-адреса стороннего сайта).
Написать код в модуле веб-сервиса — это только половина дела. На этапе интеграции неизбежно будут возникать ошибки в логике программы. Настроить отладку для веб-сервисов сложнее, чем для обычного клиентского сеанса 1С. Разберем по шагам, как заставить отладчик останавливаться на точках останова в модуле веб-сервиса.
1C:Enterprise 8.3 Server Agent в строке запуска должен присутствовать ключ -debug. После добавления ключа службу сервера необходимо перезапустить.default.vrd текстовым редактором и добавим внутрь тега <point> следующую строчку:
<debug enable="true" protocol="tcp" url="tcp://localhost"/>
Если отладчик находится на другом компьютере (не там, где установлен веб-сервер), вместо localhost укажите IP-адрес компьютера разработчика, на котором запущен Конфигуратор.
default.vrd, обязательно перезапустим службу Apache или IIS.Теперь мы можем поставить точку останова на первой строчке нашей функции PostOrder в модуле веб-сервиса и ожидать внешнего вызова.
Разработчику не обязательно ждать, пока разработчики сайта настроят и запустят отправку POST-запросов со своей стороны. Мы можем протестировать всю цепочку самостоятельно.
Для начала убедимся, что наш сервис виден извне. Откроем обычный браузер и перейдем по адресу:
http://[адрес_вашего_сервера]/[имя_публикации]/ws/[имя_веб_сервиса]?wsdl
В нашем случае адрес будет выглядеть так: http://localhost/MyExchange/ws/ExchangeWithWebsite?wsdl. Если авторизация настроена верно и публикация прошла успешно, браузер отобразит XML-документ с описанием нашего веб-сервиса. Это означает, что точка входа активна.
Для симуляции POST-запросов от сайта и детального тестирования функционала рекомендуется использовать специализированные бесплатные утилиты тестирования API, такие как SoapUI или Postman.
Проанализируем процесс тестирования на примере программы SoapUI:
http://localhost/MyExchange/ws/ExchangeWithWebsite?wsdl).PostOrder. На экране появится готовый шаблон XML-пакета SOAP-запроса, в котором все параметры будут помечены вопросительными знаками.В этот момент управление должно передаться в Конфигуратор 1С, и выполнение программы остановится на нашей точке останова. Мы сможем пошагово отследить, как считываются параметры, как создается документ и не возникает ли ошибок при записи. В левом окне SoapUI отобразится XML-ответ, возвращенный нашей функцией PostOrder.
Развертывание SOAP веб-сервиса в 1С — это надежное и производительное решение для автоматизации двусторонней интеграции с внешними системами. Использование встроенных механизмов XDTO избавляет разработчика от необходимости вручную парсить XML-строки, гарантируя строгое соответствие переданных данных описанным схемам.
При промышленной эксплуатации созданных SOAP-сервисов всегда следуйте трем золотым правилам безопасности: