четверг, 3 октября 2013 г.

Пример чтения xml из 1с 8.2

1с 8.2 пример чтения xml.

Пример выгрузки в xml 

(код для 1с 7.7 Здесь)

Чтение = Новый ЧтениеXML;
    Чтение.ОткрытьФайл(ИмяФайла);
    Фабрика = ФабрикаXDTO.ПрочитатьXML(Чтение);
    Для каждого стр Из Фабрика.строка Цикл
        Имя = стр.Наименование;
        Код = стр.Код;
        Резерв = Число_(стр.Резерв);
        Остаток = Число_(стр.Факт);
        Свободно = Остаток-Резерв;
        Если ПустаяСтрока(Имя) или ПустаяСтрока(Код) Тогда Продолжить;КонецЕсли;
        Ном = Справочники.Номенклатура.ПустаяСсылка();
        Н = ТзНомКод.НайтиСтроки(Новый Структура("Код",Код));
        Если Н.Количество()=1 Тогда
            Ном = Н[0].Ссылка;
        Иначе
            Если Н.Количество()>1 Тогда
                ТзОш.Добавить().Ош = "Найдено по коду77: "+Код+" "+Строка(Н.Количество())+" элементов; Имя77:"+Имя;
            КонецЕсли;
            Н = ТзНом.НайтиСтроки(Новый Структура("Наименование",Код));
            Если Н.Количество()=1 Тогда
                Ном = Н[0].Ссылка;
            Иначе
                ТзОш.Добавить().Ош = "Найдено по имени77: "+Имя+" "+Строка(Н.Количество())+" элементов (Код:"+Код+")";
            КонецЕсли;
        КонецЕсли;
        Нов = Тз.Добавить();
        Нов.Код77 = Код;
        Нов.Имя77 = Имя;
        Нов.Ном = Ном;
        Нов.Остаток = Остаток;
        Нов.Резерв = Резерв;
        Нов.Свободно = Свободно;
    КонецЦикла;

Вот еще вариант, но он хуже:

МинУровень=0;
    НачалоЭлемента=Ложь;
    Хмл = новый ЧтениеXML;
    Хмл.ОткрытьФайл(Файл);   
    пока Хмл.Прочитать() Цикл

        ИмяУзла = Хмл.Имя;
        ТипУзла = Хмл.ТипУзла;       
        Если НРег(ИмяУзла)="элементы" Тогда
            Если ТипУзла=ТипУзлаXML.НачалоЭлемента Тогда
                МинУровень=Хмл.ПолучитьАтрибут("МинУровень");
            КонецЕсли;
        КонецЕсли;
        Если НРег(ИмяУзла)="элемент" Тогда
            Если ТипУзла=ТипУзлаXML.НачалоЭлемента Тогда
                НачалоЭлемента=Истина;
                Имя = СокрЛП(Хмл.ПолучитьАтрибут("Имя"));
                ИмяП = СокрЛП(Хмл.ПолучитьАтрибут("ИмяП"));
                ИмяР = СокрЛП(Хмл.ПолучитьАтрибут("ИмяР"));
                ЭтоГруппа_ = Хмл.ПолучитьАтрибут("ЭтоГруппа");
                ЭтоГруппа = ?(ЭтоГруппа_="1",Истина,Ложь);
                Уровень = Хмл.ПолучитьАтрибут("Уровень");
                                   
                Родитель = Справочники.Номенклатура.ПустаяСсылка();               
                Если Уровень=МинУровень Тогда
                    Родитель = Группа;
                Иначе
                    Если не ПустаяСтрока(ИмяР) Тогда
                        Родитель = ПолучитьР(ИмяР);
                    КонецЕсли;
                КонецЕсли;
                               
                НайденнаяНом = ПолучитьНом(Имя,Родитель,ЭтоГруппа);
                Если НайденнаяНом=Неопределено Тогда
                    НачалоЭлемента=Ложь;
                    Продолжить;                   
                КонецЕсли;
                Если НайденнаяНом.Пустая() Тогда
                    Если ЭтоГруппа Тогда
                        Об = Справочники.Номенклатура.СоздатьГруппу();
                    Иначе
                        Об = Справочники.Номенклатура.СоздатьЭлемент();
                    КонецЕсли;
                Иначе
                    Об = НайденнаяНом.ПолучитьОбъект();
                КонецЕсли;               
               
                Об.Наименование = Имя;
                Об.Родитель=Родитель;
                Если ЭтоГруппа Тогда
                    Об.Записать();
                    НачалоЭлемента=Ложь;
                    Продолжить;
                КонецЕсли;
                Об.Артикул = Хмл.ПолучитьАтрибут("Артикул");
               
                Если не ПустаяСтрока(ИмяП) Тогда
                    Об.НаименованиеПолное = ИмяП;
                Иначе
                    Об.НаименованиеПолное = Имя;
                КонецЕсли;
               
                ВидНом_ = СокрЛП(Хмл.ПолучитьАтрибут("ВидНом"));
                Если ВидНом_="Товары" Тогда
                    ВидНом_="Товар";
                КонецЕсли;
               
                Об.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоНаименованию(ВидНом_,Истина);
                Если об.ВидНоменклатуры.Пустая() Тогда Сообщить("Не нашли вид номенклатуры по наимн.:"+ВидНом_);КонецЕсли;
               
                Еи_ = Хмл.ПолучитьАтрибут("Еи");
                ЕиКл = Справочники.КлассификаторЕдиницИзмерения.НайтиПоКоду(Еи_);
                Если ЕиКл.Пустая() Тогда
                    Сообщить("Не нашли ЕИ в классификаторе ЕИ по коду:"+Еи_);
                Иначе
                    Об.БазоваяЕдиницаИзмерения = ЕиКл;
                КонецЕсли;
               
                СтНдс_ = Хмл.ПолучитьАтрибут("СтНдс");
                Если не ПустаяСтрока(СтНдс_) Тогда
                    Если СтНдс_="10" Тогда
                        Об.СтавкаНДС=Перечисления.СтавкиНДС.НДС10;
                    КонецЕсли;
                    Если СтНдс_="18" Тогда
                        Об.СтавкаНДС=Перечисления.СтавкиНДС.НДС18;
                    КонецЕсли;
                    Если СтНдс_="0" Тогда
                        Об.СтавкаНДС=Перечисления.СтавкиНДС.БезНДС;
                    КонецЕсли;
                КонецЕсли;
               
                Попытка
                    Об.Записать();
                Исключение
                    Сообщить(ОписаниеОшибки());
                    НачалоЭлемента=Ложь;
                    Продолжить;
                КонецПопытки;
               
                НашлиЕи=Ложь;
                выбокаЕи = Справочники.ЕдиницыИзмерения.Выбрать(,Об.Ссылка);
                Пока выбокаЕи.Следующий() Цикл
                    Если выбокаЕи.ЕдиницаПоКлассификатору=Об.БазоваяЕдиницаИзмерения Тогда
                        НашлиЕи=Истина;
                    КонецЕсли;
                КонецЦикла;
               
                Если не НашлиЕи Тогда
                    ВесСтр = Хмл.ПолучитьАтрибут("ВесНетто");
                   
                    Вес = Число_(ВесСтр);
                                       
                    Длина = Число_(Хмл.ПолучитьАтрибут("Длина"))/100;
                    Ширина = Число_(Хмл.ПолучитьАтрибут("Ширина"))/100;
                    Высота = Число_(Хмл.ПолучитьАтрибут("Высота"))/100;
                   
                   
                    НовЕи = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
                    НовЕи.Наименование = Об.БазоваяЕдиницаИзмерения.Наименование;
                    НовЕи.Владелец = Об.ссылка;
                    НовЕи.Коэффициент = 1;
                    НовЕи.ЕдиницаПоКлассификатору = Об.БазоваяЕдиницаИзмерения;
                    НовЕи.Вес = Вес;
                    НовЕи.Объем = Длина*Ширина*Высота;
                    НовЕи.Записать();
                    Об.ЕдиницаХраненияОстатков = НовЕи.Ссылка;
                    Об.ЕдиницаДляОтчетов = НовЕи.Ссылка;
                    Попытка
                        Об.Записать();
                    Исключение
                        Сообщить(ОписаниеОшибки());
                        НачалоЭлемента=Ложь;                       
                    КонецПопытки;
                КонецЕсли;
               
                для Каждого стр из Свойства Цикл
                    Св77 = Хмл.ПолучитьАтрибут(стр.Ключ);
                    СвСтр = стр.Значение;
                    Св = ПолучитьСв(СвСтр);
                    Если Св=Неопределено Тогда
                        Продолжить;
                    КонецЕсли;
                   
                    _З = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьМенеджерЗаписи();
                    _З.Объект = Об.ССылка;
                    _З.Свойство = Св;
                    Если Св.ТипЗначения=новый описаниетипов("число") или НРег(строка(Св.ТипЗначения)) = "число" Тогда
                        _З.Значение = число(Св77);
                    ИначеЕсли Св.ТипЗначения=новый описаниетипов("булево") Тогда
                        _З.Значение = ?(Св77="1",Истина,Ложь);//строка
                    ИначеЕсли Св.ТипЗначения=новый описаниетипов("строка") Тогда
                        _З.Значение = Св77;
                    Иначе
                        _З.Значение = Св77;
                        Сообщить("Не отработанный тип:"+СвСтр);
                    КонецЕсли;
                    Попытка
                        _З.Записать();
                    Исключение
                        Сообщить(ОписаниеОшибки());
                    КонецПопытки;
                КонецЦикла;
               
            ИначеЕсли ТипУзла=ТипУзлаXML.КонецЭлемента Тогда
                НачалоЭлемента=Ложь;
            КонецЕсли;       
        ИначеЕсли НРег(ИмяУзла)="шк" Тогда
            Если ТипУзла=ТипУзлаXML.НачалоЭлемента и НачалоЭлемента Тогда
                Шк = Хмл.ПолучитьАтрибут("ШкСтр");
                Если не ПустаяСтрока(Шк) Тогда
                    ТекЗапись = РегистрыСведений.Штрихкоды.СоздатьМенеджерЗаписи();
       
                    ТекЗапись.Владелец         = Об.Ссылка;
                    ТекЗапись.ЕдиницаИзмерения = Об.ЕдиницаХраненияОстатков;
                    ТекЗапись.ТипШтрихкода     = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13;
                    ТекЗапись.Качество         = Справочники.Качество.Новый;
                    ТекЗапись.Штрихкод         = Шк;
                   
                    Попытка
                        ТекЗапись.Записать();
                    Исключение
                        Сообщить(ОписаниеОшибки());
                    КонецПопытки;
                КонецЕсли;
            КонецЕсли;       
        ИначеЕсли НРег(ИмяУзла)="цены" Тогда
            Если ТипУзла=ТипУзлаXML.НачалоЭлемента и НачалоЭлемента Тогда
                ТцСтр = Хмл.ПолучитьАтрибут("ТипЦены");
                Если ТцСтр = "Основная цена (без налогов)" Тогда
                    ТцСтр = "Основная цена (без налого";
                КонецЕсли;
                ТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию(ТцСтр,Истина);
                Если ТипЦен.Пустая() Тогда
                    Сообщить("Не нашли тип цен по наименованию:"+Хмл.ПолучитьАтрибут("ТипЦены"));
                КонецЕсли;
                Нов = ТзЦен.Добавить();
                Нов.ссылка = Об.Ссылка;
                Нов.цена = Число(Хмл.ПолучитьАтрибут("Цена"));
                Нов.ТипЦен = ТипЦен;
            КонецЕсли;
        ИначеЕсли НРег(ИмяУзла)="норма" Тогда
            Если ТипУзла=ТипУзлаXML.НачалоЭлемента и НачалоЭлемента Тогда
                Состояние("Получаем нормы...");
                НайденныйТзНорм = ТзНорм.Найти(Об.Ссылка,"Номенклат");
                Если НайденныйТзНорм<>Неопределено Тогда
                    Нормы = НайденныйТзНорм.Нормы;
                Иначе
                    НовТзНорм = ТзНорм.Добавить();
                    НовТзНорм.Номенклат = Об.Ссылка;
                   
                    Нормы = Новый ТаблицаЗначений;
                    Нормы.Колонки.Добавить("Ном");
                    Нормы.Колонки.Добавить("Норма");
                    Нормы.Колонки.Добавить("КолПрод");
                   
                    НовТзНорм.Нормы = Нормы;
                КонецЕсли;
                ИмяНоменклат = Хмл.ПолучитьАтрибут("Номенклат");
                Номенклат = ПолучитьНом(ИмяНоменклат,Справочники.Номенклатура.ПустаяСсылка(),Ложь);
                Если Номенклат = Неопределено Тогда
                    Продолжить;
                КонецЕсли;
                Если Номенклат.Пустая() Тогда
                    Продолжить;
                КонецЕсли;
                НовНормы = Нормы.Добавить();
                НовНормы.Ном = Номенклат;
                НовНормы.Норма = число(Хмл.ПолучитьАтрибут("Норм"));
                НовНормы.КолПрод = число(Хмл.ПолучитьАтрибут("КолПрод"));
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;