И так чем все закончилось!
Запрос по рекурсии оказался хорош только для получения иерархии папок. В этом случае он работает быстро. Также при помощи рекурсивного запроса получил остатки хотя и без него можно обойтись (но пишу как есть переделывать не переделывал), в этом случае выборка также быстро происходит.
Дальше поступил следующим образом, выбрал иерархию папок, выбрал остатки все это в двух одинаковых по структуре таблицах.
Сортируем таблицу папок (иерархия папок) по уровню с убыванием (для того чтобы нижние уровни папок добавлялись первыми и в таблицу остатков с кодами своих родителей) добавление идет по условию кода родителя если код папки найден в столбце "КодРодителя" и не найден в столбце "Код", тогда добавим папку в таблицу остатков. В Результате получаем таблицу остатков с иерархией папок по остаткам, сортируем ее по уровню и признаку группы. Обрабатываем. Скорость в 9-10 раз быстрей если не пользоваться обычным запросом и стандартными функциями преобразования. Собственно все преобразования типов делаем в запросе
сТекстПрямогоЗапросаОстатки = "
|WITH Номенклатура_Иерархия(ID,Code,Descr,ParentID,IsFolder,SP85,SP94,Level) as (
|SELECT
| СпрНоменкл.ID,
| СпрНоменкл.Code,
| СпрНоменкл.Descr,
| СпрНоменкл.ParentID,
| СпрНоменкл.IsFolder,
| СпрНоменкл.SP85,
| СпрНоменкл.SP94,
| 1
|FROM
| $Справочник.Номенклатура СпрНоменкл
|WHERE
| СпрНоменкл.ParentID = $ПустойИД
|UNION ALL
|SELECT
| СпрН.ID,
| СпрН.Code,
| СпрН.Descr,
| СпрН.ParentID,
| СпрН.IsFolder,
| СпрН.SP85,
| СпрН.SP94,
| Level + 1
|FROM
| $Справочник.Номенклатура СпрН
|INNER JOIN
| Номенклатура_Иерархия СпрНИ ON СпрН.ParentID = СпрНИ.ID
|)
|
|SELECT
| СпрНом.ID [Номенклатура $Справочник.Номенклатура],
| RTRIM(CAST(CAST(СпрНом.Code as INT) as CHAR)) Код,
| RTRIM(СпрНом.Descr) Наименование,
| СпрНом.ParentID ИдГруппы,
| RTRIM(CAST(CAST(СпрНомГр.Code as INT) as CHAR)) КодРодителя,
| СпрНом.IsFolder Группа,
| RTRIM(СпрНом.SP85) Артикул,
| RTRIM(СпрЕд.SP80) Штрихкод,
| Level Уровень,
| РегОстатки.КоличествоОстаток Остаток
|FROM
| $РегистрОстатки.ОстаткиТМЦ(:ВыбДата~,,Фирма = :ВыбФирма AND Склад = :ВыбСклад,Номенклатура,Количество) as РегОстатки
|LEFT JOIN
| Номенклатура_Иерархия СпрНом ON СпрНом.ID = РегОстатки.Номенклатура
|LEFT JOIN
| $Справочник.Единицы СпрЕд ON СпрЕд.ID = СпрНом.SP94
|LEFT JOIN
| $Справочник.Номенклатура СпрНомГр ON СпрНомГр.ID = СпрНом.ParentID
|
|";
Запрос выше можно и переделать, но не досуг пока. :)
сТекстПрямогоЗапросаИерархия = "
|WITH Номенклатура_Иерархия(ID,Code,Descr,ParentID,IsFolder,SP85,SP94,Level) as (
|SELECT
| СпрНоменкл.ID,
| СпрНоменкл.Code,
| СпрНоменкл.Descr,
| СпрНоменкл.ParentID,
| СпрНоменкл.IsFolder,
| СпрНоменкл.SP85,
| СпрНоменкл.SP94,
| 1
|FROM
| $Справочник.Номенклатура СпрНоменкл
|WHERE
| СпрНоменкл.ParentID = $ПустойИД
|UNION ALL
|SELECT
| СпрН.ID,
| СпрН.Code,
| СпрН.Descr,
| СпрН.ParentID,
| СпрН.IsFolder,
| СпрН.SP85,
| СпрН.SP94,
| Level + 1
|FROM
| $Справочник.Номенклатура СпрН
|INNER JOIN
| Номенклатура_Иерархия СпрНИ ON СпрН.ParentID = СпрНИ.ID AND СпрН.IsFolder = 1
|)
|
|SELECT
| НомИерарх.ID [Номенклатура $Справочник.Номенклатура],
| RTRIM(CAST(CAST(НомИерарх.Code as INT) as CHAR)) Код,
| RTRIM(НомИерарх.Descr) Наименование,
| НомИерарх.ParentID ИдГруппы,
| RTRIM(CAST(CAST(СпрНомГр.Code as INT) as CHAR)) КодРодителя,
| НомИерарх.IsFolder Группа,
| RTRIM(НомИерарх.SP85) Артикул,
| НомИерарх.SP94 Единица,
| RTRIM(СпрЕд.SP80) Штрихкод,
| Level Уровень,
| 0 Остаток
|FROM
|Номенклатура_Иерархия НомИерарх
|LEFT JOIN
| $Справочник.Единицы СпрЕд ON СпрЕд.ID = НомИерарх.SP94
|LEFT JOIN
| $Справочник.Номенклатура СпрНомГр ON СпрНомГр.ID = НомИерарх.ParentID
|";