Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Как добавить элемент в ОбъектXDTO

Как добавить элемент в ОбъектXDTO
Я
   ВаликТР
 
03.02.14 - 23:14
Есть XML
<?xml version="1.0" encoding="UTF-8"?>
<yml_catalog xmlns="http://www.w3.org/2001/XMLSchema"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; xsi:type="anyType" date="2006-11-30 16:46">
    <currencies>
        <currency id="EUR" rate="11" plus="0"/>
        <currency id="USD" rate="8" plus="0"/>
    </currencies>
</yml_catalog>

Кодом читаю Объект = ФабрикаXDTO.(Чтение...) - читается нормально.
Как добавить элементы currency перебирая справочник Валют.
Если можно привести код - буду признателен.
   zladenuw
 
1 - 03.02.14 - 23:50
типа так.

КлиентыТип = ФабрикаXDTO.Тип("http://v8.1c.ru/8.1/data/enterprise/current-config","CatalogObject.Клиенты";); 

ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(Путь);
Клиент = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, КлиентыТип);
ЧтениеXML.Закрыть();
Об = Справочники.Клиенты.СоздатьЭлемент();
ЗаполнитьЗначенияСвойств(Об, Клиент);
Об.Записать();
   Armando
 
2 - 04.02.14 - 00:30
(1) Мне кажется тут наоборот, надо в эту XML засунуть данные из спр. валют.
   zladenuw
 
3 - 04.02.14 - 00:37
(2) тогда ему букву Я справа. и все прекрасно найти можно :)
   ВаликТР
 
4 - 04.02.14 - 10:46
(2) Все верно. Нужно в Список <currencies> добавить все записи из справочника через XDTO
(3) Не поверите, куча примеров работает, а мой конкретный - нет. 99% примеров с XDTO используют схему XML. А у меня ее нет. Есть уже готовый XML, который я читаю через ФабрикаXDTO.ПрочитатьXML(...)

Может кто может набросать как создать/добавить этот элемент списка?
   Armando
 
5 - 04.02.14 - 13:36
(4) Надо на основе XML создать схему. На основе схемы создать фабрику. Тогда будет работать. Вроде так.
   Serginio1
 
6 - 04.02.14 - 14:06
Табличная часть не заполняется через ЗаполнитьЗначенияСвойств(Об, Клиент); 
 Нужно построчно записывать

 Вообще читай сразу через СерриализаторXDTO или приводи объект
Объект=СериализаторXDTO.ПрочитатьXDTO(Клиент );
   Serginio1
 
7 - 04.02.14 - 14:09
(4) Создай схему и записывай и читай по ней. Либо считывай в таблицу значений v8: Веб-сервис и передача-прием XML и работай с ней
   Maxus43
 
9 - 04.02.14 - 14:15
чего сёдня за день? каждый час тема про фабрики XDTO... обострение?
   zladenuw
 
10 - 04.02.14 - 14:17
(9) пошли умные начальники. сказали юзать XDTO, молодые падаваны учят :)
   ВаликТР
 
11 - 05.02.14 - 14:54
(6) СериализаторXDTO Выдает ошибку преобразования данных
   Serginio1
 
12 - 05.02.14 - 15:25
Конечно выдаст yml_catalog.
Ну так выбирай
 Для каждого Элем из Объект.currencies Цикл
 Валюта=Элем.id;
  rate=Элем.rate;
  plus=Элем.plus;
КонецЦикла

Проблемы могут возникнуть когда будет один элемент  currencies так как он будет считаться как единичный
смотри
Если ТипЗнч(Объект.currencies)= Тип("СписокXDTO");
   ВаликТР
 
13 - 06.02.14 - 15:48
(12) Спасибо за РЕАЛЬНЫЙ код, а не слова. Задача - добавить в <currencies> те самые <currency> с заполненными из справочника реквизитами.

Объект = ФабрикаXDTO.ПрочитатьXML(...);
Пока Выборка.Следующий() Цикл
  элементXML = Объект???.Добавить(!!!);
  элементXML.id = Выборка.Код;
  элементXML.rate = Выборка.Курс;
КонецЦикла;

Что это за искомые буквосочетания (???) и (!!!) ?
   Serginio1
 
14 - 06.02.14 - 16:07
Можно Добавлять так
СтрокаXDTO=ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema";, "decimal"), Выборка.Курс);
    Объект.Добавить(ФормаXML.Элемент, "http://www.w3.org/2001/XMLSchema";, "rate",СтрокаXDTO);
   Serginio1
 
15 - 06.02.14 - 16:11
Можно создавать любой объект из anyType

Объект = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema";, "anyType"));
       ЗначениеАтрибута=ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema";, "string"), "Значение атрибута");

    Объект.Добавить(ФормаXML.Атрибут, "http://www.w3.org/2001/XMLSchema";, "atr",ЗначениеАтрибута);
    СтрокаXDTO=ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema";, "decimal"), 3.14);
Объект.Добавить(ФормаXML.Атрибут, "http://www.w3.org/2001/XMLSchema";, "atr2",ЗначениеАтрибута);    
    
(ФормаXML.Атрибут,"http://www.w3.org/2001/XMLSchema","atr";,ЗначениеАтрибута);

    Объект.Добавить(ФормаXML.Элемент, "http://www.w3.org/2001/XMLSchema";, "elem",ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema";, "string"), "Значение Элемента"));
    СтрокаXDTO=ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema";, "decimal"), 3.14);
    Объект.Добавить(ФормаXML.Элемент, "http://www.w3.org/2001/XMLSchema";, "elem",СтрокаXDTO);

("http://www.w3.org/2001/XMLSchema";, "string"), "Значение элемента"));
    ЗаписьХМЛ= новый ЗаписьXML;
    ЗаписьХМЛ.УстановитьСтроку();
    ФабрикаXDTO.записатьXML(ЗаписьХМЛ,Объект,,,ФормаXML.Элемент,НазначениеТипаXML.Явное);
   Serginio1
 
16 - 06.02.14 - 16:15
А лучше посмотреть в отладчике.
Или схему.
Обчно это делается так
Тип=ФабрикаXDTO.Тип(Пространствоимен, ИмяТипа));
ИмяТипа в твоем случае currency 

элементXML =ФабрикаXDTO.Создать(тип); 

элементXML = Объект???.Добавить(!!!);
  элементXML.id = Выборка.Код;
  элементXML.rate = Выборка.Курс;

Объект.currencies.Добавить(элементXML)
   Serginio1
 
17 - 06.02.14 - 16:18
смотри ссылки v8: Веб сервисы
   ВаликТР
 
18 - 06.02.14 - 17:08
(15) Большое спасибо. Под вашим чутким руководством сдвинулся с мертвой точки. Записал вот так:

Чтение  = Новый ЧтениеXML();

Чтение.ОткрытьФайл("D:\1C\DemoTrd\yandex.xml");
Объект = ФабрикаXDTO.ПрочитатьXML(Чтение);
Чтение.Закрыть();
    
Выборка = Справочники.Валюты.Выбрать();
Пока Выборка.Следующий() Цикл
   СтрокаXDTO = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema";, "string"), Выборка.Код);
   Объект.Добавить(ФормаXML.Элемент, "http://www.w3.org/2001/XMLSchema";, "currency", СтрокаXDTO);    КонецЦикла;

в результате мне добавило вот так...
<yml_catalog xmlns="http://www.w3.org/2001/XMLSchema"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; date="2006-11-30 16:46">
<shop xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema">;
  <currencies>
   <currency id="RUR" rate="1" plus="0"/>
   <currency id="USD" rate="8" plus="0"/>
  </currencies>
 </shop>
 <currency>978</currency>
 <currency>643</currency>
 <currency>840</currency>
</yml_catalog>

а как же его засунуть в <currencies> да еще и в виде атрибутов?
   Serginio1
 
19 - 06.02.14 - 17:22
Объект.Добавить(ФормаXML.Атрибут, "http://www.w3.org/2001/XMLSchema";;, "currency", СтрокаXDTO);

Сделай пакет и создай типы и по нему записывай.
   ВаликТР
 
20 - 06.02.14 - 18:03
(19)
Пока Выборка.Следующий() Цикл
   СтрокаXDTO = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema""; target="_blank" rel="nofollow" class="extralink">http://www.w3.org/2001/XMLSchema";;, "string"), ???);
   Объект.Добавить(ФормаXML.Элемент, "http://www.w3.org/2001/XMLSchema";;, "currency", СтрокаXDTO);
КонецЦикла; 

какое значение вместо ???. Если "", не сделает ли он мне 
<currency id="840"></currency>
вместо 
<currency id="840"/>
   Serginio1
 
21 - 06.02.14 - 18:38
Сделай пакет по ссылкам из v8: Веб сервисы


и Вчастности http://1cprogrammistu.ru/60-sozdanie-web-servisa-v-1s-predpriyatii.html

и используй их.
   Serginio1
 
22 - 06.02.14 - 18:51
Или
ЗначениеАтрибута=ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema";, "string"), "840");


currency=Объект.currencies[n];
currency.Добавить(ФормаXML.Элемент, "http://www.w3.org/2001/XMLSchema";, "id",ЗначениеАтрибута);

Посмотри в отладчике
   Serginio1
 
23 - 06.02.14 - 19:00
Вернее


Объект.currencies.currency[н]
   Serginio1
 
24 - 06.02.14 - 19:12
В общем схема такая

об = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema";, "anyType"));
ЗначениеАтрибута=ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema";, "string"), "840");
об.Добавить(ФормаXML.Атрибут, "http://www.w3.org/2001/XMLSchema";, "id",ЗначениеАтрибута);

Объект.currencies.Добавить(ФормаXML.Элемент, "http://www.w3.org/2001/XMLSchema";, "currency",об);
   medved_kot
 
25 - 06.02.14 - 19:13
ufd
   ВаликТР
 
26 - 07.02.14 - 00:38
(22) (23) (24) ФАНТАСТИКА. Все гениальное - просто. Если есть голова у человека.
Поборол с вашей помощью. Полгода в поисках ... :-) Спасибо большое.

Осталась самая малость
выводится файл

<?xml version="1.0" encoding="UTF-8"?>
<yml_catalog xmlns="http://www.w3.org/2001/XMLSchema"; xmlns:d1p1="http://www.w3.org/2001/XMLSchema"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; d1p1:date="">
    <shop>
        <currencies>
            <d4p1:currency xmlns:d4p1="http://www.w3.org/2001/XMLSchema"; d4p1:id="RUB" d4p1:rate="1" d4p1:plus=""/>
            <d4p1:currency xmlns:d4p1="http://www.w3.org/2001/XMLSchema"; d4p1:id="USD" d4p1:rate="31.0685" d4p1:plus=""/>
            <d4p1:currency xmlns:d4p1="http://www.w3.org/2001/XMLSchema"; d4p1:id="EUR" d4p1:rate="37.8476" d4p1:plus=""/>
        </currencies>
    </shop>
</yml_catalog>

Как избавиться от этих "xmlns", "d4p1", чтоб остались чистые атрибуты? Есть надежда?
   Лодырь
 
27 - 07.02.14 - 04:36
(26) Строго типизировать свойства.
   Serginio1
 
28 - 07.02.14 - 10:28
(26) А зачем? XML будет прекрасно читаться и с этими атрибутами.

Попробуй записывать без пространства имен

currency.Добавить(ФормаXML.Элемент, "", "id",ЗначениеАтрибута);

Кроме того можно управлять префиксами через

ЗаписьXML.ЗаписатьНачалоЭлемента(XMLСтрока("Данные"));
    ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("", "http://v8.1c.ru/8.1/data/enterprise/current-config";);
    ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance";);
    ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xs", "http://www.w3.org/2001/XMLSchema";);
   Serginio1
 
29 - 07.02.14 - 11:38
А вообще можешь напрямую писать в ЗаписьXML


Запись.ЗаписатьНачалоЭлемента("apple");
Запись.ЗаписатьСоответствиеПространстваИмен("nsp", "http://metrics.org";);
Запись.ЗаписатьАтрибут("weight", "http://metrics.org";, "12.5");
Запись.ЗаписатьКонецЭлемента();
   ВаликТР
 
30 - 07.02.14 - 14:54
(28) Вы опять правы.
currency.Добавить(ФормаXML.Элемент, "", "id",ЗначениеАтрибута); 

Все лишнее убралось.

Подскажите, в файле

...
 <categories>
  <category id="00000001">Дисплеи</category>
  <category id="00000002">Матрицы</category>
 </categories>
...

как получить значение "Дисплеи"? Это Свойство ОбъектаXDTO или что? У меня в свойствах "category" не появляется свойство с ФормаXML.Текст? В каком Объекте отладчика можно увидеть Форма:ФормаXML.Текст.
 
 Рекламное место пустует
   Serginio1
 
31 - 07.02.14 - 16:33
Потому, что записывали его без использования фабрики. Это нарушение типов. http://y3x.ru/2012/03/xsd-complex-data-types/
   ВаликТР
 
32 - 07.02.14 - 16:38
(31) А если xml с "Дисплеем" прочитать фабрикой, тогда это свойство будет доступно? И где, каким кодом его можно узнать?
   Serginio1
 
33 - 07.02.14 - 16:46
   ВаликТР
 
34 - 07.02.14 - 17:12
(33) Вы привели пример, как читать XML построчно. Но я имел в виду, если XML следующего содержания
<?xml version="1.0" encoding="windows-1251"?> 
<!DOCTYPE yml_catalog SYSTEM "shops.dtd">
<yml_catalog date="Дата"> 
 <shop>                
  <categories>
   <category id="00000001">Дисплеи</category>
   <category id="00000002">Матрицы</category>
  </categories>
 </shop>                
</yml_catalog>        

прочитать через
Объект = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);

то, напимер id="00000001" получаем так 
Объект.shop.categories.category[0].id

А как у Объекта получить "Дисплеи"?
   Serginio1
 
35 - 07.02.14 - 17:24
Да никакак. С такой записью ты должен обращаться как
Объект.shop.categories.category[0], но он считает что это комплексный тип и не возвращает Дисплеи.
   Serginio1
 
36 - 07.02.14 - 17:35
Вон тут народ до тебя уже извращался v8: XML <!DOCTYPE yml_catalog SYSTEM "shops.dtd">
   ВаликТР
 
37 - 08.02.14 - 13:11
Если можете, подскажите, как добавить в Объект.categories.category сначала Текст потом Атрибут? (35)
   Эмбеддер
 
38 - 08.02.14 - 13:42
(0) так не пойдет

<1C>

    МассивЗаказовПокупателейТип = ФабрикаXDTO.Тип("http://test.ru/Test/Order";, "ArrayOfClientsOrders");
    ЗаказПокупателяТип = ФабрикаXDTO.Тип("http://test.ru/Test/Order";, "ClientsOrder");

...
        ЗаказПокупателя = ФабрикаXDTO.Создать(ЗаказПокупателяТип);
        ЗаказПокупателя.Number = Выборка.Номер;
        ЗаказПокупателя.Date = Выборка.Дата;
        
        ЗаказПокупателяКлиент = ФабрикаXDTO.Создать(КонтрагентТип);
        ЗаказПокупателяКлиент.GUID = Строка(Выборка.Контрагент.УникальныйИдентификатор());
        ЗаказПокупателя.Client = ЗаказПокупателяКлиент;
        
        Для каждого Строка Из Выборка.Ссылка.Товары Цикл
            ЗаказПокупателяСтрока = ФабрикаXDTO.Создать(ЗаказПокупателяСтрокаТип);
            Номенклатура = ФабрикаXDTO.Создать(НоменклатураТип);
            Номенклатура.GUID = Строка.Номенклатура.Код;
            Номенклатура.Code = Строка.Номенклатура.Код;
            Номенклатура.Name = Строка.Номенклатура.Наименование;
            Номенклатура.Price = Строка.Номенклатура.Цена;
            ЗаказПокупателяСтрока.Nomenclature = Номенклатура;
            ЗаказПокупателяСтрока.Quantity = Строка.Количество;
            Номенклатура.Price = Строка.Цена;
            ЗаказПокупателяСтрока.Sum = Строка.Сумма;
            ЗаказПокупателя.Products.Добавить(ЗаказПокупателяСтрока);
        КонецЦикла;

</1C>
   Эмбеддер
 
39 - 08.02.14 - 13:43
? т.е. пройти по исходному файлу и создать новый
   Serginio1
 
40 - 08.02.14 - 22:57
   sapphire
 
41 - 08.02.14 - 23:00
(0) XPath
   Serginio1
 
42 - 09.02.14 - 14:36


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.