Вход | Регистрация


Обмен посредсвом xml

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

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

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

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует