Имя: Пароль:
1C
 
Обмен посредсвом xml
0 1сПупс
 
11.11.16
10:45
привет!
выгружаю справочник из 1с посредсвом хмл:

&НаСервереБезКонтекста
Процедура Команда1НаСервере()
        //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    контрагенты.Код,
        |    контрагенты.Наименование,
        |    контрагенты.ЭтоГруппа
        |ИЗ
        |    Справочник.контрагенты КАК контрагенты";
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Файл = Новый ЗаписьXML;
    Файл.ОткрытьФайл("E:/1.xml");
    Файл.ЗаписатьОбъявлениеXML();    
    Файл.ЗаписатьНачалоЭлемента("Root");
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        
         Файл.ЗаписатьНачалоЭлемента("Контрагент");
         Файл.ЗаписатьАтрибут("Код", ВыборкаДетальныеЗаписи.Код);
         Файл.ЗаписатьАтрибут("ЭтоГруппа", ?(ВыборкаДетальныеЗаписи.ЭтоГруппа,"1","0"));
         Файл.ЗаписатьТекст(ВыборкаДетальныеЗаписи.Наименование);
         Файл.ЗаписатьКонецЭлемента();
        
    КонецЦикла;
    Файл.ЗаписатьКонецЭлемента();
    //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
    
КонецПроцедуры

&НаКлиенте
Процедура Команда1(Команда)
    Команда1НаСервере();
КонецПроцедуры


Вот загрузка:


&НаСервереБезКонтекста
Процедура Команда1НаСервере()
    
    Файл = Новый ЧтениеXML;
    Файл.ОткрытьФайл("e:\1.xml");
    Пока Файл.Прочитать() Цикл
    
        Если Файл.ТипУзла=ТипУзлаXML.НачалоЭлемента     Тогда
        
            Пока файл.ПрочитатьАтрибут() Цикл
            
                Если файл.Имя = "Код" Тогда
                    Код = файл.Значение;
                ИначеЕсли файл.Имя = "ЭтоГруппа" Тогда        
                    ЭтоГруппа = ?(Файл.Значение="0",Ложь,Истина);
                //ИначеЕсли файл.Имя = "Родитель" Тогда        
                //    Родитель = Файл.Значение;
                КонецЕсли;
            
            КонецЦикла;
            Если ЗначениеЗаполнено(Код) И Не ЗначениеЗаполнено(Справочники.контрагенты.НайтиПоКоду(Код)) Тогда
            
                Если ЭтоГруппа Тогда
                    ЭлементСправочника = Справочники.контрагенты.СоздатьГруппу();
                Иначе
                    ЭлементСправочника = Справочники.контрагенты.СоздатьЭлемент();
                КонецЕсли;
                
                ЭлементСправочника.Код = Код;
                                
                Если Файл.Прочитать() Тогда
                
                    Если Файл.ТипУзла=ТипУзлаXML.Текст Тогда
                    
                        ЭлементСправочника.Наименование = Файл.Значение;
                        ЭлементСправочника.Записать();
                    Иначе
                        Сообщить("ошибка формата!");
                    КонецЕсли;    
                    
                
                КонецЕсли;    
            
            КонецЕсли;
        
        КонецЕсли;
    КонецЦикла;
        
        
        Файл = Новый ЧтениеXML;
        Файл.ОткрытьФайл("e:\1.xml");
        Пока Файл.Прочитать() Цикл
            
            Если Файл.ТипУзла=ТипУзлаXML.НачалоЭлемента     Тогда
                
                Пока файл.ПрочитатьАтрибут() Цикл
                    
                    Если файл.Имя = "Код" Тогда
                        Код = файл.Значение;
                    ИначеЕсли файл.Имя = "Родитель" Тогда        
                           Родитель = Файл.Значение;
                    КонецЕсли;
                КонецЦикла;
                    
                Если ЗначениеЗаполнено(Код) И ЗначениеЗаполнено(Родитель) Тогда
                    Элемент = Справочники.контрагенты.НайтиПоКоду(код);
                    РедактируемыйЭлемент = Элемент.ПолучитьОбъект();
                    РедактируемыйЭлемент.Родитель = Справочники.контрагенты.НайтиПоКоду(Родитель);
                    РедактируемыйЭлемент.Записать();
                КонецЕсли;
            КонецЕсли;
                
        КонецЦикла;
    
    Файл.Закрыть();
    
КонецПроцедуры

&НаКлиенте
Процедура Команда1(Команда)
    Команда1НаСервере();
КонецПроцедуры


как оптимизировать код и не читать 2 раз файл хмл?
1 Cyberhawk
 
11.11.16
10:48
Используй обработку от 1С
2 DrShad
 
11.11.16
10:48
ДокументDOM ваше все
3 1сПупс
 
11.11.16
11:19
спасибо
4 zladenuw
 
11.11.16
11:26
Я бы таблицу спрятал бы в ЗначениеВСтрокуВнутр(<Значение>)  и этот файлик читал бы. Или XDTO
5 Fragster
 
гуру
11.11.16
11:28
При выгрузке -
Запись = ЗаписьXML;
СериализаторXDTO.ЗаписатьXML(Запись, Запрос.Выполнить.Выгрузить);

При Загрузке -

ТЗ = Сериализатор.ПрочитатьXML(Чтение);
6 Fragster
 
гуру
11.11.16
11:28
при этом можно не писать объявление, корень и прочее
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший