|
XDTO + web сервис | ☑ | ||
---|---|---|---|---|
0
first_may
25.08.17
✎
12:52
|
Добрый день.
Хочу изучить тему XDTO + web сервис, тем более возникла задача создания документа "Заказ покупателя" в удаленной базе из текущей. Поэтому хотелось бы услышать совет специалистов как делать? |
|||
1
breezee
25.08.17
✎
12:56
|
(0) да легко, используей СериализиторXDTO и передавай через веб-сервипс сереилизованные им данные
|
|||
2
first_may
25.08.17
✎
13:00
|
(1) СериализиторXDTO - это на основании пакета XDTO который есть или надо делать свой?
|
|||
3
Fragster
гуру
25.08.17
✎
13:03
|
на ИТС есть демо конфигурация. + КД2 умеет работать через веб сервисы вообще без знания механизмов, если онлайн не нужен и оба решения на БСП.
|
|||
4
lodger
25.08.17
✎
13:04
|
(2) делай свой. да там все просто.
по сути, если просто и на пальцах, пакет XDTO - это твой манифест для сериализации\десериализации данных 1с в\из xml. |
|||
5
first_may
25.08.17
✎
13:09
|
В типовой вижу есть пакет CML402, а в нем ЗаказКлиента.
|
|||
6
first_may
25.08.17
✎
13:10
|
(4) то есть те реквизиты, которые хочу, что бы появились в удаленной базе, надо описать в своем пакете. Так?
|
|||
7
first_may
25.08.17
✎
13:51
|
Даже сделав свой пакет и сформировав нужную xml, как сделать так, что бы произошло ее отправление и создание документа во второй базе?
Что то делать с web сервисом уже? |
|||
8
Mankubus
25.08.17
✎
14:07
|
(7) нужно создать веб сервис, его операцию и описать алгоритм приёма пакета в модуле веб-сервиса
В базе источнике нужно вызывать эту операцию с помощью ws соединения. П.с. Поиск для слабаков? |
|||
9
first_may
25.08.17
✎
14:17
|
(8) Поиск для слабаков? - нет, много что уже нашел, но надо общение.
нужно создать веб сервис, его операцию и описать алгоритм приёма пакета в модуле веб-сервиса - это на принимающей стороне? В базе источнике нужно вызывать эту операцию с помощью ws соединения - не могу понять, как это делается. |
|||
10
first_may
25.08.17
✎
14:35
|
(8) получается
- в базе источнике делаю свой пакет XDTO, при проведении заказа формирую xml по этому пакету и вызываю операцию с помощью ws соединения - не понимаю как? - в базе приемнике делаю веб сервис, его операцию и описание алгоритма приема пакета в модуле веб-сервиса Такой принцип? |
|||
11
lodger
25.08.17
✎
14:40
|
(10) там где у тебя стоит вопросик:
WSDL = Новый WSОпределения("http://твойсервак/чето/там/ИмяВебСервиса.1cws?wsdl",ТекЮзер,ТекПароль); ВСПрокси = Новый WSПрокси(WSDL,"ИмяХДТОПакета","ИмяВебСервиса","ИмяВебСервисаSoap"); ВСПрокси.Пользователь = ТекЮзер; ВСПрокси.Пароль = ТекПароль; ОтветВС = ВСПрокси.ИмяМетодаИзМодуляВебСервиса("твой параметр или хмл"); |
|||
12
lodger
25.08.17
✎
14:41
|
в данном случае я бы создал хдто в БазеПриемнике, а в БазеИсточнике просто считал его в WS-ссылку (как объект конфигарции).
|
|||
13
breezee
25.08.17
✎
16:27
|
(2) На основании любых данных из 1С можешь сериализиовать ТЗ, справочник, документ, кое-что, конечно не можешь, вроде деревья(это не точно), сам веб-сервис.
|
|||
14
breezee
25.08.17
✎
16:30
|
(4) Не надо свой делать. У меня коллеги с работы понаделали этих пакетов XDTO, как с ними разгребаться - хз, там есть функция "серилизовать" или "записить" все в 2 строки с РЕИАЛИЗТОРОМ, не надо свои пакеты лепить. Если обмен только с каким-то сайтам - тогда надо и то, если на зарузку, это тоже не точно
|
|||
15
first_may
25.08.17
✎
20:33
|
(14) тогда на основании какого пакета сделать заказ?
|
|||
16
breezee
25.08.17
✎
21:07
|
(15) Не не основании пакета, а на основании данных, передавай ТЗ сериализованное в xml в источнике. В приемнике десериализуй - тоже самое ТЗ на выходе получается, адельше обходишь в цикле ТЗ и создаешь как тебе надо документ, без пакета, тип метаданных и имя документа можешь в 0 строке таблицы значений прописать
|
|||
17
first_may
25.08.17
✎
21:13
|
(16) то есть никакие XDTO не надо>
|
|||
18
first_may
25.08.17
✎
21:13
|
?
|
|||
19
first_may
25.08.17
✎
21:33
|
как тогда заказ записать в xml? какой пакет использовать?
|
|||
20
breezee
25.08.17
✎
21:35
|
(17) Пакеты - нет, сериализатор - да. Вот пример на запись в xml - Функция СериализоватьТЗ(ТЗ) Экспорт
ЗаписьXML = Новый ЗаписьXML(); ЗаписьXML.УстановитьСтроку(); СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ТЗ); СтрокаXML = ЗаписьXML.Закрыть(); Возврат СтрокаXML; КонецФункции получение данных из xml Функция ПолучитьТаблицуЗначенийИзXML(XMLСтрокаТЗ) Экспорт ЧтениеXML = Новый ЧтениеXML(); ЧтениеXML.УстановитьСтроку(XMLСтрокаТЗ); ТЗ = СериализаторXDTO.ПрочитатьXML(ЧтениеXML); Возврат ТЗ; КонецФункции Никакие пакеты не нужны, система сама все за тебя делает, если нужно - можешь прочитать про эти пакеты, зачем они и когда испольхуются на инфостарте |
|||
21
breezee
25.08.17
✎
21:36
|
(20) Тз - не только таблица значений, а любой тип данных, из 1С, кроме тех, которые туда не подойдут, которые не сериализуемы
|
|||
22
first_may
27.08.17
✎
09:13
|
(12) получается, только хотел спросить, можно ли как то записать документ Заказ покупателя в xml формате для передаче, но при этом пакет XDTO не делать?
Или он обязателен? Типового нет под этот документ? Пробую в источнике сделать так и отправить Функция Сериализовать(ОбъектСериализации) ДеревоВОбъектеXDTO = СериализаторXDTO.ЗаписатьXDTO(ОбъектСериализации); МойXML = Новый ЗаписьXML; МойXML.УстановитьСтроку(); ФабрикаXDTO.ЗаписатьXML(МойXML, ДеревоВОбъектеXDTO); Возврат МойXML.Закрыть(); КонецФункции А в приемнике Функция Десериализовать(XMLСтруктураСериализованногоОбъекта) ЧтениеXMLДанных = Новый ЧтениеXML; ЧтениеXMLДанных.УстановитьСтроку(XMLСтруктураСериализованногоОбъекта); ТЗ = СериализаторXDTO.ПрочитатьXML(ЧтениеXMLДанных); ЧтениеXMLДанных.Закрыть(); Возврат ТЗ; КонецФункции но получаю <Объект не найден> (162:9226001e33553ae411e78a7ed98514bf) |
|||
23
h-sp
27.08.17
✎
09:35
|
попробуйте между идентичными конфигурациями сначала.
|
|||
24
first_may
27.08.17
✎
09:38
|
(23) я пробую как раз между одинаковыми.
в приемнике надо создать пакет xdto заказа покупателя, что бы потом в источнике написать что то типа ВСОпределение = Новый WSОпределения("http://127.0.0.1:1234/bhm/ws/SaveOrder.1cws?wsdl"); ВСПрокси = Новый WSПрокси(ВСОпределение,"http://www.sample-package.org","WebСервис1","WebСервис1Soap"); Ответ = ВСПрокси.СоздатьЗаказ(ДСтр); а вот ДСтр я должен передать в формате xdto, который есть в приемнике |
|||
25
first_may
27.08.17
✎
09:39
|
вот и хотел спросить, как нибудь можно из заказа покупателя организовать xdto?
|
|||
26
breezee
27.08.17
✎
11:29
|
(22) <Объект не найден> (162:9226001e33553ae411e78a7ed98514bf)
А как ты создаешь объект в базе приемнике? |
|||
27
first_may
27.08.17
✎
11:54
|
(26) уже разобрался с тем, как передать XDTO заказа а бызу приемника.
Теперь ищу ответ на вопрос, как прочитать там эту строку, то есть если через файл, то URIПространстваИмен = "http://www.sample-package.org"; ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.ОткрытьФайл("C:\order.xml"); XDTOЗаказПокупателя = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, ФабрикаXDTO.Тип(URIПространстваИмен, "ЗаказПокупателя")); а на сервисе нет же файла, там есть только входящий параметр.. |
|||
28
first_may
27.08.17
✎
11:56
|
то есть вот тут "застопорился" (это в модуле сервиса)
Функция СоздатьЗаказ(Параметр) URIПространстваИмен = "http://www.sample-package.org"; XDTOЗаказПокупателя = ФабрикаXDTO.ПрочитатьXML( ????? , ФабрикаXDTO.Тип(URIПространстваИмен, "ЗаказПокупателя")); |
|||
29
first_may
27.08.17
✎
12:34
|
Получилось вроде.
Оказывается, когда я пишу в источнике Ответ = ВСПрокси.СоздатьЗаказ(XDTOЗаказПокупателя); то в приемнике в веб сервисе Функция СоздатьЗаказ(Параметр) Параметр это и есть XDTOЗаказПокупателя, то есть его стуктура уже такая, как в пакете XDTO, который я сделал. Таким образом получилось следующее, что я сделал для изучения темы: 1 база источник - типовая УТ 2 в базе источника написал внешнюю обработку, в которой выбираю заказ покупателя 3 в обработке написал URIПространстваИмен = "http://www.sample-package.org"; ВСОпределение = Новый WSОпределения("http://127.0.0.1:1234/bhm/ws/SaveOrder.1cws?wsdl"); ВСПрокси = Новый WSПрокси(ВСОпределение, URIПространстваИмен, "WebСервис1", "WebСервис1Soap"); XDTOЗаказПокупателя = ВСОпределение.ФабрикаXDTO.Создать(ВСОпределение.ФабрикаXDTO.Тип(URIПространстваИмен, "ЗаказПокупателя")); XDTOЗаказПокупателя.Дата = ЗаказПокупателя.Дата; XDTOЗаказПокупателя.Номер = ЗаказПокупателя.Номер; .. и тд заполняю с учетом пакета XDTO приеника Ответ = ВСПрокси.СоздатьЗаказ(XDTOЗаказПокупателя); Если Ответ = Истина Тогда Сообщить("Документ успешно создан"); Иначе Сообщить("Ошибка при создании документа"); КонецЕсли; 4 базу премника взял такую же УТ 5 в базе приемника создал XDTO с нужными мне данными 6 в базе приемника создал веб сервис с операцией СоздатьЗаказ и входящем параметром 7 в модуле сервиса написал Функция СоздатьЗаказ(Параметр) XDTOЗаказПокупателя = Параметр; ДокУдалить = Документы.ЗаказПокупателя.НайтиПоНомеру(XDTOЗаказПокупателя.Номер, XDTOЗаказПокупателя.Дата); Если ДокУдалить <> Документы.ЗаказПокупателя.ПустаяСсылка() Тогда ДокУдалить.ПолучитьОбъект().Удалить(); КонецЕсли; Док = Документы.ЗаказПокупателя.СоздатьДокумент(); Док.Дата = XDTOЗаказПокупателя.Дата; Док.Номер = XDTOЗаказПокупателя.Номер; и тд Попытка Док.Записать(РежимЗаписиДокумента.Проведение); //Док.ПолучитьФорму("ФормаДокумента").Открыть(); Результат = Истина; Исключение Результат = Ложь; КонецПопытки; Возврат Результат; |
|||
30
first_may
27.08.17
✎
12:36
|
Таким образом, может как то "коряво", но получил то, что хотел, а именно в источнике создаю документ "Заказ покупателя", указываю его в обработке и такой же заказ появляется в базе приемника.
Спасибо все :), теперь буду "отшлифовывать" алгоритм. |
|||
31
breezee
27.08.17
✎
15:06
|
(29) НайтиПоНомеру нет, нельзя по номеру искать, у тебя через год появится 2 документа с одинаковым номером. И про XDTOпакеты - тоже не надо их. Смори.
1)Формируешь таблицу значений по твоим заказам на передачу в источнике. Типо, делаешь запрос по закзам и выгружаешь результат в ТЗ, затем в цикле по этой табилце проходишься - по ссылкам получаешь ГУИДы документов и ТЗ заполняешь ГУИДы в ТЗ. Потом твое ТЗ сериализуешь, в базе приемнике создаешь веб-сервис и операцию веб-сервиса с типом "string". Далее в приемнике десириализуешь той функцией что я кидал выше - у тебя получается ТЗ в пиремнике. Далее либо циклом, либо запросом получаешь данные из этой ТЗ и создаешь документы, используя поиск по ГУИДу, не по номеру! Если перед тобой не стоит задача использовать эти чертовы пакеты XDTO - не используй ты их, так сложнее и неизвестно зачем. Зачем делать сложнее? |
|||
32
breezee
27.08.17
✎
15:14
|
(29) И вот это "ДокУдалить.ПолучитьОбъект().Удалить();" делать тоже нельзя. Ты же без контроля ссылок на объект удаляешь документ. А если в этой базе на основании документа введены другие документы? Стоп, а почему у тебя стаж на форуме 10 лет и такие странные решения? Угнал у кого-то акк?)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |