Как вариант могу предложить, получение остатков с иерархией по ТМЦ:
[code] Запрос = СоздатьОбъект("ODBCRecordSet"); СтркУслТМЦ=""; Если ВыбТМЦ.РазмерСписка()<>0 Тогда СтркУслТМЦ="AND ТМЦ IN (SELECT Val FROM #ГруппаТ_П)"; Запрос.УложитьСписокОбъектов(ВыбТМЦ, "#ГруппаТ_П", "ТМЦ"); КонецЕсли; СтркУслСклад=""; Если ВыбСклады.РазмерСписка()<>0 Тогда СтркУслСклад="AND Склад IN (SELECT Val FROM #ГруппаС_П) "; Запрос.УложитьСписокОбъектов(ВыбСклады, "#ГруппаС_П", "Склады"); КонецЕсли; Запрос.УстановитьТекстовыйПараметр("ВыбФирма", ПолучитьПустоеЗначение("Справочник.Фирмы"));
ТекстЗапросаП = " |SELECT | Рег.Склад [Склад $Справочник.Склады] |, nz.ID [ТМЦ $Справочник.ТМЦ] |, CASE when nz.ID = n1.ID then Рег.Партия else NULL end [Партия $Справочник.Партии] |, SUM(Рег.КвоОстаток) КвоКонОст |, SUM(Рег.СуммаОснОстаток) СуммаОснКонОст |, MAX(CASE | when nz.ID = n5.ID then LTrim(n5.Code) | when nz.ID = n4.ID AND n5.ID is not null then LTrim(n5.Code)+'/'+LTrim(n4.Code) | when nz.ID = n4.ID AND n5.ID is null then LTrim(n4.Code) | when nz.ID = n3.ID AND n5.ID is not null then LTrim(n5.Code)+'/'+LTrim(n4.Code)+'/'+LTrim(n3.Code) | when nz.ID = n3.ID AND n5.ID is null AND n4.ID is not null then LTrim(n4.Code)+'/'+LTrim(n3.Code) | when nz.ID = n3.ID AND n5.ID is null AND n4.ID is null then LTrim(n3.Code) | when nz.ID = n2.ID AND n5.ID is not null then LTrim(n5.Code)+'/'+LTrim(n4.Code)+'/'+LTrim(n3.Code)+'/'+LTrim(n2.Code) | when nz.ID = n2.ID AND n5.ID is null AND n4.ID is not null then LTrim(n4.Code)+'/'+LTrim(n3.Code)+'/'+LTrim(n2.Code) | when nz.ID = n2.ID AND n5.ID is null AND n4.ID is null AND n3.ID is not null then LTrim(n3.Code)+'/'+LTrim(n2.Code) | when nz.ID = n2.ID AND n5.ID is null AND n4.ID is null AND n3.ID is null then LTrim(n2.Code) | when nz.ID = n1.ID AND n5.ID is not null then m(n1.Code) | when nz.ID = n1.ID AND n5.ID is null AND n4.ID is not null then LTrim(n4.Code)+'/'+LTrim(n3.Code)+'/'+LTrim(n2.Code)+'/'+LTrim(n1.Code) | when nz.ID = n1.ID AND n5.ID is null AND n4.ID is null AND n3.ID is not null then LTrim(n3.Code)+'/'+LTrim(n2.Code)+'/'+LTrim(n1.Code) | when nz.ID = n1.ID AND n5.ID is null AND n4.ID is null AND n3.ID is null AND n2.ID is not null then LTrim(n2.Code)+'/'+LTrim(n1.Code) | when nz.ID = n1.ID AND n5.ID is null AND n4.ID is null AND n3.ID is null AND n2.ID is null then LTrim(n1.Code) | else '--' |end) as ПКод //полный код |FROM | $РегистрОстатки.Остатки(,, | Фирма = :ВыбФирма "+СтркУслСклад+СтркУслТМЦ+", | (Фирма,ТМЦ,Склад,Партия), (Кво, СуммаОсн)) as Рег |LEFT join $Справочник.ТМЦ as n1 on n1.ID = Рег.ТМЦ |LEFT join $Справочник.ТМЦ as n2 on n2.ID = n1.ParentID |LEFT join $Справочник.ТМЦ as n3 on n3.ID = n2.ParentID |LEFT join $Справочник.ТМЦ as n4 on n4.ID = n3.ParentID |LEFT join $Справочник.ТМЦ as n5 on n5.ID = n4.ParentID |LEFT join $Справочник.ТМЦ as nz on (nz.ID = n1.ID OR nz.ID = n2.ID OR nz.ID = n3.ID OR nz.ID = n4.ID OR nz.ID = n5.ID) |GROUP BY Рег.Склад, nz.ID , CASE when nz.ID = n1.ID then Рег.Партия else NULL end |ORDER BY 1, 6 |";[/code]
прошу совета, можно ли зделать проще и/или быстрее
|