Web сервис 1с вернуть xml
Обмен данными с конфигурацией через веб-сервисы
Внимание! Данный функционал доступен в "Библиотеке стандартных подсистем", начиная с версии 2.3.1.62.
Для обмена данными через формат EnterpriseData у конфигураций, использующих "Библиотеку стандартных подсистем", есть два веб-сервиса:
- EnterpriseDataUpload – упрощенный вариант для загрузки данных в информационную базу из сторонних приложений. Не требует специальных настроек на стороне конфигурации (кроме развертывания собственно веб-сервиса); однонаправленный обмен данными – ТОЛЬКО импорт данных в информационную базу.
- EnterpriseDataExchange – для двустороннего обмена данными между конфигурацией и сторонним приложением. Для работы с ним необходима настройка обмена данными на стороне конфигурации.
Собственно задача обмена данными включает в себя две подзадачи:
- Составление корректного XML-файла в формате EnterpriseData,
- Вызов веб-методов в правильной последовательности.
Особенности работы методов веб-сервисов
Большинство методов обоих веб-сервисов имеют выходной параметр – строку ErrorMessage. В случае если внутри конфигурации произошла ошибка, связанная с бизнес-логикой – в эту строку будет записана информация об этой ошибке. Если ошибок в процессе работы метода не было – в строку ErrorMessage будет помещена пустая строка. Если же в процессе работы метода возникла системная ошибка (например, на стороне конфигурации не удалось разархивировать полученный архив) – веб-метод сгенерирует исключение (exception).
Большинство методов обоих веб-сервисов возвращают строки, но в текущей версии возвращаемые строки всегда пустые (кроме EnterpriseDataUpload.PutDataActionResult – он возвращает статус обработки данных на стороне конфигурации – “Active”, “Completed” либо “Failed”).
Что нужно для работы
На стороне конфигурации
На стороне конфигурации должны быть развернуты веб-сервисы EnterpriseDataUpload и EnterpriseDataExchange соответствующих версий (в данном случае была использована версия 1.0.1.1). При открытии этих двух URL-адресов в браузере (нужно подставить правильное для вашей инсталляции «1С:Предприятия» имя веб-сервера и публикации):
должны выводиться WSDL-описания сервисов:
- В Solution Explorer в контекстном меню узла References выбрать команду Add Service Reference.
- В нижнем левом углу появившегося диалога нажать кнопку Advanced.
- В нижнем левом углу появившегося диалога нажать кнопку Add Web Reference.
Использовалась среда разработки Eclipse 4.4.2. Для генерации кода по WSDL файлов веб-сервисов применялась утилита wsdl2java из фреймворка Apache CXF 2.7.16.
Простой обмен данными с конфигурациями с помощью формата EnterpriseData
Объект может содержать в себе ссылки на другие объекты (например, документ «Акт выполненных работ» может содержать в себе одну или несколько ссылок на номенклатуру). В этом случае, если мы импортируем данные в информационную базу, все объекты, на которые мы ссылаемся из «родительского» объекта, должны либо уже существовать в системе, либо их описание должно содержаться в том же XML файле.
Если нам необходимо удалить какой-то объект, в коллекцию Body надо добавить элемент типа «УдалениеОбъекта», и в этом элементе сослаться на удаляемый объект (см. описание типа «УдалениеОбъекта» в схеме EnterpriseData_X_Y_Z.xsd).
С помощью формата EnterpriseData нам доступны операции создания, обновления и удаления объектов. На данный момент для корректной загрузки данных в типовые решения все объекты должны содержать заполненный элемент «Ссылка» из элемента «Ключевые свойства» (GUID в форме строки). Это первичный ключ объекта. Конфигурации ведут себя следующим образом:
- Если в системе нет объекта с ключом из поля «Ссылка» - создается новый объект.
- Если в системе уже есть объект с ключом из поля «Ссылка» - существующий объект обновляется новыми данными, пришедшими в XML.
- Если пришел элемент типа «УдалениеОбъекта» - объект с соответствующим ключом удаляется из системы.
Веб-сервис EnterpriseDataUpload
EnterpriseDataUpload – интерфейс исключительно для импорта данных в формате EnterpriseData в конфигурацию из сторонних приложений. Условия задачи: у нас есть XML файл с данными в формате EnterpriseData, надо передать его в конфигурацию и убедиться в том, что на стороне конфигурации данные успешно получены.
Алгоритм работы следующий:
Итак, у нас есть архив с данными в формате EnterpriseData (один или несколько файлов). Не будем описывать, как в программе создать архив и разбить его на несколько файлов, чтобы сэкономить время – желающие смогут легко найти примеры подобного кода, используя поисковые сервера и соответствующие запросы.
Реализуем функцию, которая принимает такие входные параметры:
- URL Веб-сервиса,
- Имя пользователя для соединения с Веб-сервисом,
- Пароль.
Путь до архивированного файла с данными. Если архив умещается в одном файле – это имя файла с полным путем, включая расширение (например, “C:\Exchange\data.zip”). Если же архив разбит на несколько частей, то это будет имя любого из файлов без расширения и точки (например, “C:\Exchange\data”). Предполагается, что это последовательность файлов с расширениями “.001”, “.002” и т.д.
Реализация функции (в виде статического метода) в листинге ниже. Диагностическая информация выводится в консоль.
Сейчас в конфигурации создан веб-сервис. В нем одна операция GetTable().
Обработчик операции возвращает "Строку". При обращении к веб - сервису по ссылки из браузера получается результат приведенный в скриншоте. В нем нет данных вообще.
Рез22 = "<?xml version=""1.0"" encoding=""UTF-8"" ?>";
Рез22 = Рез22 + Символы.ПС + """<dataroot xmlns:od=""urn:s chemas-microsoft-com:officedata"" generated=""2017-02-28T14:47:49"">""";
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Рез22 = Рез22 + Символы.ПС + "<PowerBI>";
//Период
НачалоСтрокиАтрибута = "<" + "Период" + ">";
ОкончаниеСтрокиАтрибута = "</" + "Период" + ">";
Значения = Формат(Выборка.Период,"ДФ=dd.MM.yyyy");
Рез22 = Рез22 + Символы.ПС + НачалоСтрокиАтрибута + Значения + ОкончаниеСтрокиАтрибута;
//Ответственный
НачалоСтрокиАтрибута = "<" + "Ответственный" + ">";
ОкончаниеСтрокиАтрибута = "</" + "Ответственный" + ">";
Значения = ?(ЗначениеЗаполнено(Выборка.Ответственный), СТРОКА(Выборка.Ответственный), "");
Рез22 = Рез22 + Символы.ПС + НачалоСтрокиАтрибута + Значения + ОкончаниеСтрокиАтрибута;
//Регион
НачалоСтрокиАтрибута = "<" + "Регион" + ">";
ОкончаниеСтрокиАтрибута = "</" + "Регион" + ">";
Значения = ?(ЗначениеЗаполнено(Выборка.Регион), СТРОКА(Выборка.Регион), "");
Рез22 = Рез22 + Символы.ПС + НачалоСтрокиАтрибута + Значения + ОкончаниеСтрокиАтрибута;
//НоменклатурнаяГруппа
НачалоСтрокиАтрибута = "<" + "НоменклатурнаяГруппа" + ">";
ОкончаниеСтрокиАтрибута = "</" + "НоменклатурнаяГруппа" + ">";
Значения = ?(ЗначениеЗаполнено(Выборка.НоменклатурнаяГруппа), СТРОКА(Выборка.НоменклатурнаяГруппа), "");
Рез22 = Рез22 + Символы.ПС + НачалоСтрокиАтрибута + Значения + ОкончаниеСтрокиАтрибута;
//Количество
НачалоСтрокиАтрибута = "<" + "Количество" + ">";
ОкончаниеСтрокиАтрибута = "</" + "Количество" + ">";
Значения = Выборка.Количество;
Рез22 = Рез22 + Символы.ПС + НачалоСтрокиАтрибута + Значения + ОкончаниеСтрокиАтрибута;
//Выручка
НачалоСтрокиАтрибута = "<" + "Выручка" + ">";
ОкончаниеСтрокиАтрибута = "</" + "Выручка" + ">";
Значения = Выборка.СуммаВыручки;
Рез22 = Рез22 + Символы.ПС + НачалоСтрокиАтрибута + Значения + ОкончаниеСтрокиАтрибута;
//Прибыль
НачалоСтрокиАтрибута = "<" + "Прибыль" + ">";
ОкончаниеСтрокиАтрибута = "</" + "Прибыль" + ">";
Значения = Выборка.Прибыль;
Рез22 = Рез22 + Символы.ПС + НачалоСтрокиАтрибута + Значения + ОкончаниеСтрокиАтрибута;
Целью статьи является рассказать о том, как организовать передачу через web-сервис XML -данных в формате универсального обмена данными в информационную базу на платформе 1С:Предприятие 8.1 и старше. А также как получить из базы xml- данные. Cтатья может быть полезна для знакомства с web -сервисами. Если уже знакомы с ними, то, думаю, можете почерпнуть для себя новые полезные приемы.
Универсальный обмен данными XML, он же "1С:Конвертация данных" – это технология обмена данными между различными конфигурациями на платформе 1С.
С помощью этой технологии организованы все "типовые" обмены (УТ Бухгалтерия, УТ Розница, ЗУП Бухгалтерия и т.д.). А также можно организовать свои собственные сценарии обмена с нуля между любыми конфигурациями на платформах 1С (начиная с 7.7). Обучение технологии «1С:Конвертации данных» не является целью данной статьи. Подразумевается, что вы с ней знакомы или познакомитесь из других источников, их предостаточно. Могу порекомендовать материалы на диске ИТС. Или, может быть, вам вообще не нужно с ней знакомиться, а просто автоматизировать саму передачу данных.
Попутно попробую рассказать немного теории. Чтобы «подружить» с web -сервисами тех, кто мало с ними знаком.
Технология «Конвертации данных» предлагает два способа передачи данных: через файлы – в одной базе выгрузили, в другой загрузили, либо через COM -соединение. Оба способа имеют свои недостатки. Для меня, я бы сказал, фатальные. А если серьезно, просто таят в себе существенные неудобства. Расписывать недостатки и убеждать не буду – это отдельная тема. Коротко перечислю достоинства web- сервисов, важные для меня:
- Возможность организовать онлайн-обмен;
- Возможность организовать удаленный онлайн-обмен, т.е. через Интернет;
- База-приемник и база-источник могут работать на разных релизах и даже версиях платформы ( COM -соединение в таких ситуациях использовать проблематично, почти невозможно);
- Очень быстрая установка соединения и очень быстрая передача данных. Правда, «холодный» запуск по времени сравним с COM -соединением.
- Удобно для разработчика, возможность использовать одну и ту же технологию трансфера данных как для обменов 1С 1 C , так и для обменов 1С Другие системы.
Вообще, я «фанат» web -сервисов. Мог бы ещё много рассказать об их отладке, обмене с «чужеродными» средами, в том числе такими проблемными, как PHP (в виду вольного обращения данной платформы со стандартами SOA ). Но это темы для отдельных статей.
Инфраструктура
Вопросы установка и настройка web -сервера, публикации web -сервисов не рассматриваются в данной статье. Подразумевается, что это вы делать умеете или готовы разобраться, или у вас просто есть готовая инфраструктура. Могу порекомендовать документацию к 1С:Предприятию и «погуглить» в Интернете (именно «и», а не «или»).
Реализация. Серверная сторона.
Сервер – это для нас информационная база, которая принимает и отдает данные. Всё делаем на платформе 1С:Предприятие 8.2 (прикладное решение не важно).
Web- сервис
Добавляем web -сервис. Назовем «ОбменДаннымиXML». Свойства следующие:
URI пространства имен в данном случае совершенно не важен, можно указать любую строку. Их принято строить на базе URL , которые использует ваша организация, чтобы гарантировать глобальную уникальность имен типов, описанных в ваших пакетах, на всякий случай. Но мы описывать свои типы (это делается при помощи пакетов XDTO в соответствующей ветке дерева конфигурации) не будем, так как нам достаточно встроенных типов 1 C :Предприятия.
Имя файла публикации может быть любым, но с соблюдением требований к URL . Кириллицу лучше не использовать. Расширение «1 cws » тоже лучше не менять (не пробовал, если честно).
Операции
Добавляем операции web -сервиса. Наш web -сервис должен уметь как принимать данные, записывая в свою ИБ, так и отдавать их (выгружать в XML ). Поэтому добавляем две операции, "ПринятьДанные" и "ОтдатьДанные".
Операция ПринятьДанные
Понятно, что ValueStorage – это ХранилищеЗначения
Функция ПринятьДанные ( Данные , ТекстОшибки )
"ОтдатьДанные" возвращает xml-данные, выгруженные по переданным правилам обмена. Также в виде ХранилищаЗначения.
Это тоже обертка над Универсальным обменом, только уже более функциональная. Обратите внимание , что Массив и Структура – это уже не простые типы, они попадают в метод в виде XDTO -объектов, и их нужно явно преобразовывать в/из типы 1С:Предприятия. Преобразовывать в/из XDTO нужно и на клиентской стороне.
ПравилаВыгрузки - это массив имен правил выгрузки, по которым следует произвести выборку данных.
ЗначенияПараметров – это структура со значениями параметров конвертации.
Обработка УниверсальныйОбменДаннымиXML
Если в вашем прикладном решении такая обработка отсутствует, то её нужно добавить из комплекта поставки конфигурации «Конвертация данных» (файл V8Exchan82.epf ).
Доступ к web -сервису. Роли и пользователи.
Для обращения к веб-сервисам необходимо подготовить роль и пользователя. Самый простой путь – это добавить отдельную роль, назовем ВебСервисы, этой роли не даем никаких прав, кроме прав на операции веб-сервиса, а сами методы выполняем в привилегированном режиме.
Добавляем пользователя
Назначаем ему только нашу роль ВебСервисы и больше никаких других. Этого достаточно.
На серверной стороне настройка закончена.
Клиент (обращение к web-сервису)
Тут просто приведу примеры обращения к веб-сервисам. Откуда берутся правила обмена , правила выгрузки, значения параметров и т.п. – это уже вопрос вашей прикладной задачи и её реализации.
Передача данных в базу-приемник
Пример передачи xml-данных в базу-приемник, на стороне которой работает вышеописанный web-сервис:
Использование объектов XDTO в web-сервисах
Механизм XDTO представляет собой гибкое средство моделирования данных, которое широко используется в технологии web-сервисов 1С:Предприятия. В этой статье мы рассмотрим, как с использованием XDTO можно задавать различные типы данных и как их применять в web-сервисах.
Центральным понятием механизма XDTO является понятие объекта переноса данных . Объект переноса данных можно представить как одиночный объект или замкнутый граф объектов, который может быть перенесен с одного компьютера на другой. Объект переноса данных характеризуется двумя основными свойствами: возможностью сериализации/десериализации в формат передачи данных (как правило, в XML) и свойством замкнутости.
Способность сериализоваться/десериализоваться в формат переноса данных позволяет объекту переноса данных мигрировать с одного компьютера на другой. Между разными компьютерами и даже разными процессами одного компьютера нет единого адресного пространства и нет возможности передавать объект по ссылке. Поэтому сериализация является единственным способом взаимодействия между этими процессами. Сериализация позволяет представить объект в некоторой промежуточной форме, например в виде xml, передать эту промежуточную форму заданному процессу заданного компьютера и обратно десериализовать объект в вид, пригодный для программного использования.
Свойство замкнутости позволяет объекту переноса данных обеспечить необходимый уровень целостности, т.к. если бы какая-либо его часть ссылалась на другие объекты, то после переноса и десериализации эта ссылка стала бы недействительной, из чего следовало бы, что и сам объект переноса данных был бы непригоден для дальнейшего использования. Свойство замкнутости не запрещает иметь ссылки внутри объекта переноса данных, т.к. объект сериализуется/десериализуется как единой целое и механизм сериализации обеспечивает правильное преобразование ссылок внутри объекта переноса данных.
Механизм XDTO позволяет определять объекты переноса данных, которые могут образовывать строгую иерархию и могут сериализоваться в XML. Эти свойства позволили использовать объекты XDTO в качестве параметров и возвращаемых значений операций web-сервисов.
Все типы данных XDTO подразделяются на типы-значения и типы-объекты. Типы-значения позволяют определять простые типы, например, строки, числа, даты, булевы значения и т.д. Типы-объекты позволяют определять сложные типы, такие как структуры и массивы. Рассмотрим более подробно, как задавать с помощью XDTO некоторые характерные типы.
Строки
Строки моделируются типами-значениями. Строковый тип имеет имя: string . В фигурных скобках здесь задается пространство имен типа. В XDTO как и в XML схеме, на которой он основан, все типы имеют пространство имен и локальное имя.
Для создания строкового значения нужно:
Строка при передаче представляется в виде текста xml тега:
Следует учесть, что строки конвертируются в UTF-8 при сериализации.
Целые числа
Целые числа моделируются типами-значениями. Целочисленный тип имеет имя: int .
Для создания целочисленного значения нужно:
Число при передаче представляется в виде текста xml тега:
Дробные числа
Дробные числа моделируются типами-значениями. Дробный тип с фиксированной точкой имеет имя: decimal , дробный тип с плавающей точкой имеет имя: float , дробный тип с плавающей точкой двойной точности имеет имя: double .
Для создания дробного значения нужно:
Число при передаче представляется в виде текста xml тега:
Даты моделируются типами-значениями. Тип даты без времени имеет имя: date , тип времени без даты имеет имя: time , тип даты и времени имеет имя: dateTime .
Для создания значения даты нужно:
Число при передаче представляется в виде текста xml тега:
Лексическое представление даты задается в формате:
Временная зона может быть не указана.
Лексическое представление времени задается в формате:
Временная зона может быть не указана.
Лексическое представление даты вместе со временем задается в формате:
Дата от времени разделяется символом T . Временная зона может быть не указана.
Структуры
Структуры моделируются типами-объектами. Перед тем как использовать структуру необходимо создать пакет XDTO, описываающий тип-объект структуры (например, через редактор XDTO). Тип-объект может содержать свойства, котрые соответствуют элементам структуры. Каждое свойство характеризуется уникальным именем и типом. Тип свойства может быть как типом-значением, так и типом-объектом.
Например, для создания структуры Номенклатура из демо-конфигурации Web-Сервисы нужно:
Структура при передаче представляется в виде xml структуры:
Массивы
Массивы моделируются свойствами типов-объектов. Тип массива нельзя создать напрямую, но на определенном свойстве типа-объекта можно указать минимальное количество и максимальное количество элементов массива. Если оба значения равны 1 , то это единичное свойство, если максимальное количество больше 1 , то - множественное свойство. Свойства-массивы реализованы в XDTO через СписокXDTO.
Например, для создания массива номенклатур, определенного в свойстве Элементы структуры НоменклатураГруппа из демо-конфигурации Web-Сервисы нужно:
Массив при передаче представлятся в виде xml структуры:
Рассмотрим, как создавать типы и элементы в случае клиента web-сервиса и в случае сервера web-сервиса.
Каждый клиентский прокси (клиентская часть web-сервиса - объект WSПрокси ) содержит ссылку на фабрику XDTO, которая может использоваться для создания объектов и значений XDTO для передачи в качестве параметров и возвращаемых значений операций web-сервисов. Заметим, что глобальная XDTO фабрика (получаемая через свойство глобального контекста ФабрикаXDTO) не может быть использована для создания объектов и значений для передачи через прокси, даже если она содержит типы с такой же структурой и именами. Эти типы все равно будут считаться несовместимыми с типами данных web-сервиса.
Каждая реализация веб-сервиса (серверная часть web-сервиса) может использовать глобальную XDTO фабрику (получаемую через свойство глобального контекста ФабрикаXDTO) для создания объектов и значений web-сервиса.
Читайте также: