Не получается чето с оптимизацией

справочник ОпцииАвто подчинен справочнику Автомобили.
так же, из справочника ОпцииАвто есть ссылка на справочник "Опции" (ОпцииАвто.Опция)
нужно выбирать элементы справочника ОпцииАвто только корневые (верхние группы и корневые элементы)
исходный код 1С (для выбранного элемента спр.Автомобили - Авто):
Акция = Авто.Акция;
ОпцииАвто = СоздатьОбъект("Справочник.ОпцииАвто");
ОпцииАвто.ИспользоватьВладельца(Авто);
ОпцииАвто.ВыбратьЭлементы();
ЦенаА = 0;
Если Акция = 0 Тогда
ЦенаА = Авто.Цена;
Пока ОпцииАвто.ПолучитьЭлемент() = 1 Цикл
Если ОпцииАвто.Опция.Базовый = 1 Тогда Продолжить КонецЕсли;
Если ОпцииАвто.Уровень()<>1 Тогда Продолжить КонецЕсли;
ЦенаА = ЦенаА + ОпцииАвто.Цена;
КонецЦикла;
Возврат ЦенаА;
Иначе
ЦенаА = ?(Авто.ЦенаПоАкции > 0,Авто.ЦенаПоАкции,Авто.Цена);
Пока ОпцииАвто.ПолучитьЭлемент() = 1 Цикл
Если ОпцииАвто.Опция.Базовый = 1 Тогда Продолжить КонецЕсли;
Если ОпцииАвто.Уровень()<>1 Тогда Продолжить КонецЕсли;
ЦенаА = ЦенаА + ?(ОпцииАвто.ЦенаПоАкции>0,ОпцииАвто.ЦенаПоАкции,ОпцииАвто.Цена);
КонецЦикла;
Возврат ЦенаА;
КонецЕсли;
/////
я написал следующее:
СЗАвто - Список занчений, в котором элементы справочниука Автомобили
ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("Авто");
ТЗ.НоваяКолонка("СуммаБаза","Число");
ТЗ.НоваяКолонка("СуммаОпций","Число");
RS = СоздатьОбъект("ODBCRecordset");
ТЗЦен = СоздатьОбъект("ТаблицаЗначений");
ТекстЗапроса = "
|SELECT Автомобили.ID [Авто $Справочник.Автомобили]
| , ОпцииАвто.ID [Опция $Справочник.ОпцииАвто]
| , ($ОпцииАвто.Цена) ОпцииЦена
| , ($ОпцииАвто.ЦенаПоАкции) ОпцииЦенаПоАкции
| , ($Автомобили.Цена) Цена
| , ($Автомобили.ЦенаПоАкции) ЦенаПоАкции
|FROM $Справочник.Автомобили AS Автомобили
| INNER JOIN $Справочник.ОпцииАвто AS ОпцииАвто ON Автомобили.ID = ОпцииАвто.PARENTEXT
| INNER JOIN $Справочник.Опции AS Опции ON $ОпцииАвто.Опция = Опции.ID
|WHERE ($Опции.Базовый = $ПустойИд)
| AND (Автомобили.ID IN (SELECT val FROM #СЗАвто))
| AND ($ОпцииАвто.Цена <> $ПустойИд)
|GROUP BY Автомобили.ID
| , ОпцииАвто.ID
| , $ОпцииАвто.Цена
| , $ОпцииАвто.ЦенаПоАкции
| , $Автомобили.Цена
| , $Автомобили.ЦенаПоАкции
|";
RS.УложитьСписокОбъектов(СЗАвто, "#СЗАвто","Автомобили");
ТЗЦен = RS.ВыполнитьИнструкцию(ТекстЗапроса);
ТЗЦен.ВыбратьСтроки();
Пока ТЗЦен.ПолучитьСтроку() = 1 Цикл
стр=0;
Если ТЗ.НайтиЗначение(ТЗЦен.Авто,стр,"Авто")=1 Тогда
ТЗ.ПолучитьСтрокуПоНомеру(стр);
Иначе
ТЗ.НоваяСтрока();
ТЗ.Авто = ТЗЦен.Авто;
ТЗ.СуммаБаза = ен.Цена),ТЗЦен.Цена);
КонецЕсли;
Если ТЗЦен.Опция.Уровень()=1 Тогда
ТЗ.СуммаОпций = ТЗ.СуммаОпций + оАкции,ТЗЦен.ОпцииЦена),ТЗЦен.ОпцииЦена);
КонецЕсли;
КонецЦикла;
////////
собсно проблемы по скорости с функцией Уровень(), да и ваще, можно как нить написать запрос, чтобы потом не обрабатывать уже полученную выборку?