vandalsvq писал(а) 12. Июня 2012 :: 07:46:А строить дерево по мере прохождения пользователя по нему не вариант? Скажем отображаешь первый уровень, пытается развернуть считываешь далее и т.д.
будет дольше. Я же стою иерархию по реквизиту справочника объекты скидок "Номенклатура". соответственно придется перечитывать данные каждый раз.
Вот запрос на иерархию номенклатуры
текстЗапроса = "
|WITH Номенклатура_Иерархия(ID,CODE,ParentID,IsFolder,Level) as (
|SELECT
| СпрНоменкл.ID,
| СпрНоменкл.CODE,
| СпрНоменкл.ParentID,
| СпрНоменкл.IsFolder,
| 1
|FROM
| $Справочник.Номенклатура СпрНоменкл
|WHERE
| СпрНоменкл.ParentID = $ПустойИД
|UNION ALL
|SELECT
| СпрН.ID,
| СпрН.CODE,
| СпрН.ParentID,
| СпрН.IsFolder,
| Level + 1
|FROM
| $Справочник.Номенклатура СпрН
|INNER JOIN
| Номенклатура_Иерархия СпрНИ ON СпрН.ParentID = СпрНИ.ID AND СпрН.IsFolder = 1
|)
|
|SELECT
| НомИерарх.ID [Номенклатура $Справочник.Номенклатура],
| НомИерарх.CODE Код,
| НомИерарх.ParentID [ИдГруппы $Справочник.Номенклатура],
| НомИерарх.IsFolder Группа,
| НомИерарх.Level Уровень
|FROM
| Номенклатура_Иерархия НомИерарх
|";
Вот запрос на выборку данных из объектов скидок.
текстЗапроса = "
|WITH Номенклатура_Иерархия(ID,CODE,ParentID,IsFolder,Level) as (
|SELECT
| СпрНоменкл.ID,
| СпрНоменкл.CODE,
| СпрНоменкл.ParentID,
| СпрНоменкл.IsFolder,
| 1
|FROM
| $Справочник.Номенклатура СпрНоменкл
|WHERE
| СпрНоменкл.ParentID = $ПустойИД
|UNION ALL
|SELECT
| СпрН.ID,
| СпрН.CODE,
| СпрН.ParentID,
| СпрН.IsFolder,
| Level + 1
|FROM
| $Справочник.Номенклатура СпрН
|INNER JOIN
| Номенклатура_Иерархия СпрНИ ON СпрН.ParentID = СпрНИ.ID
|)
|
|SELECT
| $ОбъектыСкидок.Ставка [Ставка $Справочник.сфСтавкиСкидок],
| $ОбъектыСкидок.Условие [Условие $Справочник.сфУсловия],
| НомИерарх.ID [Номенклатура $Справочник.Номенклатура],
| НомИерарх.CODE Код,
| НомИерарх.ParentID [ИдГруппы $Справочник.Номенклатура],
| НомИерарх.IsFolder Группа,
| НомИерарх.Level Уровень,
| 1 ВОбъекте
|FROM
| $Справочник.сфОбъектыСкидок ОбъектыСкидок
|LEFT JOIN
| Номенклатура_Иерархия НомИерарх ON НомИерарх.ID = $ОбъектыСкидок.Номенклатура
|WHERE
| ОбъектыСкидок.parentext = :Владелец AND ОбъектыСкидок.ismark = 0
|";
Как видно во втором запросе приходится выбирать всю номенклатуру, для получения уровней.
после этого я соединяю таблицы вот так
итГруппыНоменклатуры.Сортировать("-Уровень");
итГруппыНоменклатуры.ВыбратьСтроки();
Пока итГруппыНоменклатуры.ПолучитьСтроку() = 1 Цикл
Если а,,1) <> 0)
и тура,,1) = 0)) Тогда
итЭлементыНоменклатуры.НоваяСтрока();
итЭлементыНоменклатуры.Код = итГруппыНоменклатуры.Код;
итЭлементыНоменклатуры.Номенклатура = итГруппыНоменклатуры.Номенклатура;
итЭлементыНоменклатуры.ИдГруппы = итГруппыНоменклатуры.ИдГруппы;
итЭлементыНоменклатуры.Группа = итГруппыНоменклатуры.Группа;
итЭлементыНоменклатуры.Уровень = итГруппыНоменклатуры.Уровень;
итЭлементыНоменклатуры.ВОбъекте = 0;
КонецЕсли;
КонецЦикла;
что позволяет мне получить полное дерево, но открытие формы происходит секунды 3. да и запрос второй выбирает больше 20000 элементов чтоб выстроить иерархию для 200 элементов. Хочется оптимизировать запросы.