// вспомогательная к ПрочитатьТабДокументСГруппировкамиВДерево
Процедура ЗаполнитьДеревоПоТаблицеРекурсивно(рРодитель,ТаблицаДанных)
Для каждого рВетка Из рРодитель.Строки Цикл
ЗаполнитьДеревоПоТаблицеРекурсивно(рВетка,ТаблицаДанных);
мстро=ТаблицаДанных.НайтиСтроки(Новый Структура("НомерПозицииРодителя",рВетка.НомерПозицииНачала));
Для каждого стро Из мстро Цикл
ЗаполнитьЗначенияСвойств(рВетка.Строки.Добавить(),стро);
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Функция ПрочитатьТабДокументСГруппировкамиВДерево(ТабДок,мИмёнКолонок) Экспорт
Попытка
ТаблицаДанных=Новый ТаблицаЗначений;
ТаблицаДанных.Колонки.Добавить("НомерПозицииРодителя",Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(10,0,ДопустимыйЗнак.Любой))); // у старших - 0, у родителей -1
ДеревоДанных=Новый ДеревоЗначений;
ДеревоДанных.Колонки.Добавить("НомерПозицииНачала",Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(10,0,ДопустимыйЗнак.Неотрицательный))); // у старших - 0
ДеревоДанных.Колонки.Добавить("НомерПозицииКонца",Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(10,0,ДопустимыйЗнак.Неотрицательный))); // у старших - 0
Для каждого знч Из мИмёнКолонок Цикл
// тип у них у всех строковый
ТаблицаДанных.Колонки.Добавить(знч.Имя);
ДеревоДанных.Колонки.Добавить(знч.Имя);
КонецЦикла;
Для к=1 По ТабДок.ВысотаТаблицы Цикл
стро=ТаблицаДанных.Добавить();
Для каждого Кол Из мИмёнКолонок Цикл
стро[Кол.Имя]=СокрЛП(ТабДок.Область(к,Кол.Столбец,к,Кол.Столбец).Текст);
КонецЦикла;
КонецЦикла;
Если ТаблицаДанных.Количество()=0 Тогда
Возврат ДеревоДанных;
КонецЕсли;
Путь = ПолучитьИмяВременногоФайла("xml");
рЗапись=Новый ЗаписьXML;
рЗапись.УстановитьСтроку("UTF-8");
СериализаторXDTO.ЗаписатьXML(рЗапись,ТабДок);
рЧтение=Новый ЧтениеXML;
рЧтение.УстановитьСтроку(рЗапись.Закрыть());
пострДом=Новый ПостроительDOM;
докдом=пострДом.Прочитать(рЧтение);
мУзловГрупп=докдом.ПолучитьЭлементыПоИмени("vg");
Для Каждого ЭлементПартнер Из мУзловГрупп[0].ДочерниеУзлы Цикл
Название = ЭлементПартнер.ТекстовоеСодержимое;
Для Каждого ЭлементКонтрагент Из ЭлементПартнер.ДочерниеУзлы Цикл
Конт = ЭлементКонтрагент.ТекстовоеСодержимое;
Для Каждого ЭлементБанк Из ЭлементКонтрагент.ДочерниеУзлы Цикл
Банк = ЭлементБанк.ТекстовоеСодержимое;
КонецЦикла;
КонецЦикла;
КонецЦикла;
Для каждого рУзелГруппы Из мУзловГрупп Цикл
рНачало=0; рКонец=0;
Для каждого рПодузел Из рУзелГруппы.ДочерниеУзлы Цикл
Если рПодузел.ИмяУзла="b" Тогда
рНачало=Число(СокрЛП(рПодузел.ТекстовоеСодержимое));
ИначеЕсли рПодузел.ИмяУзла="e" Тогда
рКонец=Число(СокрЛП(рПодузел.ТекстовоеСодержимое));
КонецЕсли;
КонецЦикла;
Если рНачало=0 Тогда Продолжить КонецЕсли;
Если рКонец=0 Тогда рКонец=рНачало КонецЕсли; // одна позиция в подгруппе
рКонец=рКонец+1; // обязательная поправка
// первому не ставим указание, он и есть родитель
рВеткаГруппы = Неопределено;
Для Каждого Ветка Из ДеревоДанных.Строки Цикл
//рВеткаГруппы=ДеревоДанных.Строки.Найти(рНачало-Поиск,"НомерПозиции",Истина); // ищем родителя этого родителя
Если Ветка.НомерПозицииНачала <= рНачало И Ветка.НомерПозицииКонца >= рКонец+1 Тогда
рВеткаГруппы = Ветка;
Прервать;
КонецЕсли;
КонецЦикла;
Если рВеткаГруппы=Неопределено Тогда
рВеткаГруппы=ДеревоДанных
КонецЕсли;
рВеткаДанных=рВеткаГруппы.Строки.Добавить();
ЗаполнитьЗначенияСвойств(рВеткаДанных,ТаблицаДанных[рНачало-1]);
рВеткаДанных.НомерПозицииНачала=рНачало; // именно так
рВеткаДанных.НомерПозицииКонца=рКонец+1; // именно так
ТаблицаДанных[рНачало-1].НомерПозицииРодителя=-1;
// ставим в таблицу
Для н=рНачало+1 По рКонец Цикл
ТаблицаДанных[н-1].НомерПозицииРодителя=рНачало;
КонецЦикла;
КонецЦикла;
ТаблицаДанных.Индексы.Добавить("НомерПозицииРодителя");
ЗаполнитьДеревоПоТаблицеРекурсивно(ДеревоДанных,ТаблицаДанных);
ДеревоДанных.Колонки.Удалить("НомерПозицииНачала");
ДеревоДанных.Колонки.Удалить("НомерПозицииКонца");
Возврат ДеревоДанных;
Исключение
Сообщить("ПрочитатьТабДокументСГруппировкамиВДерево, ошибка: "+ОписаниеОшибки(),СтатусСообщения.Важное);
Возврат Неопределено;
КонецПопытки;
КонецФункции |