Имя: Пароль:
1C
1С v8
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 лет и такие странные решения? Угнал у кого-то акк?)