Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема ТаблицаЗначений. Уровень вложенности. (число прочтений - 3783 )
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
ТаблицаЗначений. Уровень вложенности.
19. Апреля 2007 :: 14:10
Печать  
В общем делаю что-то типа графа подчинённости документа. Сначала попробывал поюзать майкрософтовское дерево. Всё получилось, делал примерно вот так:
Код
Выбрать все
Процедура Сформировать(Корень, ТекДок)
	Док = СоздатьОбъект("Документ");
	Док.ВыбратьПодчиненныеДокументы(,,ТекДок);

	Пока Док.ПолучитьДокумент() = 1 Цикл
		Ключ=Ключ+1;	  
		Узел=Дерево.Объект.Nodes.Add(Корень,4, Строка(Док)+Ключ ,Строка(Док));
		Узел.Tag=ЗначениеВСтрокуВнутр(Док.ТекущийДокумент());
		Если ТекУровеньВложенности<УровеньВложенности Тогда
			ТекУровеньВложенности=ТекУровеньВложенности+1;
			Сформировать(Узел, Док);
		КонецЕсли;
	КонецЦикла;

	ТекУровеньВложенности = ТекУровеньВложенности - 1;
КонецПроцедуры  


"УровеньВложенности" - переменная в которой хранится уровень, до которого надо опускаться при построении дерева подчинённости.
Но из-за ограниченности майкрософтовского дерева, решил использовать дерево АЛьФа. Но теперь я не пойму как рекурсивно добовлять узлы.

Создал такую ТЗ:
Код
Выбрать все
ФДеревоТЗ.НоваяКолонка("Ветка", "ТаблицаЗначений");
	ФДеревоТЗ.НоваяКолонка("Картинка");
	ФДеревоТЗ.НоваяКолонка("НазваниеВетки",,,,"Документ");
	ФДеревоТЗ.НоваяКолонка("НомерПолиса");
	СтруктураТЗ = ЗначениеВСтрокуВнутр(ФДеревоТЗ); 


Я понимаю, что можно писать примерно так:
Код
Выбрать все
ФДеревоТЗ.Ветка.Ветка =  //для второго уровня
ФДеревоТЗ.Ветка.Ветка.Ветка =  //для третьего уровня
.... 


Но как это засунуть в рекурсию? Помогите сообразить...
  
Наверх
 
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ТаблицаЗначений. Уровень вложенности.
Ответ #1 - 19. Апреля 2007 :: 14:20
Печать  
Посмотри в респозитарии "граф подчиненнисти документов".
  
Наверх
IP записан
 
noprogrammer
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 465
Зарегистрирован: 16. Июня 2006
Re: ТаблицаЗначений. Уровень вложенности.
Ответ #2 - 19. Апреля 2007 :: 14:22
Печать  
Код
Выбрать все
Функция НайтиКорень(Док)
	мдДок=Метаданные.Документ(Док.Вид()); КореньДок="";
	Для ъ=1 По мдДок.РеквизитШапки() Цикл
		текОбъект=Док.ПолучитьАтрибут(мдДок.РеквизитШапки(ъ));
		Если (ТипЗначенияСтр(текОбъект)="Документ") И (ПустоеЗначение(текОбъект)=0) Тогда
			//*** Если Метаданные.Документ(текОбъект.Вид()).Синоним="Служебный документ" Тогда Продолжить; КонецЕсли; //Заглушка
			Если ВыбДокумент=текОбъект Тогда Продолжить; КонецЕсли; КореньДок=текОбъект; Прервать;
		КонецЕсли;
	КонецЦикла;
	Возврат ?(ПустоеЗначение(КореньДок)=1, Док, НайтиКорень(КореньДок));
КонецФункции
//--------------------------------------------

Процедура СформироватьДеревоПодчиненныхДокументов(тзДерево, Док)
	ДокПодч=СоздатьОбъект("Документ");
	Если ДокПодч.ВыбратьПодчиненныеДокументы(,, Док)=0 Тогда Возврат; КонецЕсли;
	Пока ДокПодч.ПолучитьДокумент()=1 Цикл
		текДок=ДокПодч.ТекущийДокумент();

		тзДерево.НоваяСтрока();
		тзДерево.Пиктограмма=ПолучитьПиктограммуДоумента(текДок);
		тзДерево.Док=текДок;
		тзДерево.Представление=ПредставлениеДокумента(текДок);
		тзДерево.тзВетка=_Новый("ТаблицаЗначений");
		тзДерево.тзВетка.Загрузить(тзДеревоПодчиненностиШаблон);
		тзДеревоПодчиненности.ВидимостьКолонки("Док", 0);

		СформироватьДеревоПодчиненныхДокументов(тзДерево.тзВетка, текДок);
	КонецЦикла;
КонецПроцедуры
//--------------------------------------------

Процедура тзДеревоПодчиненности_ВыполнитьДействие(стрДействие)
	Если стрДействие="Обновить" Тогда
		Если ВыбДокумент.Выбран()=0 Тогда Возврат; КонецЕсли;
		КореньДок=НайтиКорень(ВыбДокумент);

		тзДеревоПодчиненности.УдалитьСтроки();
		тзДеревоПодчиненности.НоваяСтрока();
		тзДеревоПодчиненности.Пиктограмма=ПолучитьПиктограммуДоумента(КореньДок);
		тзДеревоПодчиненности.Док=КореньДок;
		тзДеревоПодчиненности.Представление=ПредставлениеДокумента(КореньДок);
		тзДеревоПодчиненности.тзВетка=_Новый("ТаблицаЗначений");
		тзДеревоПодчиненности.тзВетка.Загрузить(тзДеревоПодчиненностиШаблон);
		тзДеревоПодчиненности.ВидимостьКолонки("Док", 0);

		СформироватьДеревоПодчиненныхДокументов(тзДеревоПодчиненности.тзВетка, КореньДок);

		дзДеревоПодчиненности.ОбновитьДерево();
	КонецЕсли;
КонецПроцедуры
//--------------------------------------------

тзДеревоПодчиненности.НоваяКолонка("тзВетка", "ТаблицаЗначений");
тзДеревоПодчиненности.НоваяКолонка("Пиктограмма", "Число",,, "", 4);
тзДеревоПодчиненности.НоваяКолонка("Представление", "Строка",,, "Документ", 30);
тзДеревоПодчиненности.НоваяКолонка("Док", "Документ",,, "Документ 1", 100);
тзДеревоПодчиненности.ВидимостьКолонки("Док", 0);

тзДеревоПодчиненностиШаблон=_Новый("ТаблицаЗначений");
тзДеревоПодчиненностиШаблон.Загрузить(тзДеревоПодчиненности);
 



если я правильно понял конечно...
  
Наверх
wwwICQ  
IP записан
 
noprogrammer
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 465
Зарегистрирован: 16. Июня 2006
Re: ТаблицаЗначений. Уровень вложенности.
Ответ #3 - 19. Апреля 2007 :: 14:23
Печать  
а вообще (trdm) прав, в репозитарие уже есть готовое решение...
  
Наверх
wwwICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ТаблицаЗначений. Уровень вложенности.
Ответ #4 - 19. Апреля 2007 :: 14:24
Печать  
trdm писал(а) 19. Апреля 2007 :: 14:20:
Посмотри в респозитарии "граф подчиненнисти документов".

Если там, где прямыми запросами, то там сделано через объект "таблица", а мне надо "реальное" дерево.
  
Наверх
 
IP записан
 
noprogrammer
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 465
Зарегистрирован: 16. Июня 2006
Re: ТаблицаЗначений. Уровень вложенности.
Ответ #5 - 19. Апреля 2007 :: 14:28
Печать  
JohnyDeath писал(а) 19. Апреля 2007 :: 14:24:
trdm писал(а) 19. Апреля 2007 :: 14:20:
Посмотри в респозитарии "граф подчиненнисти документов".

Если там, где прямыми запросами, то там сделано через объект "таблица", а мне надо "реальное" дерево.


(JohnyDeath) вечерком могу скинуть пример, если интересно. (выдерну из конфыПодмигивание)
  
Наверх
wwwICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ТаблицаЗначений. Уровень вложенности.
Ответ #6 - 19. Апреля 2007 :: 14:29
Печать  
noprogrammer писал(а) 19. Апреля 2007 :: 14:28:
JohnyDeath писал(а) 19. Апреля 2007 :: 14:24:
trdm писал(а) 19. Апреля 2007 :: 14:20:
Посмотри в респозитарии "граф подчиненнисти документов".

Если там, где прямыми запросами, то там сделано через объект "таблица", а мне надо "реальное" дерево.


(JohnyDeath) вечерком могу скинуть пример, если интересно. (выдерну из конфыПодмигивание)

Буду благодарен.
А что за функция "_Новый"?
  
Наверх
 
IP записан
 
noprogrammer
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 465
Зарегистрирован: 16. Июня 2006
Re: ТаблицаЗначений. Уровень вложенности.
Ответ #7 - 19. Апреля 2007 :: 17:51
Печать  
JohnyDeath писал(а) 19. Апреля 2007 :: 14:29:
noprogrammer писал(а) 19. Апреля 2007 :: 14:28:
JohnyDeath писал(а) 19. Апреля 2007 :: 14:24:
trdm писал(а) 19. Апреля 2007 :: 14:20:
Посмотри в респозитарии "граф подчиненнисти документов".

Если там, где прямыми запросами, то там сделано через объект "таблица", а мне надо "реальное" дерево.


(JohnyDeath) вечерком могу скинуть пример, если интересно. (выдерну из конфыПодмигивание)

Буду благодарен.
А что за функция "_Новый"?



Смотри вложение, там и про функцию "_Новый" есть Улыбка
  

drevo.rar ( 10 KB | Загрузки )
Наверх
wwwICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ТаблицаЗначений. Уровень вложенности.
Ответ #8 - 20. Апреля 2007 :: 05:55
Печать  
noprogrammer писал(а) 19. Апреля 2007 :: 17:51:
JohnyDeath писал(а) 19. Апреля 2007 :: 14:29:
noprogrammer писал(а) 19. Апреля 2007 :: 14:28:
JohnyDeath писал(а) 19. Апреля 2007 :: 14:24:
trdm писал(а) 19. Апреля 2007 :: 14:20:
Посмотри в респозитарии "граф подчиненнисти документов".

Если там, где прямыми запросами, то там сделано через объект "таблица", а мне надо "реальное" дерево.


(JohnyDeath) вечерком могу скинуть пример, если интересно. (выдерну из конфыПодмигивание)

Буду благодарен.
А что за функция "_Новый"?



Смотри вложение, там и про функцию "_Новый" есть Улыбка

Спасибо!
Вчера, наверное, был вечерний тупняк. При создании графа в дереве от MS, я в рекурсивную процедуру передавал текущий узел, а вот чё-т в случае с ТЗ тормознул... оказывается всё просто - передавай "тзДерево.тзВетка"  Смущённый
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать