Имя: Пароль:
1C
 
покажите пример работы с XML
0 nitrat
 
28.06.05
11:50
Продемонстрируйте пожалуйста на примере, как выгружать загружать документы определённого типа в XML.
1 Парижская фанера
 
28.06.05
11:52
(0) Может лучше картинку нарисовать, а то вообще комикс?
2 nitrat
 
28.06.05
11:55
(1) да, картинку нарисуй, а потом сотри её
3 GrayT
 
28.06.05
11:55
Выгрузка
//*******************************************
Процедура Сформировать()
   Если ЗагрузитьВнешнююКомпоненту(КаталогИБ() + "v7plus.dll") <> 1 Тогда
       Если ЗагрузитьВнешнююКомпоненту(КаталогПрограммы() + "v7plus.dll") <> 1 Тогда
           Предупреждение("Компонента v7plus.dll не найдена!"); Возврат;
       КонецЕсли;
   КонецЕсли;
   Анализатор = СоздатьОбъект("AddIn.XMLParser");
   //Теперь начнем строить дерево документа. Заодно занесем служебную информацию о файле выгрузки в атрибуты корневого элемента
   
   Корень=Анализатор.СоздатьДокумент();
   Данные =Корень.СоздатьПодчиненныйЭлемент("data");
   Данные.УстановитьАтрибут("base_catalog"    ,КаталогИБ());
   Данные.УстановитьАтрибут("operator"        ,ИмяПользователя());
   
   Документы=Данные.СоздатьПодчиненныйЭлемент("Documents");
   Документы.УстановитьАтрибут("Kind","ПоступлениеМатериалов");

   Док = СоздатьОбъект("Документ.ПоступлениеМатериалов");
   счДок=0;
   Док.ВыбратьДокументы(НачДата, КонДата);    
   Пока Док.ПолучитьДокумент()=1 Цикл
       счДок = счДок+1;
       Документ=Документы.СоздатьПодчиненныйЭлемент("Document");
       Документ.УстановитьАтрибут("DocNum",  Док.НомерДок);
       Документ.УстановитьАтрибут("DocDate", Док.ДатаДок);
       // и т.д. по шапке
       Док.ВыбратьСтроки();
       Пока Док.ПолучитьСтроку()=1 Цикл
           СтрокаДок = Документ.СоздатьПодчиненныйЭлемент("Line");
           СтрокаДок.УстановитьАтрибут("Material", Док.Материал.Наименование); //А потом думай как синхронизироваться
           СтрокаДок.УстановитьАтрибут("Quantity", Док.Количество);
           // и т.д. по табличной части
       КонецЦикла;
   КонецЦикла;
   
   ФайлЭксп = КаталогИБ()+"\Export.xml";
   Если ФС.СуществуетФайл(ФайлЭксп)=1 Тогда
       Если Вопрос("Файл с данными уже существует! Перезаписать?",1,120)<>1 Тогда
           Возврат;
       КонецЕсли;
   КонецЕсли;
   Корень.Записать(ФайлЭксп);
   Сообщить("файл записан: "+ФайлЭксп+" --- выгруженно "+счДок+" документов");    
   Анализатор="";
КонецПроцедуры

Загрузка
//*******************************************
Процедура Сформировать()
   спрМ = СоздатьОбъект("Справочник.Материалы");
   
   Если ЗагрузитьВнешнююКомпоненту(КаталогИБ() + "v7plus.dll") <> 1 Тогда
       Если ЗагрузитьВнешнююКомпоненту(КаталогПрограммы() + "v7plus.dll") <> 1 Тогда
           Предупреждение("Компонента v7plus.dll не найдена!");  Возврат;
       КонецЕсли;
   КонецЕсли;
   Анализатор = СоздатьОбъект("AddIn.XMLParser");

   ФайлИмп = КаталогИБ()+"\Export.xml";    //Найдем нужный файл
   Если ФС.СуществуетФайл(ФайлИмп)=0 Тогда
       Предупреждение("Файл для загрузки в текущем каталоге обмена не найден!");
       Возврат;    
   КонецЕсли;
   
   ФайлДанных=Анализатор.СоздатьДокумент();
   ФайлДанных.Загрузить(ФайлИмп);
   ВсеУзлы=ФайлДанных.ВыбратьУзлы("data");
   
   
   Данные=ВсеУзлы.ПолучитьУзел(0);
   Сообщить("Идет загрузка данных из базы: " +Данные.ПолучитьАтрибут("base_catalog"));
   Сообщить("Выгрузку произвел пользователь: " +Данные.ПолучитьАтрибут("operator"));
   
   Документы=Данные.ВыбратьУзлы("Documents");
   Для счВидовДок = 0 по Документы.КоличествоУзлов-1 Цикл
       ВидДок = Документы.ПолучитьУзел(счВидовДок);
       Док = СоздатьОбъект("Документ."+ВидДок.ПолучитьАтрибут("Kind"));

       Документ = ВидДок.ВыбратьУзлы("Document");
       Для счДок = 0 по Документ.КоличествоУзлов()-1 Цикл
           текДок = Документ.ПолучитьУзел(счДок);                                          
           Док.Новый();                                                                    
           //Гружу в ту-же базу ==> Префикс "Д"(дубль) + Маленькая защита по длине текстового номера
           Док.НомерДок   = "Д"+Сред(Прав("00000000"+СокрЛП(текДок.ПолучитьАтрибут("DocNum")),8),2);
           Док.ДатаДок = текДок.ПолучитьАтрибут("DocDate");
           Док.Записать();
           
           СтрокиДок = текДок.ВыбратьУзлы("Line");
           Для счСтр = 0 по СтрокиДок.КоличествоУзлов()-1 Цикл
               текСтр = СтрокиДок.ПолучитьУзел(счСтр);
               Док.НоваяСтрока();
               Если спрМ.НайтиПоНаименованию(СокрЛП(текСтр.ПолучитьАтрибут("Material")),0,0)=0 Тогда
                   СпрМ.Новый();   //грубо, но для демки нормально - чтоб не загружать код
                   СпрМ.Наименование = текСтр.ПолучитьАтрибут("Material");
                   СпрМ.Записать();
               КонецЕсли;
               Док.Материал   = СпрМ.ТекущийЭлемент();
               Док.Количество = текСтр.ПолучитьАтрибут("Quantity");
           КонецЦикла; //по строкам
           Док.Записать();
       КонецЦикла; //по документам
   КонецЦикла; //по видам документов
   
   Анализатор="";
КонецПроцедуры
4 nitrat
 
28.06.05
11:56
(3) спасибо