|
Как добавить элемент в Объект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
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |