Имя: Пароль:
1C
1С v8
Чтение XML
0 Начинающий_13
 
21.07.16
11:04
Здравствуйте
Делаю обмен данными между базами по документам  в разрезе ставок НДС (общая по суммам)
В различных документах номенклатура есть в различных комбинациях по ставками, где то только 20%, где то по 20% и 10% и т.д. При формировании XML  файла идет проверка на наличие значений по суммам, естественно если аналитики и данном разрезе нет, то и выгрузку(не записываю) не делаю этих сумм, они же нолю равны(т.е. нет полей).
Если документ только по 20%, то у него нет полей Summa10, SummaZero
Если документ имеет 20% и 10%, то у него нет полей  SummaZero
При загрузке файла из XML , если каких то полей нет программа выдает ошибку поле допустим SummaZero не обнаружено. Загрузка идет через XDTO.
Поскажите как можно проигнорировать поля при загрузке если их нет в файле.

Часть код

Для Каждого ДокХДТО из СписокXDTODoc Цикл
        
        //Док = Новый Структура("general");
        
        //// Начало general
        //Док.general = Новый Массив;
        Если ТипЗнч(ДокХДТО.general)<> Тип("СписокXDTO")Тогда
            СписокXDTOСостав=Новый Массив;    
            СписокXDTOСостав.Добавить(ДокХДТО.general);
        Иначе
            СписокXDTOСостав = ДокХДТО.general;
        КонецЕсли;
        
        Для каждого СтрокаСостава Из СписокXDTOСостав Цикл
            
            НВС = Объект.СписокДокументов.Добавить();
            //// Данные накладной
            НВС.ДокументСсылка   = СтрокаСостава.DocumentType;
            НВС.КлючСвязи        = СоздатьНовыйКлючСвязиСервер(ЭтаФорма);
            НВС.СуммаВключаетНДС = СтрокаСостава.SummaVklNDS;
            НВС.ДокументНомер    = СокрЛП(СтрокаСостава.DocumentNumber);
            НВС.ДокументДата     = XMLЗначение(Тип("Дата"), СтрокаСостава.DocumentData);
            НВС.Сумма            = XMLЗначение(Тип("Число"),СтрокаСостава.DocumentSumma);
            НВС.СуммаНДС         = XMLЗначение(Тип("Число"),СтрокаСостава.DocumentSummaNDS);
            НВС.Всего            = XMLЗначение(Тип("Число"),СтрокаСостава.DocumentTotal);
            ///// Данные Склада
            НайденныйСклад  = Справочники.Склады.НайтиПоКоду(СокрЛП(СтрокаСостава.SkladCode));
            НВС.Склад       = НайденныйСклад;
            /////// Данные Склада куда
            //НайденныйСкладКуда  = Справочники.Склады.НайтиПоКоду(СокрЛП(СтрокаСостава.SkladCode));
            //НВС.Склад           = НайденныйСкладКуда;
            ///// Данные Контрагента
            НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", СокрЛП(СтрокаСостава.ClientUNP));
            НВС.Контрагент      = НайденныйКонтрагент;
            
            Если СтрокаСостава.StavkaNDS20 = "20" Тогда
                
                НВ = Объект.СписокДокументовАналитика.Добавить();
                
                НВ.КлючСвязи            = НВС.КлючСвязи;
                НайденнаяНоменклатура   = Справочники.Номенклатура.НайтиПоКоду(СокрЛП(СтрокаСостава.TovarCode20));
                НВ.Номенклатура         = НайденнаяНоменклатура;
                мРеквизитыНоменклатуры  = ЗначенияРеквизитовОбъекта(НайденнаяНоменклатура, "СтавкаНДС");
                НВ.СтавкаНДС            = мРеквизитыНоменклатуры.СтавкаНДС;
                НВ.Сумма                = XMLЗначение(Тип("Число"),СтрокаСостава.Summa20);
                НВ.СуммаНДС             = XMLЗначение(Тип("Число"),СтрокаСостава.SummaNDS20);
                НВ.Всего                = XMLЗначение(Тип("Число"),СтрокаСостава.Total20);
            КонецЕсли;
            
    
            Если СтрокаСостава.StavkaNDS10 = "10" Тогда
                
                НВ = Объект.СписокДокументовАналитика.Добавить();
                
                НВ.КлючСвязи            = НВС.КлючСвязи;
                НайденнаяНоменклатура   = Справочники.Номенклатура.НайтиПоКоду(СокрЛП(СтрокаСостава.TovarCode10));
                НВ.Номенклатура         = НайденнаяНоменклатура;
                мРеквизитыНоменклатуры  = ЗначенияРеквизитовОбъекта(НайденнаяНоменклатура, "СтавкаНДС");
                НВ.СтавкаНДС            = мРеквизитыНоменклатуры.СтавкаНДС;
                НВ.Сумма                = XMLЗначение(Тип("Число"),СтрокаСостава.Summa10);
                НВ.СуммаНДС             = XMLЗначение(Тип("Число"),СтрокаСостава.SummaNDS10);
                НВ.Всего                = XMLЗначение(Тип("Число"),СтрокаСостава.Total10);
            КонецЕсли;

            Если СтрокаСостава.StavkaNDSZero = "0" Тогда
                
                НВ = Объект.СписокДокументовАналитика.Добавить();
                
                НВ.КлючСвязи            = НВС.КлючСвязи;
                НайденнаяНоменклатура   = Справочники.Номенклатура.НайтиПоКоду(СокрЛП(СтрокаСостава.TovarCodeZero));
                НВ.Номенклатура         = НайденнаяНоменклатура;
                мРеквизитыНоменклатуры  = ЗначенияРеквизитовОбъекта(НайденнаяНоменклатура, "СтавкаНДС");
                НВ.СтавкаНДС            = мРеквизитыНоменклатуры.СтавкаНДС;
                НВ.Сумма                = XMLЗначение(Тип("Число"),СтрокаСостава.SummaZero);
                //НВ.СуммаНДС             = XMLЗначение(Тип("Число"),СтрокаСостава.SummaNDSZero);
                НВ.СуммаНДС             = СтрокаСостава.SummaNDSZero;
                НВ.Всего                = XMLЗначение(Тип("Число"),СтрокаСостава.TotalZero);
            КонецЕсли;

    

        КонецЦикла;    //// Конец general
                 
    КонецЦикла; //// Конец все объекты ХДТО
1 Tateossian
 
21.07.16
11:07
(0) Надо у свойства XDTO  "SummaZero" и "Summa10" в конфигруаторе поставить "Минимальное количество" 0.
2 Tateossian
 
21.07.16
11:08
+ (1) Разумеется, у нужного пакета XDTO
3 Начинающий_13
 
21.07.16
11:12
У меня нет схемы

ЧтениеХМЛ = Новый ЧтениеXML;
ЧтениеХМЛ .ОткрытьФайл("c:\123.xml");    
РезультатРазборки = Новый Массив;    
ДокументыХДТО = ФабрикаXDTO.ПрочитатьXML(ЧтениеХМЛ);
4 Начинающий_13
 
21.07.16
11:13
Если ТипЗнч(ДокументыХДТО.Doc)<> Тип("СписокXDTO")Тогда
    СписокXDTODoc=Новый Массив;    
    СписокXDTODoc.Добавить(ДокументыХДТО.Doc);
Иначе
    СписокXDTODoc = ДокументыХДТО.Doc;
КонецЕсли;
5 Serginio1
 
21.07.16
11:13
Свойство=ОбъектXDTO.Свойства().получить(ИмяТвоегоСвойства);
Если ОбъектXDTO.Установлено(Свойство) Тогда
6 Начинающий_13
 
21.07.16
11:13
Далее цикл
7 Начинающий_13
 
21.07.16
11:26
В цикле ставить, а то с XDTO первый раз загрузку делаю.
Он загрузил, но вопрос все равно задал от том, что поля нет

Свойство=ДокументыХДТО.Свойства().получить(СтрокаСостава.StavkaNDSbezNDS);
            Если ДокументыХДТО.Установлено(Свойство) Тогда
                    Если СтрокаСостава.StavkaNDSbezNDS = "БезНДС" Тогда
                    
                    НВ = Объект.СписокДокументовАналитика.Добавить();
                    
                    НВ.КлючСвязи            = НВС.КлючСвязи;
                    НайденнаяНоменклатура   = Справочники.Номенклатура.НайтиПоКоду(СокрЛП(СтрокаСостава.TovarCodebezNDS));
                    НВ.Номенклатура         = НайденнаяНоменклатура;
                    мРеквизитыНоменклатуры  = ЗначенияРеквизитовОбъекта(НайденнаяНоменклатура, "СтавкаНДС");
                    НВ.СтавкаНДС            = мРеквизитыНоменклатуры.СтавкаНДС;
                    НВ.Сумма                = XMLЗначение(Тип("Число"),СтрокаСостава.SummabezNDS);
                    //НВ.СуммаНДС             = XMLЗначение(Тип("Число"),СтрокаСостава.SummaNDSbezNDS);
                    НВ.СуммаНДС             = СтрокаСостава.SummaNDSbezNDS;
                    НВ.Всего                = XMLЗначение(Тип("Число"),СтрокаСостава.TotalbezNDS);
                КонецЕсли;
            КонецЕсли;