Имя: Пароль:
1C
 
Читаю XML с помощью ФабрикаXDTO ошибка Итератор для значения не определен
0 Shur1cIT
 
16.06.16
14:23
вот ХМЛ
http://s018.radikal.ru/i526/1606/74/535e3e83d62b.jpg
Если <Расход> несколько то цикл отрабатывает если один как в примере имеем ошибку "Итератор для значения не определен"
В крадце код
ЧтениеXML.ОткрытьФайл(Стр.ПолноеИмя);
АвансовыеОтчеты = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
        ИД               = АвансовыеОтчеты.АвансовыйОтчет.ИД;
        ВыданаяСумма     = АвансовыеОтчеты.АвансовыйОтчет.ВыданаСумма;
        НачалоПериода    = АвансовыеОтчеты.АвансовыйОтчет.НачалоПериода;
        ОкончаниеПериода = АвансовыеОтчеты.АвансовыйОтчет.ОкончаниеПериода;
        ФИОСотрудника    = АвансовыеОтчеты.АвансовыйОтчет.ФИОСотрудника;

Расход = АвансовыеОтчеты.АвансовыйОтчет.Расходы.Расход;

Для каждого СтрРасход Из Расход Цикл
                СтрДок = ДокОбъект.Прочее.Добавить();
                НомерДокумента = СтрРасход.НомерДокумента;
                ТипРасхода     = СтрРасход.ТипРасхода;
                СуммаРасхода   = СтрРасход.СуммаРасхода;
                ДатаТрат       = СтрРасход.ДатаТрат;
КонецЦикла
1 AceVi
 
16.06.16
14:31
(0) Может потому что нет открывающего тега Расходы?
2 Shur1cIT
 
16.06.16
14:33
(1) есть он на 11 строчке,где отражаеться не важно весь хмл можно в одной строке писать
3 ovrfox
 
16.06.16
14:33
Но нет закрывающего тега "Расход"
4 ovrfox
 
16.06.16
14:35
Хотя в теории он не нужен, если внутри только атрибуты.
Но проверить не помешает
5 Beretta
 
16.06.16
14:35
В крадце - у тибя апьекд нетипизирован. Паэтому она ни панимает чта там паследаваетльность или адин илемент
6 Shur1cIT
 
16.06.16
14:38
(5) а как указать принудительно что последовательность? или проще проверку писать? если одна запись тогда без цикла читаем если несколько то цикл, если бы мой код акромя меня не вид я бы так и сделал, но перед людьми не удобно го..но код показывать
7 Shur1cIT
 
16.06.16
14:41
(4) я на валидность XML проверял ошибок нет
8 ovrfox
 
16.06.16
14:41
У тебя "расходы" - один тег, а "Расход" несколько
Если хотел обойти все теги расход - цикл делай по тегу "Расходы"
9 Shur1cIT
 
16.06.16
14:52
(8) это как?
Расход = АвансовыеОтчеты.АвансовыйОтчет.Расходы

даёт ошибку
10 Beretta
 
16.06.16
14:53
(6) Описать тип для фабрики XDTO. В типе указать, что элемент встречается один или больше раз. При чтении объекта использовать нужную фабрику с указанием типа того, что читаешь. В результате всегда будешь получишь коллекцию с минимум одним элементом.
11 Shur1cIT
 
16.06.16
15:03
(10) вопрос, а как сие сделать? сылки на пример можно? гугл выдаёт очень сложные вещи)))
12 Shur1cIT
 
16.06.16
15:18
(10) тоесть необходимо Расход присвоить тип СписокXDTO принудительно, вопрос как это сделать?
13 totparen
 
16.06.16
15:53
(10)

До освоения пакета ХДТО, делал так:

    СтрокиФайлаХДТО = ФайлХДТО.receivingAdvice.lineItems.lineItem;
    
    ИндексСтроки = 0;
    КрутитьЦикл = Истина;
    
    Пока КрутитьЦикл Цикл
        Если ТипЗнч(СтрокиФайлаХДТО) = Тип("ОбъектXDTO")Тогда
            СтрокаФайла = СтрокиФайлаХДТО;
            КрутитьЦикл = Ложь;
        ИначеЕсли ТипЗнч(СтрокиФайлаХДТО) = Тип("СписокXDTO")Тогда
            Если (ИндексСтроки+1) = СтрокиФайлаХДТО.Количество() Тогда
                КрутитьЦикл = Ложь;
            КонецЕсли;
            СтрокаФайла = СтрокиФайлаХДТО.Получить(ИндексСтроки);
            ИндексСтроки = ИндексСтроки + 1;
        КонецЕсли;
14 Serginio1
 
16.06.16
15:58
Сделай
ЧтениеXML.ОткрытьФайл(Стр.ПолноеИмя);
ЧтениеXML.ПерейтиКСодержимому();
15 Serginio1
 
16.06.16
16:01
16 Shur1cIT
 
16.06.16
16:10
(13) да уже так и сделал(
17 Fragster
 
гуру
16.06.16
16:15
(6) сделать схему, грузить по ней. заодно числа превратятся в числа и даты в даты (если они в правильном формате)
18 Serginio1
 
16.06.16
16:40
(16) Значит грузишь не по схеме.
Тогда определяется как AnyType и элемент с одним элементом считается как ОбъектXDTO а не СписокXDTO
19 Serginio1
 
16.06.16
16:47
Проверяй на
Расходы=АвансовыеОтчеты.АвансовыйОтчет.Расходы.Расход;
Если ТипЗнч(Расходы) = Тип("СписокXDTO") Тогда


Иначе
СтрРасход=Расходы;
СтрДок = ДокОбъект.Прочее.Добавить();
                НомерДокумента = СтрРасход.НомерДокумента;
                ТипРасхода     = СтрРасход.ТипРасхода;
                СуммаРасхода   = СтрРасход.СуммаРасхода;
                ДатаТрат       = СтрРасход.ДатаТрат;

КонецЕсли