Как перенести документ Заказ покупателя в другую базу 1С с помощью веб-сервиса и XDTO?

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

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

Архитектура взаимодействия между базами 1С

Перед началом разработки проанализируем общую схему передачи данных через веб-сервис:

  1. База-приемник публикует веб-сервис со своими операциями (методами) и определяет описание структуры данных (пакет XDTO).
  2. База-источник подключается к веб-сервису через объект WSПрокси, формирует объект данных по схеме XDTO и вызывает метод сервиса.
  3. База-приемник принимает входящий XDTO-объект, обрабатывает его, заполняет реквизиты документа и сохраняет (проводит) его в базе данных.

Вариант 1. Передача данных с использованием собственного пакета XDTO

Рассмотрим классический способ интеграции, при котором структура передаваемых данных явно описывается в пакете XDTO в метаданных конфигурации.

Шаг 1. Настройка базы-приемника

В базе-приемнике создадим новый пакет XDTO (например, с пространством имен http://www.sample-package.org), в котором опишем тип объекта ЗаказПокупателя и его свойства (Номер, Дата, Контрагент, Сумма и т.д.).

Затем в дереве метаданных приемника создадим веб-сервис (например, SaveOrder) и укажем:

В модуле веб-сервиса базы-приемника опишем процедуру приема и создания документа:


Функция СоздатьЗаказ(Параметр)
    
    // Параметр уже представляет собой объект 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Заказ);

Если Ответ = Истина Тогда
    Сообщить("Документ успешно создан в удаленной базе");
Иначе
    Сообщить("Ошибка при создании документа в приемнике");
КонецЕсли;

Вариант 2. Использование Сериализатора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С и способы их устранения:

  1. Поиск существующих документов по GUID, а не по Номеру: Поиск документа по номеру и дате ненадежен, так как при изменении нумерации или периода номера могут дублироваться. Правильный подход — передавать УникальныйИдентификатор (GUID) документа-источника. На стороне приемника поиск выполняется так:
    
    Идентификатор = Новый УникальныйИдентификатор(СтрокаGUID);
    СсылкаНаДок = Документы.ЗаказПокупателя.ПолучитьСсылку(Идентификатор);
    // Далее проверяется, существует ли документ с этой ссылкой в базе
    
  2. Избавление от прямого удаления объектов: Использование вызова ПолучитьОбъект().Удалить() физически удаляет запись из базы данных и разрушает ссылочную целостность, если на документ ссылаются другие объекты. Вместо удаления рекомендуется либо обновлять существующий документ, либо устанавливать пометку удаления через УстановитьПометкуУдаления(Истина).
  3. Оптимизация сетевых вызовов (WS-ссылки): Конструкция Новый WSОпределения(...) с указанием URL к WSDL заставляет платформу при каждом вызове заново скачивать WSDL-схему по сети. Для высокой производительности рекомендуется добавить в метаданные базы-источника объект WS-ссылка. В этом случае схема кешируется, и обращение к веб-сервису происходит значительно быстрее.
  4. Сопоставление нормативно-справочной информации (НСИ): При передачи ссылочных реквизитов (Номенклатура, Контрагенты, Склады) не забывайте передавать сопоставительные данные (ИНН/КПП для контрагентов, Артикулы/Коды для товаров). Иначе на стороне приемника в созданном документе появятся незаполненные поля или значения <Объект не найден>.
← На главную