Вот пример. Правда так и не получилось запихнуть в подзарос (виртуальную таблицу) все даты - поэтому пришлось извратиться с временной таблицей:
НачДата = '01.01.2006';
КонДата = '30.09.2006';
глODBCRecordset.Отладка(1);
глODBCRecordset.ВыполнитьСкалярный("
|IF EXISTS (SELECT * from tempdb..sysobjects where id = object_id('tempdb..#ТабИт'))
|DROP TABLE #ТабИт");
глODBCRecordset.УстановитьТекстовыйПараметр("НачДата",НачДата);
глODBCRecordset.УстановитьТекстовыйПараметр("КонДата",КонДата);
Текст = "
|
|SELECT
| Рег.Клиент as Клиент,
| Рег.Период AS Период,
| Рег.СуммаГРННачальныйОстаток as СуммаГРННачальныйОстаток,
| Рег.СуммаГРНПриход as СуммаГРНПриход,
| Рег.СуммаГРНРасход as СуммаГРНРасход,
| Рег.СуммаГРНКонечныйОстаток as СуммаГРНКонечныйОстаток
|INTO #ТабИт
|FROM
| $РегистрОстаткиОбороты.Взаиморасчеты(:НачДата, :КонДата~, День, ДвиженияИГраницыПериода,
| ,,
| (Клиент), (СуммаГРН)) as Рег
|";
глODBCRecordset.ВыполнитьСкалярный(Текст);
Текст = "
|Declare @PERIODN Char(8)
|Declare @PERIODK Char(23)
|SET @PERIODN = '"+глMDW.ПолучитьСтрИзДаты(НачДата)+"' -- Начало периода
|SET @PERIODK = '"+глMDW.ПолучитьСтрИзДаты(КонДата)+"' -- Конец периода
|
|IF EXISTS (SELECT * from tempdb..sysobjects where id = object_id('tempdb..#Клиенты_Дата'))
|DROP TABLE #Клиенты_Дата
|
|SELECT ТабКл.Клиент, ТабД.Дата
|INTO #Клиенты_Дата
|FROM (SELECT DISTINCT Клиент FROM #ТабИт) AS ТабКл,
|(select A.date AS Дата
|from (select date = cast((b.number * 0x100) + a.number as datetime)
|from master..spt_values a
|join master..spt_values b
| on (b.number * 0x100) + a.number <= cast(cast(@PERIODK as datetime) as integer)
| and (b.number * 0x100) + a.number >= cast(cast(@PERIODN as datetime) as integer)
|where
| a.type = 'p'
| and b.type = 'p'
| and b.number * 0x100 <= cast(cast(@PERIODK as datetime) as integer)
|) as A
|--order by A.date
|) AS ТабД";
глODBCRecordset.ВыполнитьСкалярный(Текст);
Текст = "
|SELECT
| T.Клиент AS [Клиент $Справочник.Клиенты],
| T.Дата AS Дата,
| SUM(ISNULL(T.СуммаГРННачальныйОстаток,0)) AS СуммаГРННачальныйОстаток,
| SUM(ISNULL(T.СуммаГРНПриход,0)),
| SUM(ISNULL(T.СуммаГРНРасход,0)),
| SUM(ISNULL(T.СуммаГРНКонечныйОстаток,0))
|FROM(
| SELECT
| ПолнТаб.Клиент,
| ПолнТаб.Дата,
| CASE WHEN ТабДан.СуммаГРННачальныйОстаток IS NOT NULL THEN ТабДан.СуммаГРННачальныйОстаток ELSE
| (SELECT Таб2.СуммаГРННачальныйОстаток FROM #ТабИт AS Таб2 WHERE (Таб2.Клиент = ПолнТаб.Клиент) AND (Таб2.Период = (SELECT MAX(Таб3.Период) FROM #ТабИт AS Таб3 WHERE (Таб3.Клиент = ПолнТаб.Клиент) AND (Таб3.Период <=ПолнТаб.Дата))))
| END
| AS СуммаГРННачальныйОстаток,
| ТабДан.СуммаГРНПриход AS СуммаГРНПриход,
| ТабДан.СуммаГРНРасход AS СуммаГРНРасход,
| CASE WHEN ТабДан.СуммаГРНКонечныйОстаток IS NOT NULL THEN ТабДан.СуммаГРНКонечныйОстаток ELSE
| (SELECT Таб2.СуммаГРНКонечныйОстаток FROM #ТабИт AS Таб2 WHERE (Таб2.Клиент = ПолнТаб.Клиент) AND (Таб2.Период = (SELECT MAX(Таб3.Период) FROM #ТабИт AS Таб3 WHERE (Таб3.Клиент = ПолнТаб.Клиент) AND (Таб3.Период <=ПолнТаб.Дата))))
| END AS СуммаГРНКонечныйОстаток
|
| FROM #Клиенты_Дата AS ПолнТаб
| LEFT OUTER JOIN #ТабИт AS ТабДан
| ON ((ПолнТаб.Клиент = ТабДан.Клиент) AND (ПолнТаб.Дата = ТабДан.Период))
| ) AS T
|GROUP BY
| T.Клиент,
| T.Дата
|ORDER BY
| T.Клиент,
| T.Дата";
ТЗ = СоздатьОбъект("ТаблицаЗначений");
Попытка
//ТЗ = глODBCRecordset.ВыполнитьИнструкцию("SELECT * FROM #ТабИт ORDER BY Клиент, Период");
ТЗ = глODBCRecordset.ВыполнитьИнструкцию(Текст);
Исключение
глODBCRecordset.ПолучитьОписаниеОшибки();
Сообщить(Текст);
КонецПопытки;
Не уверен что и этот код оптимальный по скорости выполнения, так как получение итоговой таблицы возложено на SQL, хотя можно было прямо в 1С проверять, если остатки равны 0 (NULL в запросе) - то брать последний существующий сотаток.