Обмен данными через Web Сервисы

Публикация № 1116527

Разработка - Обмен данными 1С - Перенос данных из 1C8 в 1C8

Web Сервисы

75
Ознакомительная статья о том, как загружать\выгружать данные с одной базы в другую, используя Web Сервисы.

Приветствую вас, друзья! Сегодня я хочу поделиться с вами опытом работы с WS (Web-Servis). 
Для работы веб-сервиса должен быть установлен Apache, либо iis.

Для примера, выгрузим таблицу остатков.

1. Создаем Web -Service в удаленной базе , и назовем его "ObmenWS".

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2. После этого необходимо заполнить свойства Web -Сервиса, (Вкладка "Прочее"):

     1) URL Пространства имен - Требуется для идентификации веб-сервиса, по сочетанию его имени и пространству имен, укажем для примера "1.1.1.1";

     2) Пакеты XDTO - это механизм, разработанный фирмой “1С” для обмена данными с другими программными системами посредством XML, позволяющий на уровне языка 1С оперировать не узлами XML, а прикладными понятиями “Сотрудник”, “Счет” и привычными встроенными типами (“ТаблицаЗначений”, “СправочникСсылка” и т.п.). В данном примере не будем создавать собственные пакеты, а будем использовать встроенные пакеты 1С (а именно  - "http://v8.1c.ru/8.1/data/core"). Данный пакет содержит формат "Двоичные данные" - что поможет нам передавать любые типы через хранилище данных.
     3) Имя файла публикации - название файла *.1CWS, имя файла публикации может быть любым, но желательно латинским шрифтом и обязательно с расширением 1cws и желательно должно совпадать с именем каталога на web-сервере. Назовем его как и наш WS - "ObmenWS".

 

 

 

 

 

 

 

 

 

 

 

 


 

Наш Web Сервис готов к работе! Осталось добавить операции в WS для загрузки и выгрузки данных.

2. Создаем операцию с названием "ОстаткиТоваровНаСкладах", и с типом значение -ХранилищеДанных (ValueStorage):

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Создаем параметры для нашей операции. Для примера я создам 3 параметра :

     1) НачалоПериода - с типом Дата (Date);

     2) КонецПериода  -  с типом Дата (Date);

     3) Склад  - С типом Строка (String);

Количество параметров не ограничено, можно создавать сколько необходимо для конкретной задачи (Добавить Организацию например или контрагента и тд.) 

 После добавления параметров, приступаем к добавлению программного кода к нашей операции "ОстаткиТоваровНаСкладах". Нажимаем в свойствах операции на "ИмяПроцедуры" и открываем модуль WS. 

Необходимые данные мы получим запросом, и программный код будет иметь следующий вид:

	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ТоварыНаСкладахОстаткиИОбороты.Номенклатура.Наименование КАК НоменклатураНаименование,
		|	ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток КАК КоличествоНачальныйОстаток,
		|	ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток,
		|	ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход КАК КоличествоПриход,
		|	ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход КАК КоличествоРасход
		|ИЗ
		|	РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Запись, , Склад = &Склад) КАК ТоварыНаСкладахОстаткиИОбороты";
	
	Запрос.УстановитьПараметр("КонецПериода", КонецПериода);
	Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);
	Запрос.УстановитьПараметр("Склад", Справочники.Склады.НайтиПоНаименованию(Склад,истина));
	
	ТаблицаРезультата = Запрос.Выполнить().Выгрузить();
	Хранилище = новый ХранилищеЗначения(ТаблицаРезультата);
	Возврат Хранилище;

На этом наш Web Сервис готов! Публикуем наш web сервис и можно подключаться к нему из другой базы.

 

 3. Пример подключения из другой базы  для получения остатков за период по определенному складу:

       1) Создаем внешнюю обработку, в модуле обработки прописываем следующий код:

Процедура ПолучитьТаблицуСДругойБазы()
	НачалоПериода = ТекущаяДата();
	КонецПериода  =  ДобавитьМесяц(ТекущаяДата(),-3);   //3 месяца назад
	Склад = "Основной склад";
	
	Таблица =  ПолучениеДанных(НачПериод,КонПериод,Склад);   //Первый вариант, 
	//Если операций станет много, что бы не писать для каждую операцию свою функцию можно создать одну универсальную
	Таблица =  ПолучениеДанныхОптимизированно("ОстаткиТоваровНаСкладах",НачПериод,КонПериод,Склад); //Второй вариант - оптимизированно!)
	
КонецПроцедуры

Функция ПодключениеКWS()
	МестоположениеWSDL =  			"http://localhost/ObmenWS/ws/ObmenWS.1cws?wsdl" ; //localhost - указываем ваш ip-адрес, где опубликован ws
	ИмяПользователя =   			"Администратор";
	Пароль=             			"Пароль";
	URIПространстваИменСервиса =  	"1.1.1.1 ";
	ИмяСервиса= 					"ObmenWS";
		
	ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL;            
	
	ВСОпределение = Новый WSОпределения(МестоположениеWSDL, ИмяПользователя, Пароль,,,ЗащищенноеСоединение);        	
	ВСПрокси = Новый WSПрокси(ВСОпределение,URIПространстваИменСервиса , ИмяСервиса,ИмяСервиса+"Soap" );     
	
	ВСПрокси.Пользователь = ИмяПользователя;
	ВСПрокси.Пароль = Пароль;
		
	Возврат ВСПрокси;

КонецФункции

Функция ПолучениеДанныхОптимизированно(ИмяФункцииWS, П1 = Неопределено,
						П2 = Неопределено,
						П3 = Неопределено,
						П4 = Неопределено,
						П5 = Неопределено,
						П6 = Неопределено,
						П7 = Неопределено,
						П8 = Неопределено)
						
	Подключение = ПодключениеКWS();
	Данные = Вычислить("Подключение."+ИмяФункцииWS+"("+?(П1=Неопределено,"","П1")
													 +?(П2=Неопределено,"",",П2")
													 +?(П3=Неопределено,"",",П3")
													 +?(П4=Неопределено,"",",П4")
													 +?(П5=Неопределено,"",",П5")
													 +?(П6=Неопределено,"",",П6")
													 +?(П7=Неопределено,"",",П7")
													 +?(П8=Неопределено,"",",П8") + ")");
	Ответ = Данные;
	Возврат Ответ;
КонецФункции

Функция ПолучениеДанных(НачПериод,КонПериод,Склад)
						
	Подключение = ПодключениеКWS();
	Хранилище = Подключение.ОстаткиТоваровНаСкладах(НачПериод,КонПериод,Склад);
	Таблица = Хранилище.Получить();
	Возврат Таблица;
КонецФункции

На этом всё, Спасибо за внимание! 
Открыт для критики и наиболее изящных методов ! (=

75

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. Boyborodin 03.09.19 08:18 Сейчас в теме
Советую делать один параметр входящий типа string и исходящий такой же. В строку кидать текст JSON. В JSON можно запаковывать любое количество параметров, даже таблицы значений. Без муторной работы с XDTO, а сама запаковка и распаковка занимает несколько строк кода. Так же если при доработке придется добавлять входные/выходные параметры сам web-сервис можно уже не перенастраивать.
hakerxp; Jeka44; Lazio; kuzyara; marat3581525; TODD22; Robbi; wowik; Jokemas; TeMochkiN; Glebb_NSK; Fox-trot; user5300; +13 Ответить
2. user5300 120 03.09.19 08:22 Сейчас в теме
(1) Хорошая идея! Спасибо за совет !)
3. AlX0id 03.09.19 08:37 Сейчас в теме
(1)
Тут только один нюанс - в пользу использования того же XDTO - не будет автоматической проверки корректности того, что же вы запихали в этот JSON..
В принципе, сам использую похожий способ - для работы с внешними источниками - на вход беру строки xml, кодированные в base64. Не очень красиво, зато внешним кодерам удобно и понятно.
6. Boyborodin 03.09.19 09:02 Сейчас в теме
(3)

Запаковываем

	 ЗаписьJSON = Новый ЗаписьJSON;
	 ЗаписьJSON.УстановитьСтроку();
	 СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, СтруктураДанных, НазначениеТипаXML.Явное);
	 StringJS = ЗаписьJSON.Закрыть();


Распаковываем

	ЧтениеJS = Новый ЧтениеJSON;
	ЧтениеJS.УстановитьСтроку(StringJS);
	СтруктураДанных = СериализаторXDTO.ПрочитатьJSON(ЧтениеJS);
	ЧтениеJS.Закрыть();


JSON автоматически всё сериализует. Удобнее чем XML. Можно еще пожать, если данные объемные.
user5300; wowik; +2 Ответить
7. user5300 120 03.09.19 09:05 Сейчас в теме
(6) Кстати, а если структура баз отличается ? Допустим если выгрузить физ лица с ЗУП в УТ, у них же разные структуры... Реквизиты и тд., Ошибки не будет ?)
8. Boyborodin 03.09.19 09:14 Сейчас в теме
(7)

Ошибка будет. Тем более такие обмены обычно делают в нетиповых конфигурациях. Для типовых есть типовые инструменты. В структуру лучше кидать примитивные параметры: дата, число, строка, или таблицу значений из примитивных данных.

Для вашего примера:

СтруктураДанных = Новый Структура;
СтруктураДанных.Добавить("КонецПериода", КонецПериода);
СтруктураДанных.Добавить("НачалоПериода", НачалоПериода);
СтруктураДанных.Добавить("Склад", Склад);


И не забыть после успешного завершения процедуры вернуть какой-нибудь признак что всё прошло хорошо.
user5300; +1 Ответить
10. AlX0id 03.09.19 09:26 Сейчас в теме
(6)
Я не про удобство - автоматического контроля состава данных внутри JSON нет.
XML, кстати, я в итоге разбираю с помощью XDTO все равно.
4. Fox-trot 94 03.09.19 08:44 Сейчас в теме
каталог базы должен иметь полные права

как тебя понимать, саид? (с)
5. user5300 120 03.09.19 08:50 Сейчас в теме
(4) Забыл..., если база файловая- каталог базы должен иметь полные права
9. Fox-trot 94 03.09.19 09:24 Сейчас в теме
(5) может все же пользователь должен иметь полные права? тогда какой пользователь?
11. user5300 120 03.09.19 09:51 Сейчас в теме
(9)
Прикрепленные файлы:
Fox-trot; +1 Ответить
27. Сто27001 05.09.19 08:12 Сейчас в теме
(4) Если с русского перевести на русский, то "каталог базы должен иметь полные права" означает, что пользователь ОС от имени которого запущены IIS или Apache, должен иметь полные права на каталог в котором расположена публикуемая файловая база.
user5300; elizarovs; Fox-trot; +3 Ответить
12. ellavs 619 03.09.19 11:12 Сейчас в теме
Довольно часто пользуемся подобным функционалом для обмена данными между базами (только используем HTTP-сервисы). Это в основном, когда мы не хотим пускать пользователей в основную базу, но им нужно поработать с данными. Есть другая конфигурация, например, не содержащая ПДн, куда доступ предоставлен бОльшему количеству пользователей, и в ней получаем данные из основной БД через сервис.
user5300; +1 Ответить
13. logos 140 03.09.19 16:53 Сейчас в теме
А зачем в этой ситуации вообще SOAP? Зачитывание wsdl, сериализация в ХЗ, обратная десериализация. Про json уже написали, так давайте последовательно советовать и http-сервис. Передаем в одном из полей метод, в другом данные. Сериализация/десериализация отлично делается методами ПрочитатьJSON, ЗаписатьJSON. И никакого XDTO вообще не нужно.
sevushka; +1 Ответить
17. Ndochp 101 04.09.19 09:16 Сейчас в теме
(13)ХДТО нужен исключительно для автоматической проверки входящих данный на соответствие формату. К джейсону такое универсально на коленке не прикрутить.
user5300; +1 Ответить
18. logos 140 04.09.19 09:18 Сейчас в теме
(17) Какая в данном сценарии может быть проверка? Описывается получение произвольных данных запросом (базовых типов). Считаю, что использование SOAP имеет смысл только при работе с "ненадежным" клиентом, от которого можно получить "непредсказуемый" input. А когда пишешь свои сервисы - это избыточная перестраховка, сильно усложняющая разработку.
Fox-trot; +1 Ответить
19. Ndochp 101 04.09.19 09:36 Сейчас в теме
(18) У меня 8 видов баз под контролем. И они периодически обновляются. Вот тебе и источник непредсказуемого инпута.
Ты же не будешь правила писать для превращения документа в джейсон, правильно? ты сделаешь платформенную сериализацию.
А на стороне приёмника уже сделаешь какой-то алгоритм разбора, если базы не совпадают.

И вот, то что писали в "Реквизит" начали писать в "Реквизит подробно", а в "Реквизит" стали писать укрупненные типы.
В случае SOAP алгоритм на принимающей стороне долбанется от новых реквизитов в которые переложили нужные тебе данные и ты полезешь разбираться. А в разборе джейсона ты проигнорируешь "Реквизит подробно", привычно заберешь все из "Реквизит", и получишь неверный документ.
user5300; +1 Ответить
20. logos 140 04.09.19 12:39 Сейчас в теме
(19) Давайте всё таки на Вы. Если "левая рука" не знает, что делает правая - никто не запрещает использовать SOAP. Однако, в контексте публикации автора, http сервис и JSON сериализатор дадут более аккуратный и более быстрый код.
21. Ndochp 101 04.09.19 13:00 Сейчас в теме
(20) Давайте на Вы.
Левая рука - Вы. Правая - 1С. Обмена между самописными базами я за свою карьеру не встречал, обычно нетеленка обменивается с доработанной типовой, или две доработанных между собой. В нетленка - 1С непредсказуемость только на стороне приёмника, а вот в 1С-1С - с обеих сторон.

У автора вообще контекста нет. У него есть инструмент и пример использования. Ясно, что код без проверок будет быстрее и компактнее. Как и подшипник без смазки крутится быстрее. Только вот в реальной жизни подшипники смазывают, а в коде делают проверки. И SOAP даёт для них автоматизированный инструмент, а Json оставляет все на откуп пользователю.
В итоге в реальности на до исходить из своего контекста - передача ограниченного числа слабосвязанных объектов легко делается на Jsonе, кусочек базы данных - надежнее на XDTO.
22. logos 140 04.09.19 13:44 Сейчас в теме
(21) Левая рука - клиент, правая - сервер. Я не вижу, где тут код от ООО "1С-Софт", в случае, если мы пишем свой веб-сервис. Если Вы предоставляете сервер сторонним клиентам - я обеими руками за SOAP, когда ошибка в рассинхронизации протокола - это просто ошибка разработчика(ов) информационной системы. Впрочем, настаивать не буду, хотите SOAP - я не в праве Вам этого запретить.
23. Ndochp 101 04.09.19 15:34 Сейчас в теме
(22) Код от 1С вот тут: СериализаторXDTO.ЗаписатьJSON (http://v8.1c.ru/o7/201501json/index.htm) Соответственно в поле "Значение" будет то, что написала 1С.
24. logos 140 04.09.19 16:00 Сейчас в теме
(23) А я предлагаю пользоваться другим сериализатором:
Глобальный контекст (Global context)
ЗаписатьJSON (WriteJSON)
25. Ndochp 101 04.09.19 16:13 Сейчас в теме
(24)
В формате JSON допускается записывать только значения следующих типов:
Строка,
Число,
Булево,
Дата (преобразованная в строку),
Массив,
ФиксированныйМассив,
Структура,
ФиксированнаяСтруктура,
Соответствие,
ФиксированноеСоответствие.

Успехов в передаче документов.
26. logos 140 04.09.19 16:37 Сейчас в теме
(25) Передаются структуры/соответствия и массивы. К этим типам приводятся необходимые получателю объекты. Вы же не будете утверждать, что XDTO (xsd) у Вас волшебным образом самостоятельно заполняется? Платформенным сериализатором многое не передать. В любом случае придётся заполнять "объект xdto".
14. EMelihoff 03.09.19 16:55 Сейчас в теме
у меня наверное профессиональная деградация, при виде переменной "Хранилище" думал минут 5 причём тут хранилище ))
15. fr13 616 04.09.19 06:13 Сейчас в теме
Методы, параметры веб-сервиса на кириллице.
Логин и пароль также.
Если дергать такой веб-сервис не из платформы 1С, то будут проблемы.
16. user5300 120 04.09.19 07:45 Сейчас в теме
(15) Это пример обмена между базами ) Конечно можно все переделать на латиницу для работы с другими сервисами )
Оставьте свое сообщение