Создать функцию и использовать ее.
Заменить SC33 на SC46
Текст обработки;
Запрос=СоздатьОбъект("ODBCRecordSet");
Текст = "
|IF EXISTS(SELECT name FROM sysobjects WHERE name = 'Expand_SC33' AND type = 'TF') DROP FUNCTION Expand_SC33,
|GO
|CREATE FUNCTION Expand_SC33 (@CurID char(9))
|RETURNS @retTbl TABLE ([ID] char(9), [LEVEL] int, [ROW_ID] int IDENTITY(1, 1))
|AS
|BEGIN
|DECLARE @strTbl TABLE (
|[ID] char(9) NOT NULL,
|[LEVEL] int NOT NULL,
|[ROW_ID] int IDENTITY(1, 1) NOT NULL
|)
|DECLARE @level as int
|SET @level = 1
|INSERT INTO @strTbl (id, level) VALUES (@CurID, @level)
|WHILE @level > 0 BEGIN
|IF EXISTS (SELECT * FROM @strTbl WHERE level = @level) BEGIN
|SELECT TOP 1
|@CurID = id
|FROM @strTbl
|WHERE level = @level
|ORDER BY row_id
|INSERT INTO @retTbl (id, level) VALUES(@CurID, @level-1)
|DELETE FROM @strTbl WHERE (level = @level) AND (id = @CurID)
|INSERT INTO @strTbl (id, level)
|SELECT id, @level + 1
|FROM SC33 (NOLOCK)
|WHERE parentid = @CurID AND IsMark = 0 AND SP20816 = 0
|ORDER BY isfolder, descr -- сортировка по наименованию, можно заменить на другое поле
|IF @@ROWCOUNT > 0 SET @level = @level + 1
|END
|ELSE
|SET @level = @level - 1
|END
|RETURN
|END
|GO
|";
Запрос.Отладка(1);
Если Запрос.Открыть(Текст)=0 Тогда
Сообщить(Запрос.ПолучитьОписаниеОшибки (),"");
Возврат;
КонецЕсли;
Запрос.Закрыть();
текст1 = "SELECT
| dTbl.level as Уровень,
| dTbl.id as ID,
| ISNULL(SC.code, '< ... >') as Код,
| (SPACE((dTbl.level-1)*2) + ISNULL(SC.descr, '< ... >')) as Наименование, --чтоб красиво было
| ISNULL(SC.isfolder, 2) as ЭтоГруппа
| FROM
| dbo.Expand_SC33(' 0 ') as dTbl -- выводим все от корня, или можно указать какой-нибудь другой ID
| LEFT JOIN SC33 as SC (NOLOCK) ON SC.id = dTbl.id AND SC.IsMark = 0 AND SC.SP20816 = 0
| WHERE
| dTbl.id != ' 0 '
| AND SC.IsMark = 0 AND SC.SP20816 = 0
| ORDER BY
| dTbl.row_id -- порядок сортировки уже был указан в функции, тут только перестраховка
|";
Если Запрос.Открыть(Текст1)=0 Тогда
Сообщить(Запрос.ПолучитьОписаниеОшибки (),"");
КонецЕсли;
Запрос.УстТипыКолонок1С("Число,Справочник.Товары,Строка");
//получаем результаты
ТОстатков43=СоздатьОбъект("ТаблицаЗначений");
Запрос.ПолучитьРезультатыВ_ТЗ(ТОстатков43,1);
Запрос.Закрыть();