При построении распределенных систем и интеграции между базами 1С часто возникает задача оперативного переноса документов из одной базы в другую. Одним из самых быстрых и надежных способов является использование SOAP веб-сервисов в сочетании со стандартами XDTO. Рассмотрим подробно, как правильно настроить веб-сервис на стороне базы-приемника, сформировать и отправить пакет данных из базы-источника, а также разберем типовые ошибки, которых следует избегать.
Перед началом разработки проанализируем общую схему передачи данных через веб-сервис:
WSПрокси, формирует объект данных по схеме XDTO и вызывает метод сервиса.Рассмотрим классический способ интеграции, при котором структура передаваемых данных явно описывается в пакете XDTO в метаданных конфигурации.
Шаг 1. Настройка базы-приемника
В базе-приемнике создадим новый пакет XDTO (например, с пространством имен http://www.sample-package.org), в котором опишем тип объекта ЗаказПокупателя и его свойства (Номер, Дата, Контрагент, Сумма и т.д.).
Затем в дереве метаданных приемника создадим веб-сервис (например, SaveOrder) и укажем:
SaveOrder.1cwshttp://www.sample-package.orgСоздатьЗаказ.Параметр с типом XDTO, соответствующим созданному объекту ЗаказПокупателя.В модуле веб-сервиса базы-приемника опишем процедуру приема и создания документа:
Функция СоздатьЗаказ(Параметр)
// Параметр уже представляет собой объект XDTO с нужной структурой
XDTOЗаказ = Параметр;
// Создаем новый документ в базе-приемнике
Док = Документы.ЗаказПокупателя.СоздатьДокумент();
Док.Дата = XDTOЗаказ.Дата;
Док.Номер = XDTOЗаказ.Номер;
// Заполняем остальные реквизиты и табличные части
// ...
Попытка
Док.Записать(РежимЗаписиДокумента.Проведение);
Возврат Истина;
Исключение
ЗаписьЖурналаРегистрации("Ошибка веб-сервиса", УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
Возврат Ложь;
КонецПопытки;
КонецФункции
После этого веб-сервис необходимо опубликовать на веб-сервере (IIS или Apache).
Шаг 2. Вызов веб-сервиса из базы-источника
В базе-источнике формируем прокси-объект, заполняем структуру XDTO и отправляем данные на сервер-приемник:
URIПространстваИмен = "http://www.sample-package.org";
// Инициализируем подключение к WSDL-описанию веб-сервиса
ВСОпределение = Новый WSОпределения("http://127.0.0.1:1234/bhm/ws/SaveOrder.1cws?wsdl", "Логин", "Пароль");
ВСПрокси = Новый WSПрокси(ВСОпределение, URIПространстваИмен, "WebСервис1", "WebСервис1Soap");
ВСПрокси.Пользователь = "Логин";
ВСПрокси.Пароль = "Пароль";
// Создаем объект XDTO по схеме веб-сервиса
XDTOЗаказ = ВСОпределение.ФабрикаXDTO.Создать(ВСОпределение.ФабрикаXDTO.Тип(URIПространстваИмен, "ЗаказПокупателя"));
// Заполняем реквизиты из документа-источника
XDTOЗаказ.Дата = ВыбранныйЗаказ.Дата;
XDTOЗаказ.Номер = ВыбранныйЗаказ.Номер;
// Вызываем метод веб-сервиса
Ответ = ВСПрокси.СоздатьЗаказ(XDTOЗаказ);
Если Ответ = Истина Тогда
Сообщить("Документ успешно создан в удаленной базе");
Иначе
Сообщить("Ошибка при создании документа в приемнике");
КонецЕсли;
Если нет необходимости жестко регламентировать схему XDTO или требуется передать произвольную таблицу значений/структуру, разберем подход с универсальной сериализацией 1С.
Объект СериализаторXDTO позволяет переводить большинство встроенных типов 1С в XML-строку и обратно без вручную созданных пакетов XDTO.
Функции для сериализации в источнике:
Функция СериализоватьОбъект(Данные) Экспорт
ЗаписьXML = Новый ЗаписьXML();
ЗаписьXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Данные);
Возврат ЗаписьXML.Закрыть();
КонецФункции
Функции для десериализации в приемнике:
Функция ДесериализоватьОбъект(XMLСтрока) Экспорт
ЧтениеXML = Новый ЧтениеXML();
ЧтениеXML.УстановитьСтроку(XMLСтрока);
Результат = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
ЧтениеXML.Закрыть();
Возврат Результат;
КонецФункции
В этом случае в веб-сервисе достаточно описать входящий параметр как обычную строку (тип string), передавать сериализованную Таблицу Значений или Структуру, а на стороне приемника вызывать СериализаторXDTO.ПрочитатьXML() и обходить полученную таблицу для создания документа.
Проанализируем распространенные ошибки при реализации веб-сервисов в 1С и способы их устранения:
УникальныйИдентификатор (GUID) документа-источника. На стороне приемника поиск выполняется так:
Идентификатор = Новый УникальныйИдентификатор(СтрокаGUID);
СсылкаНаДок = Документы.ЗаказПокупателя.ПолучитьСсылку(Идентификатор);
// Далее проверяется, существует ли документ с этой ссылкой в базе
ПолучитьОбъект().Удалить() физически удаляет запись из базы данных и разрушает ссылочную целостность, если на документ ссылаются другие объекты. Вместо удаления рекомендуется либо обновлять существующий документ, либо устанавливать пометку удаления через УстановитьПометкуУдаления(Истина).Новый WSОпределения(...) с указанием URL к WSDL заставляет платформу при каждом вызове заново скачивать WSDL-схему по сети. Для высокой производительности рекомендуется добавить в метаданные базы-источника объект WS-ссылка. В этом случае схема кешируется, и обращение к веб-сервису происходит значительно быстрее.<Объект не найден>.