Имя: Пароль:
1C
1С v8
Формирование XML из XDTO
0 DanJer74
 
08.01.16
12:57
Приветствую!
Не могу сообразить, как добавить в XDTO вложенный тег. В схеме есть root - это главный узел, куда я все собираю. Есть еще item внутри - это номенклатура. Как бы в выходной xml файл загнать что-то типа вот такого:

<items>
<item>
Номенклатура 1
</item>
<item>
Номенклатура 2
</item>
<item>
Номенклатура 3
</item>
</items>

Все остальное заполняется нормально - застрял только тут.
1 DES
 
08.01.16
13:14
покажи как делаешь остальное
2 DanJer74
 
08.01.16
13:25
Это схема
<xs:schema xmlns:tns="documents.upload" xmlns:xs="http://www.w3.org/2001/XMLSchema"; targetNamespace="documents.upload" attributeFormDefault="unqualified" elementFormDefault="qualified">
    <xs:element name="items">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="item" type="tns:items" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:complexType name="contractor">
        <xs:sequence>
            <xs:element name="userId" type="xs:string"/>
            <xs:element name="name" type="xs:string"/>
            <xs:element name="address" type="xs:string"/>
            <xs:element name="inn" type="xs:string"/>
            <xs:element name="kpp" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="doc">
        <xs:sequence>
            <xs:element name="type" type="xs:byte"/>
            <xs:element name="operation" type="xs:byte"/>
            <xs:element name="document" type="xs:string"/>
            <xs:element name="date" type="xs:dateTime"/>
            <xs:element name="number" type="xs:string"/>
            <xs:element name="contract" type="xs:string"/>
            <xs:element name="sum" type="xs:float"/>
            <xs:element name="barcode" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="items">
        <xs:sequence>
            <xs:element name="itemId" type="xs:string"/>
            <xs:element name="orderItemId" type="xs:string"/>
            <xs:element name="brand" type="xs:string"/>
            <xs:element name="number" type="xs:string"/>
            <xs:element name="title" type="xs:string"/>
            <xs:element name="measureCode" type="xs:string"/>
            <xs:element name="measure" type="xs:string"/>
            <xs:element name="excise" type="xs:string"/>
            <xs:element name="count" type="xs:int"/>
            <xs:element name="price" type="xs:float"/>
            <xs:element name="sum" type="xs:float"/>
            <xs:element name="percent" type="xs:string"/>
            <xs:element name="sumNDS" type="xs:float"/>
            <xs:element name="sumTotal" type="xs:float"/>
            <xs:element name="countryId" type="xs:int"/>
            <xs:element name="country" type="xs:string"/>
            <xs:element name="gtd" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="org">
        <xs:sequence>
            <xs:element name="name" type="xs:string"/>
            <xs:element name="address" type="xs:string"/>
            <xs:element name="inn" type="xs:string"/>
            <xs:element name="kpp" type="xs:string"/>
            <xs:element name="ogrn" type="xs:string"/>
            <xs:element name="okpo" type="xs:string"/>
            <xs:element name="rs" type="xs:string"/>
            <xs:element name="ks" type="xs:string"/>
            <xs:element name="bank" type="xs:string"/>
            <xs:element name="bik" type="xs:string"/>
            <xs:element name="director" type="xs:string"/>
            <xs:element name="accountant" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="root">
        <xs:sequence>
            <xs:element name="UniqueID" type="xs:string"/>
            <xs:element name="isDel" type="xs:byte"/>
            <xs:element name="doc" type="tns:doc" maxOccurs="unbounded"/>
            <xs:element name="org" type="tns:org" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element name="contractor" type="tns:contractor" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element name="item" type="tns:items" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>
3 DanJer74
 
08.01.16
13:27
Это обработка. ПТИУ - поле ввода с типом Документ.ПоступлениетоваровУслуг. Делал для УТ 10
НашПакет = ФабрикаXDTO.Пакеты.Получить("documents.upload");
    
    НашДокумент = ФабрикаXDTO.Тип("documents.upload","root");
    ТипOrg = ФабрикаXDTO.Тип("documents.upload","org");
    Типdoc = ФабрикаXDTO.Тип("documents.upload","doc");
    Типcontractor = ФабрикаXDTO.Тип("documents.upload","contractor");
    //Типitem = ФабрикаXDTO.Тип("documents.upload","items");
    Типitem = НашПакет.КорневыеСвойства[0].Тип.Свойства[0].Тип;
    КореньОрг = ФабрикаXDTO.Создать(ТипOrg);
    КореньКонтрактор = ФабрикаXDTO.Создать(Типcontractor);
    
    Кореньdoc = ФабрикаXDTO.Создать(Типdoc);
    КореньНашДокумент = ФабрикаXDTO.Создать(НашДокумент);
    
    ДокументЗагрузки = ПТИУ.Ссылка;
    
    ОбъектДок = ДокументЗагрузки.ПолучитьОбъект();
    
    КореньНашДокумент.UniqueID = Строка(ДокументЗагрузки.УникальныйИдентификатор());
    КореньНашДокумент.isdel = 0;
    Кореньdoc.contract = Строка(ДокументЗагрузки.ДоговорКонтрагента.Ссылка);
    Кореньdoc.date = ДокументЗагрузки.Дата;
    Кореньdoc.number = ДокументЗагрузки.Номер;
    Кореньdoc.document = Строка(ДокументЗагрузки.Ссылка);
    Кореньdoc.sum = ДокументЗагрузки.СуммаДокумента;
    Кореньdoc.type = 1;
    
    ЗапросШтрихКод = Новый Запрос;
    ЗапросШтрихКод.Текст =
        "ВЫБРАТЬ
        |    ШтрихКодыДокументовТоваровИУслуг.ШтрихКод КАК ШтрихКод
        |ИЗ
        |    РегистрСведений.ШтрихКодыДокументовТоваровИУслуг КАК ШтрихКодыДокументовТоваровИУслуг
        |ГДЕ
        |    ШтрихКодыДокументовТоваровИУслуг.ДокументТоваровУслуг = &ДокументТоваровУслуг";

    ЗапросШтрихКод.УстановитьПараметр("ДокументТоваровУслуг", ПТИУ.Ссылка);

    РезультатШтрихКод = ЗапросШтрихКод.Выполнить();
    
    Если НЕ РезультатШтрихКод.Пустой() Тогда

    ВыборкаДетальныеЗаписиШтрихкод = РезультатШтрихКод.Выбрать();

    ВыборкаДетальныеЗаписиШтрихкод.Следующий();
    Кореньdoc.barcode = ВыборкаДетальныеЗаписиШтрихкод.ШтрихКод;
Иначе
    Кореньdoc.barcode = "";
    КонецЕсли;
    
    
    КореньНашДокумент.doc.Добавить(Кореньdoc);
    
    ///Организация
    КореньОрг.name =Строка(ПТИУ.Организация);
    
    ЗапросАдрес = Новый Запрос;
    ЗапросАдрес.Текст =
        "ВЫБРАТЬ
        |    КонтактнаяИнформация.Представление КАК Адрес
        |ИЗ
        |    РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
        |ГДЕ
        |    КонтактнаяИнформация.Тип = &Тип
        |    И КонтактнаяИнформация.Вид = &Вид
        |    И КонтактнаяИнформация.Объект = &Объект";
    
    ЗапросАдрес.УстановитьПараметр("Вид", Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации);
    ЗапросАдрес.УстановитьПараметр("Объект", ПТИУ.Организация);
    ЗапросАдрес.УстановитьПараметр("Тип", Перечисления.ТипыКонтактнойИнформации.Адрес);
    
    РезультатЗапросаАдрес = ЗапросАдрес.Выполнить();
    
    ВыборкаДетальныеЗаписиАдрес = РезультатЗапросаАдрес.Выбрать();
    
    ВыборкаДетальныеЗаписиАдрес.Следующий();
    КореньОрг.address = (СокрЛП(Строка(ВыборкаДетальныеЗаписиАдрес.Адрес)));
    
         
    КореньОрг.inn = (Строка(ПТИУ.Организация.ИНН));
    
    КореньОрг.kpp= Строка(ПТИУ.Организация.КПП);
    
    КореньОрг.ogrn = Строка(ПТИУ.Организация.ОГРН);
    
    КореньОрг.okpo = Строка(ПТИУ.Организация.КодПоОКПО);
    
    КореньОрг.rs = (Строка(ПТИУ.Организация.ОсновнойБанковскийСчет.НомерСчета));
        
    КореньОрг.ks = Строка(ПТИУ.Организация.ОсновнойБанковскийСчет.Банк.КоррСчет);
    
    КореньОрг.bank = Строка(ПТИУ.Организация.ОсновнойБанковскийСчет.Банк.Наименование);
    
    КореньОрг.bik = (Строка(ПТИУ.Организация.ОсновнойБанковскийСчет.Банк.Код));
        
    ЗапросОтветственные = Новый Запрос;
    ЗапросОтветственные.Текст =
        "ВЫБРАТЬ
        |    ОтветственныеЛицаОрганизацииСрезПоследних.Период,
        |    ОтветственныеЛицаОрганизацииСрезПоследних.СтруктурнаяЕдиница,
        |    ОтветственныеЛицаОрганизацииСрезПоследних.ОтветственноеЛицо,
        |    ОтветственныеЛицаОрганизацииСрезПоследних.ФизическоеЛицо,
        |    ОтветственныеЛицаОрганизацииСрезПоследних.Должность
        |ИЗ
        |    РегистрСведений.ОтветственныеЛицаОрганизации.СрезПоследних(&Период, СтруктурнаяЕдиница = &Организация) КАК ОтветственныеЛицаОрганизацииСрезПоследних";

    ЗапросОтветственные.УстановитьПараметр("Организация", ПТИУ.Организация);
    ЗапросОтветственные.УстановитьПараметр("Период", КонецДня(ТекущаяДата()));

    РезультатОтв = ЗапросОтветственные.Выполнить().Выгрузить();

    Для Каждого Строка Из РезультатОтв цикл
        Если Строка.ОтветственноеЛицо = Перечисления.ОтветственныеЛицаОрганизации.Руководитель Тогда
            Директор = Строка.ФизическоеЛицо.Наименование;
            КонецЕсли;
            
        Если Строка.ОтветственноеЛицо = Перечисления.ОтветственныеЛицаОрганизации.ГлавныйБухгалтер Тогда
            ГлавныйБухгалтер = Строка.ФизическоеЛицо.Наименование;
            КонецЕсли;
        
        КонецЦикла;
        
    КореньОрг.director = (ОбщегоНазначения.ФамилияИнициалыФизЛица(Директор));
    
    КореньОрг.accountant = (ОбщегоНазначения.ФамилияИнициалыФизЛица(ГлавныйБухгалтер));
        
    КореньНашДокумент.org.Добавить(КореньОрг);
    
    ///Организация
    
    
    //Контрактор
    КореньКонтрактор.userId = (Строка(ПТИУ.Контрагент.КлиентId_ССайта));
        
    КореньКонтрактор.name = (Строка(ПТИУ.Контрагент.Наименование));
        
    ЗапросПоКонтрагенту = Новый Запрос;
    ЗапросПоКонтрагенту.Текст =
        "ВЫБРАТЬ
        |    КонтактнаяИнформация.Представление КАК Адрес
        |ИЗ
        |    РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
        |ГДЕ
        |    КонтактнаяИнформация.Тип = &Тип
        |    И КонтактнаяИнформация.Вид = &Вид
        |    И КонтактнаяИнформация.Объект = &Объект";

    ЗапросПоКонтрагенту.УстановитьПараметр("Вид", Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента);
    ЗапросПоКонтрагенту.УстановитьПараметр("Объект", ПТИУ.Контрагент);
    ЗапросПоКонтрагенту.УстановитьПараметр("Тип", Перечисления.ТипыКонтактнойИнформации.Адрес);
    
    РезультатПоКонтрагенту = ЗапросПоКонтрагенту.Выполнить();

    ВыборкаДетальныеЗаписиПоконтрагенту = РезультатПоКонтрагенту.Выбрать();

    Если Не РезультатПоКонтрагенту.Пустой() Тогда
    ВыборкаДетальныеЗаписиПоконтрагенту.Следующий();
    Адресок = (Строка(ВыборкаДетальныеЗаписиПоконтрагенту.Адрес));
Иначе
    Адресок = "";
    КонецЕсли;
    
    КореньКонтрактор.address = Адресок;
    
    КореньКонтрактор.inn =(ПТИУ.Контрагент.ИНН);
        
    КореньКонтрактор.kpp = ПТИУ.Контрагент.КПП;
    
    КореньНашДокумент.contractor.Добавить(КореньКонтрактор);
        
    //Контрактор
    
    Для Каждого Строчка Из ДокументЗагрузки.Товары Цикл
    КореньИтем = ФабрикаXDTO.Создать(Типitem);
    КореньИтем.brand = Строчка.Номенклатура.ФирмаИзготовитель.Наименование;
    КореньИтем.number =Строчка.Номенклатура.Артикул;
    КореньИтем.excise = "Без акциза";
    КореньИтем.title =СокрЛП(Строчка.номенклатура.Наименование);
    КореньИтем.measure = Формат(Строчка.ЕдиницаИзмерения.ЕдиницаПоКлассификатору);
    КореньИтем.count = Число(Строка(Строчка.Количество));
    КореньИтем.price = Число(Формат(Строчка.Цена, "ЧГ=0"));
    КореньИтем.sum = Число(Формат(Строчка.Сумма, "ЧГ=0"));
    КореньИтем.percent = Формат(Строчка.СтавкаНДС);
    КореньИтем.sumNDS = Число(Формат(Строчка.СуммаНДС, "ЧГ=0"));
    КореньИтем.sumTotal = Число(Формат(Строчка.Сумма, "ЧГ=0"));
    
    КореньНашДокумент.item.Добавить(КореньИтем);

КонецЦикла;
    
    Запись = Новый ЗаписьXML;
    Запись.ОткрытьФайл("s:\test.xml");
    ФабрикаXDTO.ЗаписатьXML(Запись,КореньНашДокумент,,,,);
    Запись.Закрыть();
4 DanJer74
 
08.01.16
13:28
Всю голову сломал. И еще - как со свойствами работать? Из документации стандартной не понял ровно нифига.....
5 DES
 
08.01.16
13:38
.Добавить()
.Удалить()
смотрел ?
6 DanJer74
 
08.01.16
13:49
Не понял....
7 DanJer74
 
08.01.16
14:05
Как мне схему создать и как потом выводить данные - не понимаю :(
8 DES
 
08.01.16
14:46
можно так:

Запись = Новый ЗаписьXML();
Запись.УстановитьСтроку();
Запись.ЗаписатьНачалоЭлемента("items");
Для Каждого твоего ИЗ набора Цикл
Запись.ЗаписатьНачалоЭлемента("item"); Запись.ЗаписатьТекст(твоего."тут твой текст значения"); Запись.ЗаписатьКонецЭлемента();
КонецЦикла;
Запись.ЗаписатьКонецЭлемента();
СтрXML = Запись.Закрыть();
9 DanJer74
 
09.01.16
11:55
Это я знаю - от этого мы хотим уйти
10 DanJer74
 
09.01.16
11:56
Мне надо с веб-сервисами работу наладить
11 Serginio1
 
09.01.16
12:16
Что типа такого
Фабрика = СоздатьФабрикуXDTO("ПутьКФайлу.xsd");

// Создаем ОбъектXDTO используя Фабрика
ЗаписьXML = Новый ЗаписьXML;
        ЗаписьXML.УстановитьСтроку();
        ЗаписьXML.ЗаписатьОбъявлениеXML();
        Фабрика.ЗаписатьXML(ЗаписьXML, ОбъектXDTO);
        СтрокаXML = ЗаписьXML.Закрыть();
////////////////////////// в объек
12 Serginio1
 
09.01.16
12:22
У объектаXdto есть метод
Добавить(<Форма>, <URIПространстваИмен>, <ЛокальноеИмя>, <ЭлементДанных>)

v8: Как добавить элемент в ОбъектXDTO
13 DanJer74
 
09.01.16
15:48
Все, я разобрался :)
14 4St
 
09.01.16
17:04
(13) Добрый день! Похоже, мы занимаемся в чем-то пересекающимися задачами. http://catalog.mista.ru/public/439926/
Исходники описанного сервиса лежат тут: https://github.com/volodkindv/CloudCat1C/tree/demo
Есть желание поучаствовать? (в части обмена документами, например)
15 DanJer74
 
09.01.16
19:14
Можно попробовать
16 DanJer74
 
12.01.16
12:07
И все-таки остался вопрос. Как заполнять значения свойств и выводить их в xml.
17 Serginio1
 
12.01.16
14:16
Список=Фабрика.Создать(Фабрика.Создать(ФабрикаXDTO.Тип("documents.upload", "root"));

ТипЭлемента=ФабрикаXDTO.Тип("documents.upload", "items");

Элемент=Фабрика.Создать(ТипЭлемента);
Элемент.itemId=траляля;

root.item.Добавить(Элемент);

Итак для всех doc,org contractor
18 Serginio1
 
12.01.16
14:17
Фабрика это ФабрикаXDTO если схема загружена в конфигуратор
или создана из файла через СоздатьФабрикуXDTO("ПутьКФайлу.xsd");
19 Serginio1
 
12.01.16
15:41
20 DanJer74
 
13.01.16
07:52
Спасибо, я уже это реализовал, только вот как работать со свойствами? Как их добавлять в xml тегами? Интересуюсь в связи с тем, что есть xml файлик, из которого делаю схему, а там свойства - так вот как их выводить, чтобы не переделывать ничего?
21 Serginio1
 
13.01.16
08:36
Есть куча онлайн генераторов XSD по XML. Только все свой ства будут строковые. Это несложно назначить их типю

https://www.google.ru/webhp#newwindow=1&q=xml+to+xsd
22 Serginio1
 
13.01.16
08:40
Кроме того в 12 я тебе дал ссылку как можно добавить свойства без схемы.
23 DanJer74
 
20.01.16
12:47
В продолжении темы - мне нужно перекинуть из одной базы в другую Реализацию товаров услуг. Я ее формирую, все норм - формирование через вот это
РТИУТИп = ФабрикаXDTO.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config","DocumentObject.РеализацияТоваровУслуг";);

Создаю все, заполняю, все норм.
Когда пытаюсь записать XML, все формируется, но хотелось бы вместо уникальных идентификаторов получать наименования. Возможно такое или нужно руками собирать весь ХМЛ?
24 Serginio1
 
20.01.16
12:50
Создавай свой пакет. Только по уму тебе нужно передавать еще и значения всех ссылочных типов присутствующих в накладной.
25 DanJer74
 
20.01.16
12:53
То есть значит типовым не прокатит
26 DanJer74
 
20.01.16
12:55
Как раз это и не очень хотелось делать, но заготовка есть. Хотелось бы побольше типовыми средствами обойтись :(
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.