Обмен 1С c клиентом на C# используя веб-сервисы 1С

от автора

Для моего предыдущего проекта было необходимо использование веб-сервисов 1С, мы строили систему автоматизации склада, и терминалы сбора данных напрямую подключаются к 1С, сами клиенты разработаны на .NET. Получилась очень интересная структура. Полученную информацию о настройках 1С в режиме работы веб-сервиса а так же написание простенькой конфигурации и клиента на C# в виде totorial лабораторной работы, которую затем успешно презентовал в институте.

Лабораторная работа получила немного замысловатое название (ну что поделаешь, факультет запрещает инженерные исследования, только научные…):

Организация обмена информацией между клиент-серверным разноплатформенным решением, используя Web-Сервисы в примере источника, разработанного на платформе 1С: Предприятие 8.2 и клиента на платформе .NET 4.0 языке C#

Всем, кто заинтересовался, прошу под кат.

Цель работы

Освоить технологию построения веб-сервисов, формирование WSDL описания веб-сервиса. Изучить принципы сериализации объектов в XML схемы для возможности передачи через Web-Сервисы.

Оборудование и программное обеспечение

  1. Microsoft Windows 7 x64
  2. Платформа 1С: Предприятие 8.2
  3. Internet Information Server
  4. Visual Studio 10 Ultimate

Теоретическое введение

Все чаще и чаще встречаются обмены, используя технологию Web-Сервисов. Это удобно, т.к для хостовой базы данных достаточно установить расширение Web-Сервиса и обработчик данных, а для клинтского решения подключиться к Web-Сервису. Технология является мультиплатформенной и на данный момент ее использование весьма актуально.

Примерами таких веб-сервисов можно назвать:

  1. http://www.cbr.ru/scripts/Root.asp?Prtid=DWS веб-сервис Центробанка, для получения ежедневных данных.
  2. http://api.yandex.ru/speller/doc/dg/concepts/api-overview.xml веб-сервис Яндекса проверки правописания.
  3. https://www.flightstats.com/developers/bin/view/Web+Services/WSDL ряд веб сервисов авиастатистики, для мониторинга полетов, сведений о погоде, и.т.п.

WSDL (Web Services Description Language) — язык описания веб-сервисов и доступа к ним, основанный на языке XML. (спецификация http://www.w3.org/TR/wsdl).

SOAP (Simple Object Access Protocol — простой протокол доступа к объектам) — протокол обмена структурированными сообщениями в распределенной вычислительной среде. SOAP используется для обмена произвольными сообщениями в формате XML и удалённого вызова процедур (RPC). (спецификация http://www.w3.org/TR/soap/).

XDTO (XML Data Transfer Objects) — механизм объектного моделирования данных, описываемых с помощью схемы XML (подробнее http://v8.1c.ru/overview/xdto.htm).

Большинство примитивных типов сериализованных объектов разработана компание W3 и их описание находится в пространстве имен «http://www.w3.org/2001/XMLSchema».

Рабочее задание

Задание 1: Установка платформы 1С: Предприятие, установка компоненты IIS сервера, связь Web-Расширения 1С с сервером IIS.

При установке платформы 1С: Предприятие необходимо установить Web-Расширение.


Рис. 1. Выбранные компоненты в момент установки 1С

В меню «Панель управления\Все элементы панели управления\Программы и компоненты» Необходимо выполнить установку дополнительных компонентов Windows «Включение или отключение компонентов Windows» где указать все компоненты IIS (за исключением FTP, для текущей работы он не требуется). После установки рекомендуется перезапустить операционную систему.


Рис. 2. Выбранные компоненты в момент установки IIS

В меню «Панель управления\Все элементы панели управления\Администрирование» запустить консоль «Диспетчер служб IIS», где открыть элемент «Пулы приложений» открыть пул «DefaultAppPool» в контекстном меню выбрать «Дополнительные параметры…» где элемент «Разрешены 32-рязрядные приложения» надо установить «True». Это необходимо для работы Web-Расширения 1С, т.к. оно является 32-битным прилодением.

В той же консоли «Диспетчер служб IIS», выбрать элемент «Default Web Site», выбрать действие «Проверка подлинности» где необходимо включить варианты: «Анонимная проверка подлинности», «Обычная проверка подлинности», «Проверка подлинности Windows».

Теперь возможна публикация Web-Сервисов 1С на сервере IIS. Но для того, чтобы было возможно выполнить эту публикацию, необходимо запустить Конфигуратор 1С: Предприятия от имени пользователя «Администратор».

Задание 2: Создание простой конфигурации 1С.

Считаем, что в базе данных есть информация информации обо всех заказах, содержащая количество и тип номенклатуры, который был заказан, в одном заказе может быть список, содержащий номенклатуру и количество, заказ так же имеет свой номер и дату его создания. Информацию обо всех заказах надо передать через Web-Сервис.
Для описания этого необходимо создать объекты базы данных:


Рис. 3. Структура данных в созданной конфигурации 1С

Справочник «Номенклатура», без дополнительных реквизитов. В реквизитах «по умолчанию» содержится информацию о наименовании и коде номенклатуры.

Документ «Заказ покупателя», который будет содержать табличную часть «Товары», каждая строка которой будет иметь информацию о номенклатуры (элемент типа «СправочникСсылка.Номенклатура») и количестве (элемент «Количество» типа «Число» беззнаковое с 15 знаками до запятой и 3 после).

Далее можно запустить 1С в режиме предприятия и создать несколько документов, заполненных созданными нами же номенклатурами и соответствующим количеством.

Задание 3: Создание и публикация Веб-Сервиса 1С.

В группировке «Общие» конфигурации создать новый элемент типа «XDTO-пакеты», первоначально для передачи номенклатуры. Его можно назвать, например «NomenclatureXDTO». URL пространство имен, в соответствии со спецификацией WSDL необходимо назначить в виде URL адреса спецификации данного пакета, например
«company.com/1C/Nomenclature». В этом пакете необходимо создать тип объекта, например «Nomenclature», в котором есть реквизиты «Code» и «Name», с соответствующим типом «string (http://www.w3.org/2001/XMLSchema)».
Теперь надо создать второй XDTO пакет, который будет содержать информацию о заказах покупателей, его можно назвать «ClientOrderXDTO» в пространсте имен «company.com/1C/ClientOrder». В первую очередь необходимо подключить директиву импорта «company.com/1C/Nomenclature», для того, чтобы можно было использовать созданный нами пакет сериализации номенклатуры. Это необходимо для передачи номенклатуры, содержащейся в табличной части документа «Заказы покупателей».

Теперь надо создать тип объекта «ClientOrderRow», содержащий одну строку табличной части. Этот тип будет состоять из совокупности реквизитов «Nomenclature» и «Count», соответственно для номенклатуры необходимо указать тип объекта «Nomenclature (http://company.com/1C/Nomenclature)», а для количества, «double (http://www.w3.org/2001/XMLSchema)».
Тип объекта, содержащий сам заказ можно назвать «ClientOrder» должен содержать номер заказа, дату создания и массив элементов из табличной части заказа. «Number» типа строка, «Date» типа «dateTime (http://www.w3.org/2001/XMLSchema)» и «Products» типа «ClientOrderRow (http://company.com/1C/ClientOrder)», при этом необходимо указать, что минимальное количество «0», а максимальное количество «-1», это говорит о том, что этот объект будет массивом.

Но, поскольку необходимо возвращить список заказов, то необходимо создать тип объекта, содержащий этот массив, потому надо создать еще один элемент, называемый «ArrayOfClientOrders», у которого будет всего один реквизит, называемый «ClientOrder» типа «ClientOrder (http://company.com/1C/ClientOrder)».


Рис 4. Структуры XDTO пакетов в 1С

На этом создание описания передаваемых значений можно считать оконченным. Необходимо описать сам веб сервис и его методы.
В группировке «Общие» конфигурации надо создать объект, Web-Сервиса. Его можно назвать «Service». Во вкладке «Прочее» надо указать пространство имен, которому принадлежит веб-сервис, например «company.com/1C», а так же список XDTO пакетов, содержащий только что созданные пакеты «company.com/1C/Nomenclature, company.com/1C/ClientOrder». Во вкладке «Операции» создать метод «GetClientOrders», который будет возвращать значения «ArrayOfClientOrders (http://company.com/1C/ClientOrder )», при этом установить возможность возвращать пустые значения и нажать на поле с лупой, называемое «Имя метода», тем самым в модуле веб-сервиса будет создана функция, который будет вызвана при обращении к данному методу веб-сервиса.

Для того, чтобы корректно описать функцию, получающую из базы данных и возвращающую список заказов покупателей, необходимо знать внутренний язык 1С, потому код этой функции находится в приложении 1. В пояснении нуждается то, что «ФабрикаXDTO», это некоторый менеджер, который выполняет сериализацию объектов, и этот сериализованный объект необходимо возвратить. При этом происходит выборка всех заказов, содержащихся в базе данных, сериализация полей номера, даты, и строк табличной части, при этом номенклатура, нуждается в дополнительной сериализации, и уже упакованный объект вставляется в общую структуру. Собирается массив упакованных объектов, сериализуется в пакет массива. И отправляется клиенту, как результат вызванной функции.
Для публикации веб-сервиса в меню конфигуратора 1С выбрать «Администрирование\Публикация на веб-сервере…», после чего указать название публикации веб-сервиса, например «Company», имя сервиса, например «Service» и адрес «service.1cws», а так же указать путь для публикации, например «C:\inetpub\wwwroot\Company\».

После этого WSDL структура Web-Сервиса будет доступна по адресу «localhost/Company/ws/service.1cws?wsdl»

Задание 4: Создание клиента на C# платформы .NET 4.0.

В Visual Studio создать новое консольное приложение C#.

Далее вызвать контекстное меню над элементом проекта «Reference», и выполнить действие «Add service reference…», в открывшемся меню нажать на кнопку «Advanced…», откроется окно, где необходимо нажать на кнопку «Add Web Reference…».
Откроется меню, в которое необходимо вставить ссылку на WSDL описание веб-сервиса.


Рис. 5. Подключение веб-сервиса к проекту на C#

Для созданного в 1С веб-сервиса эта ссылка будет иметь вид «localhost/Company/ws/service.1cws?wsdl», после корректного получения описания веб-сервиса надо указать название пространства имен .NET, из под которого будет доступно обращение к веб-сервису, например «CompanyService», затем нажать на кнопку «Add Reference…», Visual Studio автоматически сгенерирует классы по этому описанию. В проекте достаточно будет вызывать методы сгенерированного класса, при этом сериализация и вызов будут выполнять платформой .NET.

Далее необходимо написать программу, которая будет обращаться к веб сервису, и выводить пользователю полученные данные. Для этого необходимо знать язык C#, код программы представлен в приложении 2. Из этого кода надо пояснить, то, что создание объекта «Service», есть не что иное, как создание менеджера обращения к сервису. От этого имени будут вызывать методы веб-сервиса.
«_1CWebServiceClientConsole» — это общее пространство имени проекта, оно выбирается при создании. Пространство имени веб-сервиса, полученное из WSDL структуры полностью включено в пространство имени проекта, что позволяет вызывать удаленные методы «как свои».

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

Оформление отчета о лабораторной работе

Оформление отчета не требуется, требуется создание рабочего стенда, и демонстрация его работы.

Порядок защиты работы

Необходимо показать рабочий стенд, объяснить порядок подключения и особенности настройки, а так же особенности сериализации объектов. Для успешной защиты необходимо ответить на все вопросы.

Контрольные вопросы и задания

  1. Какой разрядности веб-расширение 1С?
  2. В чем 1С хранит структуру пакетов для сериализации данных?
  3. Как получить структуру описания веб-сервиса?
  4. Как подключить веб сервис к проекту, разрабатываемому в Visual Studio?
  5. Зачем нужно создавать менеджер обращений у клиента и что он из себя представляет?

Приложение 1: код функции GetClientOrders на языке 1С

Функция GetClientOrders() 	МассивЗаказовПокупателейТип = ФабрикаXDTO.Тип("http://company.com/1C/ClientOrder", "ArrayOfClientOrders"); 	ЗаказПокупателяТип = ФабрикаXDTO.Тип("http://company.com/1C/ClientOrder", "ClientOrder"); 	ЗаказПокупателяСтрокаТип = ФабрикаXDTO.Тип("http://company.com/1C/ClientOrder", "ClientOrderRow"); 	НоменклатураТип = ФабрикаXDTO.Тип("http://company.com/1C/Nomenclature", "Nomenclature"); 	Запрос = Новый Запрос; 	Запрос.Текст =  		"ВЫБРАТЬ 		|	ЗаказПокупателя.Ссылка, 		|	ЗаказПокупателя.Номер, 		|	ЗаказПокупателя.Дата 		|ИЗ 		|	Документ.ЗаказПокупателя КАК ЗаказПокупателя"; 	Результат = Запрос.Выполнить(); 	Выборка = Результат.Выбрать(); 	Если Выборка.Количество() = 0 Тогда 		Возврат Null; 	КонецЕсли; 	МассивЗаказовПокупателей = ФабрикаXDTO.Создать(МассивЗаказовПокупателейТип); 	 	Пока Выборка.Следующий() Цикл 		ЗаказПокупателя = ФабрикаXDTO.Создать(ЗаказПокупателяТип); 		ЗаказПокупателя.Number = Выборка.Номер; 		ЗаказПокупателя.Date = Выборка.Дата; 			Для каждого Строка Из Выборка.Ссылка.Товары Цикл 			ЗаказПокупателяСтрока = ФабрикаXDTO.Создать(ЗаказПокупателяСтрокаТип); 			Номенклатура = ФабрикаXDTO.Создать(НоменклатураТип); 			Номенклатура.Code = Строка.Номенклатура.Код; 			Номенклатура.Name = Строка.Номенклатура.Наименование; 			ЗаказПокупателяСтрока.Nomenclature = Номенклатура; 			ЗаказПокупателяСтрока.Count = Строка.Количество; 			ЗаказПокупателя.Products.Добавить(ЗаказПокупателяСтрока); 		КонецЦикла; 		МассивЗаказовПокупателей.ClientOrder.Добавить(ЗаказПокупателя); 	КонецЦикла; 	Возврат МассивЗаказовПокупателей; КонецФункции 

Приложение 2: код программы на C# осуществляющий обращение к веб-сервису

using System; using _1CWebServiceClientConsole.CompanyService;  namespace _1CWebServiceClientConsole {     class Program     {         static void Main(string[] args)         {             using (Service service = new Service())             {                 var arrayOfClientOrders = service.GetClientOrders();                  if (arrayOfClientOrders == null)                     Console.WriteLine("Не найдена");                  foreach (var clientOrder in arrayOfClientOrders)                 {                     Console.WriteLine("Заказ покупателя №" + clientOrder.Number + " от " + clientOrder.Date);                     Console.WriteLine("*****************************************************");                     foreach (var clientOrderRow in clientOrder.Products)                     {                         Console.WriteLine(clientOrderRow.Nomenclature.Name + " " + clientOrderRow.Count);                     }                     Console.WriteLine("*****************************************************\n");                 }             }             Console.ReadKey();         }     } } 

ссылка на оригинал статьи http://habrahabr.ru/post/136684/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *