XDTO

1. sandybaev 198 11.11.16 12:54 Сейчас в теме
Добрый день всем!

собственно хочется с Вами обсудить вопросы по XDTO тематике

Цель:
импорт XML файла посредством XDTO пакетов, из (совсем не стандартной) базы 1С8.3 во внешнюю среду.
Получатель CRM программа написанная C#.

прочитал несколько раз это: http://infostart.ru/public/167459/ все три публикации, ни черта не понял.


К примеру для начала надо выгрузить им регистр сведений "Курсы валют".

У меня на данный момент есть только XDTO пакет.

Что делать дальше?
Как должен выглядеть код?

Тема для меня новая, ранее с этим не сталкивался, но есть желание узнать.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. antz 11.11.16 13:13 Сейчас в теме
1. Можно схему посмотреть? (правой кнопкой мыши на пакете - экспорт XML-схемы)
2. Какая структура xml-файла должна быть?
3. spe1c 5 11.11.16 14:27 Сейчас в теме
Копать в сторону фабрики XDTO
В первой из упомянутых вами статей, например:
ипОбъектаСписок = ФабрикаXDTO.Тип(“http://super-puper/collections”, “Список”);

// Создаем объект списка
ОбъектСписок = ФабрикаXDTO.Создать(ТипОбъектаСписок);


И далее по тексту.
4. caponid 11.11.16 16:11 Сейчас в теме
На самом деле все очень просто - сначала описываем пакет: Во вложении схема..

А вот код по формированию xml из XDTO
URIПространстваИменЗаписи = "https://api.novaposhta.ua/xml/qw";
ТипЗапросXTDO = ФабрикаXDTO.Тип(URIПространстваИменЗаписи, "root");
	
ЗапросXTDO = ФабрикаXDTO.Создать(ТипЗапросXTDO);
ЗапросXTDO.КлючДоступа = ПолучитьAPIКлюч();
ЗапросXTDO.Модель = "Common";  // api 2.0 Новой почты
ЗапросXTDO.Метод = 	"getDocumentStatuses";
	
ЗаписьXML = Новый ЗаписьXML;
ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Ложь); 
ЗаписьXML.УстановитьСтроку(ПараметрыЗаписиXML);
ЗаписьXML.ЗаписатьОбъявлениеXML();
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ЗапросXTDO);
ДанныеXML = ЗаписьXML.Закрыть(); 
Показать

И сформированный xml
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="https://api.novaposhta.ua/xml/qw" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<apiKey>*******************</apiKey>
	<modelName>Common</modelName>
	<calledMethod>getDocumentStatuses</calledMethod>
</root>

Основное удобство - работа с объектом XDTO - т.е. например ЗаполнитьЗначенияСвойств(ЗапросXTDO, МояСсылка) и т.д., ЗаписьXML - это только линейная запись, а в объект XDTO можно писать в произвольном порядке..., очень простое обратное преобразование.

При это в Имени задаешь то что у тебя, в локальном имени - то что будет в имени xml

PS - при экспорте xsd схемы если заполнено локальное имя, то имя теряется..
Прикрепленные файлы:
ЗапросМетода.xsd
5. sandybaev 198 06.12.16 13:36 Сейчас в теме
Вот пример кода:

ЗаписьXML = Новый ЗаписьXML;
	ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Истина);
	ЗаписьXML.ОткрытьФайл("E:\Работа\XDTO\тест 1\Выгрузка валют.xml", ПараметрыЗаписиXML);
	ЗаписьXML.ЗаписатьОбъявлениеXML();
    
    ЗаписьXML.ЗаписатьНачалоЭлемента("Данные");
    
    Выборка = Справочники.Валюты.Выбрать();
    
    
    Пока Выборка.Следующий() Цикл
        
        ТипЗначенияXDTO = ФабрикаXDTO.Тип("Выгрузка", "СписокВалют"); 
        СписокXDTO = ФабрикаXDTO.Создать(ТипЗначенияXDTO);
        
        ТипЗначениXDTO = ФабрикаXDTO.Тип("Выгрузка", "Валюта"); 
        ВалютаXDTO = ФабрикаXDTO.Создать(ТипЗначениXDTO);
        
        ВалютаXDTO.Наименование = Выборка.Наименование;
        ВалютаXDTO.Код = Выборка.Код;
        
        СписокXDTO.Валюта = ВалютаXDTO;
        ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, СписокXDTO.Валюта);
        
    КонецЦикла; 
    
    ЗаписьXML.ЗаписатьКонецЭлемента();
    
    ЗаписьXML.Закрыть();  
Показать
6. sandybaev 198 06.12.16 13:36 Сейчас в теме
Вот схема:


<xs:schema xmlns:tns="Выгрузка" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="Выгрузка" attributeFormDefault="unqualified" elementFormDefault="qualified">
<xs:complexType name="Валюта">
<xs:sequence>
<xs:element name="Наименование" type="xs:string"/>
<xs:element name="Код" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="СписокВалют">
<xs:sequence>
<xs:element name="Валюта" type="tns:Валюта" nillable="true"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
7. sandybaev 198 06.12.16 13:37 Сейчас в теме
Хочу выгрузить для начала просто справочник Валюты.

вот результат обработки:


<?xml version="1.0" encoding="UTF-8"?>
<Данные>
<Валюта xmlns="Выгрузка" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Наименование>RUB</Наименование>
<Код>643</Код>
</Валюта>
<Валюта xmlns="Выгрузка" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Наименование>Доллар</Наименование>
<Код>840</Код>
</Валюта>
<Валюта xmlns="Выгрузка" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Наименование>Евро</Наименование>
<Код>978</Код>
</Валюта>
<Валюта xmlns="Выгрузка" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Наименование>Иена</Наименование>
<Код>392</Код>
</Валюта>
<Валюта xmlns="Выгрузка" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Наименование>Тенге</Наименование>
<Код>398</Код>
</Валюта>
</Данные>
8. sandybaev 198 06.12.16 13:42 Сейчас в теме
На форумах пишут, что можно посредством XDTO написать код проще чем мой.

Если я правильно понял то я в моем примере мог бы опустить функцию:
ЗаписьXML.ЗаписатьНачалоЭлемента("Данные");
и ее закрытие


так ли это?
9. caponid 07.12.16 15:28 Сейчас в теме
Вот так
ЗаписьXML = Новый ЗаписьXML;
ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Истина);
ЗаписьXML.УстановитьСтроку(ПараметрыЗаписиXML);
ЗаписьXML.ЗаписатьОбъявлениеXML();

ТипДанных = ФабрикаXDTO.Тип("Выгрузка", "Данные"); 
ТипЭлемента = ФабрикаXDTO.Тип("Выгрузка", "Валюта"); 
Данные = ФабрикаXDTO.Создать(ТипДанных);

Выборка = Справочники.Валюты.Выбрать();
Пока Выборка.Следующий() Цикл
    ВалютаXDTO = ФабрикаXDTO.Создать(ТипЭлемента);
    ЗаполнитьЗначенияСвойств(ВалютаXDTO, Выборка);
    Данные.Валюта.Добавить(ВалютаXDTO);
КонецЦикла; 
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, Данные);
СтрокаДанных = ЗаписьXML.Закрыть();
Показать

Прикрепленные файлы:
выгрузка.xsd
10. caponid 07.12.16 16:01 Сейчас в теме
Результат :
XML
И выводы - не надо писать xml частями, можно записать объект целиком, все можно описать в пакете, можно и нужно пользоваться ЗаполнитьЗначенияСвойств() - прилично сокращает объем кода.
Дополнение - Ключевые поля лучше выносить в атрибуты - повышает читабельность результата (в том же самом нотепад++ узлы можно свернуть и видны только атрибуты с именем узла - удобно)
11. Serginio 938 07.12.16 16:21 Сейчас в теме
Тебе проще использовать Вэб сервисы. По Wsdl создадутся нужные классы и проще их дергать.
Второй вариант это ODATA Linq to ODATA
12. caponid 07.12.16 17:47 Сейчас в теме
(11) у него, судя по заголовку темы, формат обмена уже определен..
а сейчас да, есть гораздо более интересные технологии/возможности.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот