Имя: Пароль:
1C
1С v8
Как добавить элемент в ОбъектXDTO
0 ВаликТР
 
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 перебирая справочник Валют.
Если можно привести код - буду признателен.
1 zladenuw
 
03.02.14
23:50
типа так.

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

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

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

Что это за искомые буквосочетания (???) и (!!!) ?
14 Serginio1
 
06.02.14
16:07
Можно Добавлять так
СтрокаXDTO=ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema";, "decimal"), Выборка.Курс);
    Объект.Добавить(ФормаXML.Элемент, "http://www.w3.org/2001/XMLSchema";, "rate",СтрокаXDTO);
15 Serginio1
 
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.Явное);
16 Serginio1
 
06.02.14
16:15
А лучше посмотреть в отладчике.
Или схему.
Обчно это делается так
Тип=ФабрикаXDTO.Тип(Пространствоимен, ИмяТипа));
ИмяТипа в твоем случае currency

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

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

Объект.currencies.Добавить(элементXML)
17 Serginio1
 
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> да еще и в виде атрибутов?
19 Serginio1
 
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"/>
21 Serginio1
 
06.02.14
18:38
Сделай пакет по ссылкам из v8: Веб сервисы

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

и используй их.
22 Serginio1
 
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",ЗначениеАтрибута);

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


Объект.currencies.currency[н]
24 Serginio1
 
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",об);
25 medved_kot
 
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) Строго типизировать свойства.
28 Serginio1
 
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";);
29 Serginio1
 
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.Текст.
31 Serginio1
 
07.02.14
16:33
Потому, что записывали его без использования фабрики. Это нарушение типов. http://y3x.ru/2012/03/xsd-complex-data-types/
32 ВаликТР
 
07.02.14
16:38
(31) А если xml с "Дисплеем" прочитать фабрикой, тогда это свойство будет доступно? И где, каким кодом его можно узнать?
33 Serginio1
 
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

А как у Объекта получить "Дисплеи"?
35 Serginio1
 
07.02.14
17:24
Да никакак. С такой записью ты должен обращаться как
Объект.shop.categories.category[0], но он считает что это комплексный тип и не возвращает Дисплеи.
36 Serginio1
 
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
? т.е. пройти по исходному файлу и создать новый
40 Serginio1
 
08.02.14
22:57
41 sapphire
 
08.02.14
23:00
(0) XPath
42 Serginio1
 
09.02.14
14:36
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn