Pull to refresh

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

Reading time 9 min
Views 111K
Для одного проекта было необходимо использование веб-сервисов 1С, мы строили систему автоматизации склада, и терминалы сбора данных напрямую подключаются к 1С, сами клиенты разработаны на .NET. Получилась очень интересная структура. Полученную информацию о настройках 1С в режиме работы веб-сервиса а так же написание простенькой конфигурации и клиента на C# в виде tutorial лабораторной работы, которую затем успешно презентовал в институте.

Лабораторная работа получила немного замысловатое название:
Организация обмена информацией между клиент-серверным разноплатформенным решением, используя 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-Сервису. Технология является мультиплатформенной и на данный момент ее использование весьма актуально.

Примерами веб-сервисов, использующих WSDL описание, можно назвать:

  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. Кроме выбранных по умолчанию компонентов, надо добавить еще компоненты, связанные с технологией ISAPI, именно благодаря этой технологии расширение веб-сервера 1С имеет возможность связаться с веб-сервером IIS, и тип аутентификации «по URL», чтобы допускать к веб-сервису используя аутентификацию пользователей базы данных 1С. После установки рекомендуется перезапустить операционную систему.


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

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

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

Теперь возможна публикация 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())
            {
                service.SoapVersion = System.Web.Services.Protocols.SoapProtocolVersion.Soap12;
                service.Credentials = new System.Net.NetworkCredential("LOGIN", "PASS");

                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("-----");
                }
            }
            Console.ReadKey();
        }
    }
}

Tags:
Hubs:
+5
Comments 6
Comments Comments 6

Articles