Имя: Пароль:
1C
1С v8
XML фильтр
0 МикаМ
 
21.01.13
14:38
Люди добрые, подскажите плиз, кто сталкивался - а то уже третий день мозги пухнут.....

Есть XML файл с выгрузкой остатков и документов... Там где идут ссылки на записи регистров в файле через фильтр указывается какому документу принадлежит эта запись.....

Примерно вот так:

<AccumulationRegisterRecordSet.ТоварыОрганизаций>
 <Filter>
   <Recorder xsi:type="DocumentRef.КорректировкаЗаписейРегистров">a4d26e9a-5c8b-11e2-9d9e-00e04d815445</Recorder>
 </Filter>
 <Records/>
 </AccumulationRegisterRecordSet.ТоварыОрганизаций>

А теперь собственно сам вопрос - как сделать фильтрацию по конкретному документу при чтении информации из файла или хотя бы при чтении записи подглядеть какой у нее документ в фильтре???
1 МикаМ
 
21.01.13
14:42
Читаю файл вот так...

Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ПолеИмениФайла);

Пока ВозможностьЧтенияXML(Чтение) Цикл
       
Типус=Чтение.ЛокальноеИмя;

Если Типус="AccumulationRegisterRecordSet.ПартииТоваровНаСкладах" Тогда
// и вот в этот момент нужно знать значение фильтра
//

   ТекСкл="";
           ТтЗ=ЗаписанноеЗначение.Выгрузить();
           Для Каждого СтрокаИсходнойТаблицы Из ТтЗ Цикл
               НоваяСтрока = ТЗ.Добавить();
               ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаИсходнойТаблицы);
           КонецЦикла;
   КонецЕсли;    
КонецЦикла;
Чтение.Закрыть();
2 МикаМ
 
21.01.13
14:50
Совсем никаких вариантов??? :(
3 vmv
 
21.01.13
14:59
я так делал для консолидации персонификации из филиалов для Украины в 8.1, но не столь важно для какой задачи

// Методы обработки XML, грузим хмл-файл в свое Дз

Процедура ЧитатьXML(ИмяФайлаЧтение, РодительскаяСтрокаXML)
   
   // очистим дерево
   РодительскаяСтрокаXML.Строки.Очистить();
   
   XML = Новый ЧтениеXML();
   XML.ОткрытьФайл(ИмяФайлаЧтение);
   
   текСтрока = РодительскаяСтрокаXML.Строки.Добавить();
   ЗаполнитьЗначенияСвойств(текСтрока, РодительскаяСтрокаXML);
   текСтрока.Параметр = ИмяФайлаЧтение;
   СтрокиДерева = текСтрока.Строки;
   
   Пока XML.Прочитать() Цикл
       Если XML.ТипУзла = ТипУзлаXML.Текст Тогда
           // текст элемента, может быть только после начала элемента
           // в ТекСтрока сейчас должен быть узел
           текСтрока.Значение = XML.Значение;
       ИначеЕсли XML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
           СтрокиДерева = ДобавитьУзел(СтрокиДерева, XML, РодительскаяСтрокаXML);
       ИначеЕсли XML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
           // установим родителя
           Если СтрокиДерева.Родитель.Родитель = Неопределено Тогда
               // нет узла верхнего уровня
               СтрокиДерева = СтрокиДерева.Родитель.Строки;
           Иначе
               СтрокиДерева = СтрокиДерева.Родитель.Родитель.Строки;
           КонецЕсли;
       КонецЕсли;

       Пока XML.ПрочитатьАтрибут() Цикл
           текСтрока = СтрокиДерева.Добавить();
           ЗаполнитьЗначенияСвойств(текСтрока, РодительскаяСтрокаXML);
           текСтрока.Параметр = XML.Имя;
           текСтрока.Значение = XML.Значение;
           а=1;
       КонецЦикла;

   КонецЦикла;
   XML.Закрыть();
   //Дерево = Новый ХранилищеЗначения(ДеревоXML);
   
КонецПроцедуры

Функция ДобавитьУзел(СтрокиДерева, XML, РодительскаяСтрокаXML)
   текСтрока = СтрокиДерева.Добавить();
   ЗаполнитьЗначенияСвойств(текСтрока, РодительскаяСтрокаXML);

далее выборки из своего Дз

Отбор = Новый Структура;
               Отбор.Вставить("ПолноеИмя", ТекПуть + "\XML\" + ИмяТаблицыPFZ);
               Отбор.Вставить("Параметр" , "PAY_TP");
               Отбор.Вставить("Значение" , СтрокТзТипыНачислений.ТипНачисления);
                             
               мНайденныеСтроки = ЭтаФорма.ДеревоФайлов.Строки.НайтиСтроки(Отбор, Истина);
               
               Если мНайденныеСтроки.Количество() = 0 Тогда
                   Продолжить;
               КонецЕсли;
   
               Для Н = 0 По мНайденныеСтроки.ВГраница()  Цикл
                   мНайденныеСтроки[Н] = мНайденныеСтроки[Н].Родитель;
               КонецЦикла;
....

Отбор = Новый Структура;
           Отбор.Вставить("ПолноеИмя", ТекПуть + "\XML\" + ИмяТаблицыPFZ);
           Отбор.Вставить("Параметр" , "ROW");
           
           мНайденныеСтроки = ЭтаФорма.ДеревоФайлов.Строки.НайтиСтроки(Отбор, Истина);
           
           Если мНайденныеСтроки.Количество() = 0 Тогда
               Продолжить;
           КонецЕсли;
.....

и т.д.
   текСтрока.Параметр = XML.Имя;
   Возврат текСтрока.Строки;
КонецФункции
4 vmv
 
21.01.13
15:02
Функция ДобавитьУзел(СтрокиДерева, XML, РодительскаяСтрокаXML)
   текСтрока = СтрокиДерева.Добавить();
   ЗаполнитьЗначенияСвойств(текСтрока, РодительскаяСтрокаXML);
   текСтрока.Параметр = XML.Имя;
   Возврат текСтрока.Строки;
КонецФункции

оборвалось, юзай
5 МикаМ
 
21.01.13
15:09
Угу - по идее так должно взять, но это не через фильтр - очень затянет время обработки... Должен же существовать способ попроще...
6 МикаМ
 
21.01.13
15:10
не зря же там этот фильтр стоит, значит можно как-то к нему подобраться...
7 МикаМ
 
22.01.13
12:11
Не получается по предложенному варианту.... :( Может у кого-то еще будут идеи, ну хоть одна?
8 МикаМ
 
22.01.13
12:12
Может как-то через xdto можно? я им просто ни разу не пользовался...
9 МикаМ
 
23.01.13
15:03
Вроде разобрался - если кому-то будет нужно, то 1с этот фильтр - при выгрузке в таблицу значений - выгружает как поле "регистратор"... Откуда его и можно вытащить...
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn