Имя: Пароль:
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
Как раз это и не очень хотелось делать, но заготовка есть. Хотелось бы побольше типовыми средствами обойтись :(