Делай проще
используй ИТЗ
Перем Дерево;
Перем Структура;
//*******************************************
Процедура Сформировать()
Текст="
|select
|Остатки.Склад [Склад $Спр],
|Остатки.ДатаВозврата ДатаВозврата,
|Остатки.ПрихДок [ПрихДок $Док],
|Остатки.Заказчик [Заказчик $Спр.Сотрудники],
|Остатки.Товар [Товар $Спр.ТМЦ],
|Остатки.Остаток Остаток
|from
|(select
|Рег.МестоХранения Склад,
|$Прих.ДатаВозврата ДатаВозврата,
|Рег.Товар Товар,
|Рег.ПрихДокумент ПрихДок,
|$Строки.Заказчик Заказчик,
|Рег.ОстатокТовараОстаток Остаток
|from ихДокумент),ОстатокТовара) Рег
|inner join $Документ.Т_ПриходнаяНакладнаяУпр Прих (nolock) on Прих.iddoc=right(Рег.ПрихДокумент,9)
|inner join $ДокументСтроки.Т_ПриходнаяНакладнаяУпр Строки (nolock) on Строки.iddoc=right(Рег.ПрихДокумент,9) and $Строки.Товар=Рег.Товар
|union all
|select
|Рег1.МестоХранения Склад,
|$Прих1.ДатаВозврата ДатаВозврата,
|Рег1.Товар Товар,
|Рег1.ПрихДокумент ПрихДок,
|$Строки1.Заказчик Заказчик,
|Рег1.ОстатокТовараОстаток Остаток
|from ихДокумент),ОстатокТовара) Рег1
|inner join $Документ.Т_ПриходнаяНакладная Прих1 (nolock) on Прих1.iddoc=right(Рег1.ПрихДокумент,9)
|inner join $ДокументСтроки.Т_ПриходнаяНакладная Строки1 (nolock) on Строки1.iddoc=right(Рег1.ПрихДокумент,9) and $Строки1.Товар=Рег1.Товар
|) Остатки
|where
|convert(char(10),Остатки.ДатаВозврата,104)<>'01.01.1753'
|and Остатки.ДатаВозврата <= cast(:ВыбДата as datetime)
|";
Запрос=глСоединение();
Запрос.УстановитьТекстовыйПараметр("ВыбДата",ДатаКон);
Запрос.УстановитьТекстовыйПараметр("ВыбФирма",ВыбФирма);
ИТЗ=СоздатьОбъект("ИндексированнаяТаблица");
Запрос.ВыполнитьИнструкцию(Текст,ИТЗ);
ИТЗ.Группировать("Склад:Склад;ПрихДок:ПрихДок","Остаток",1);
ИТЗ.ВыбратьСтроки();
ТЗ_Дерево.УдалитьСтроки();
Пока ИТЗ.ПолучитьСтроку() = 1 Цикл
Склад=ИТЗ.Склад;
ТЗ_Дерево.НоваяСтрока();
ТЗ_Дерево.Имя=Склад;
ТЗ_Дерево.Остаток=ИТЗ.Остаток;
ТЗ_Дерево.Ветка=ЗначениеИзСтрокиВнутр(Структура);
Если ИТЗ.НомерКолонки("тзПотомки")>0 Тогда
лВетка=ТЗ_Дерево.Ветка;
тзДоки=ИТЗ.тзПотомки;
тзДоки.ВыбратьСтроки();
Пока тзДоки.ПолучитьСтроку()=1 Цикл
лВетка.НоваяСтрока();
лВетка.Имя=тзДоки.ПрихДок;
лВетка.ДатаВозврата=тзДоки.ДатаВозврата;
лВетка.Ветка=ЗначениеИзСтрокиВнутр(Структура);
Если тзДоки.НомерКолонки("тзПотомки")>0 Тогда
тзТовары=тзДоки.тзПотомки;
лВетка1=лВетка.Ветка;
тзТовары.ВыбратьСтроки();
Пока тзТовары.ПолучитьСтроку()=1 Цикл
лВетка1.НоваяСтрока();
лВетка1.Имя=тзТовары.Товар;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Дерево.ОбновитьДерево();
КонецПроцедуры
Процедура ПослеОткрытия()
Дерево=СоздатьОбъект("АтрибутФормы");
Дерево.УстановитьАтрибут(Форма,"ТЗ_Дерево");
Дерево.ПерехватитьТаблицуЗначений();
КонецПроцедуры // ПослеОткрытия
Процедура ПриОткрытии()
ТЗ_Дерево.НоваяКолонка("Ветка");
ТЗ_Дерево.НоваяКолонка("Значек");
ТЗ_Дерево.НоваяКолонка("Имя");
ТЗ_Дерево.НоваяКолонка("ДатаВозврата","Дата",,,,10);
ТЗ_Дерево.НоваяКолонка("Остаток","Число",19,3,,10);
Структура=ЗначениеВСтрокуВнутр(ТЗ_Дерево);
КонецПроцедуры // ПриОткрытии
ДатаКон=ПолучитьДатуТА();
делел на скорую руку без рекусии.
ну думаю сам дальше разберешся