Доброго дня всем! Знатоки, как корректно выглядит такой запрос SQL из 1С? А то что-то не получается никак(

```1c
    ВЫБРАТЬ
    ОстаткиНом.Номенклатура КАК Номенклатура,
    ОстаткиНом.КоличествоОстаток КАК Остаток
    ПОМЕСТИТЬ ВТостатки
    ИЗ
    РегистрНакопления.ОстаткиНоменклатуры.Остатки(&ДатаОстатка, Склад = &Склад) КАК ОстаткиНом
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ВТостатки.Номенклатура КАК Номенклатура,
    ВТостатки.Остаток КАК Остаток
    ИЗ
    ВТостатки КАК ВТостатки
```
---
Например так

Запрос = СоздатьОбъект("ODBCRecordSet");

Запрос.УстановитьТекстовыйПараметр("ДатаОстатка", ДатаОстатка);
Запрос.УстановитьТекстовыйПараметр("Склад", Склад);

ТекстЗапроса = "Set NoCount ON
|CRE ATE TABLE #t (Номенклатура char(9), Остаток Numeric(19, 2))
|
|INS ERT IN TO #t (Номенклатура, Остаток)
|SELECT
| рег.Номенклатура,
| рег.КоличествоОстаток
|FROM
| $РегистрОстатки.ОстаткиНоменклатуры(:ДатаОстатка,, Склад = :Склад, (Номенклатура), (Количество)) рег
|
|SELECT
| t.Номенклатура [Номенклатура $Справочник.Номенклатура],
| t.Остаток
|FROM
| #t t
|";
---
берем стандартную консоль запросов от 1С. Идет вместе с БСП. Включаем показ плана выполнения запроса.
Будет что-то вроде этого:

```1c
    SEL ECT
    T1._Period,
    T1._UseTotals,
    T1._ActualPeriod,
    T1._UseSplitter,
    T1._MinPeriod,
    T1._MinCalculatedPeriod
    FR OM _AccumRgOpt38853 T1
    WHERE ((T1._Fld1551 = 0)) AND (T1._RegID = 0xBB0C44807BF920468ECAB89F9A033F08 AND T1._Fld1551 = 0

    SEL ECT
    T1.Fld38239RRef AS _Q_001_F_000RRef,
    T1.Fld38245Balance_ AS _Q_001_F_001 INTO #T47190f70f3cc46a5bea0ca744f7bb7f5
    FR OM (SEL ECT
    T2.Fld38239RRef AS Fld38239RRef,
    SUM(T2.Fld38245Balance_) AS Fld38245Balance_
    FR OM (SELECT
    T3._Fld38239RRef AS Fld38239RRef,
    SUM(T3._Fld38245) AS Fld38245Balance_
    FR OM _AccumRgT38248 T3
    WH ERE ((T3._Fld1551 = 0)) AND (T3._Period = {ts '3999-11-01 00:00:00'} AND ((T3._Fld38242RRef = 0xB3380011955CBA6B11DF730308305ACC)) AND (T3._Fld38245 <> 0) AND (T3._Fld38245 <> 0))
    GROUP BY T3._Fld38239RRef
    HAVING (SUM(T3._Fld38245)) <> 0
    UNI ON ALL SEL ECT
    T4._Fld38239RRef AS Fld38239RRef,
    CAST(SUM(CASE WHEN T4._RecordKind = 0 THEN -T4._Fld38245 ELSE T4._Fld38245 END) AS NUMERIC(27, 3)) AS Fld38245Balance_
    FR OM _AccumRg38238 T4
    WH ERE ((T4._Fld1551 = 0)) AND (T4._Period >= {ts '2018-06-21 00:00:00'} AND T4._Period < {ts '3999-11-01 00:00:00'} AND T4._Active = TRUE AND ((T4._Fld38242RRef = 0xB3380011955CBA6B11DF730308305ACC)))
    GROUP BY T4._Fld38239RRef
    HAVING (CAST(SUM(CASE WHEN T4._RecordKind = 0 THEN -T4._Fld38245 ELSE T4._Fld38245 END) AS NUMERIC(27, 3))) <> 0) T2
    GROUP BY T2.Fld38239RRef
    HAVING (SUM(T2.Fld38245Balance_)) <> 0) T1
```

Тут использованы несколько другие таблицы.
---
Особенностью использования этой виртуальной таблицы является получение остатков на дату с использованием таблицы итогов.
Поэтому, если использование итогов отключено для регистра, работа с этой таблицей станет невозможной.
---
Так в 1С запрос то работает, мне надо его перегнать в TSQL)
---
так в яндексе посмотри (ссылки на форуме запрещены):
Анатомия регистра накопления. Виртуальная таблица «Остатки»
---
в 1с++ есть метод , который выводит текст запроса tsql
---
У тебя в 7.7 есть таблица остатков на начало интервалов учета (в ТиС обычно месяц) и таблица движений.
Работает так : берешь запросом из таблицы остатков на начало месяца даты, Объединяешь с движениями (+ / -) из таблицы движений за период с начала месяца до даты+Время на которую нужны остатки.

Как называются таблицы - смотри инструменты какие у тебя есть, или пользуйся tSQL / 1c++

P.S.: 13 лет на 1c++ не писал, но помню )
---
Судя по запросу (по наличию времянки), это 8.2/8.3
---
```1c
    Запрос = СоздатьОбъект("ODBCRecordSet");

    Запрос.УстановитьТекстовыйПараметр("ДатаОстатка", ДатаОстатка);
    Запрос.УстановитьТекстовыйПараметр("Склад", Склад);

    ТекстЗапроса = "Set NoCount ON
    |SELECT
    | рег.Номенклатура [Номенклатура $Справочник.Номенклатура],
    | рег.КоличествоОстаток Остаток
    |FROM
    | $РегистрОстатки.ОстаткиНоменклатуры(:ДатаОстатка,, Склад = :Склад, (Номенклатура), (Количество)) рег
    |";
```
---
Так и делал. Осталось только понять как с временными таблицами в этом примере)
---
Например так

Запрос = СоздатьОбъект("ODBCRecordSet");

Запрос.УстановитьТекстовыйПараметр("ДатаОстатка", ДатаОстатка);
Запрос.УстановитьТекстовыйПараметр("Склад", Склад);

ТекстЗапроса = "Set NoCount ON
|CRE ATE TABLE #t (Номенклатура char(9), Остаток Numeric(19, 2))
|
|INS ERT IN TO #t (Номенклатура, Остаток)
|SELECT
| рег.Номенклатура,
| рег.КоличествоОстаток
|FROM
| $РегистрОстатки.ОстаткиНоменклатуры(:ДатаОстатка,, Склад = :Склад, (Номенклатура), (Количество)) рег
|
|SELECT
| t.Номенклатура [Номенклатура $Справочник.Номенклатура],
| t.Остаток
|FROM
| #t t
|";
---
Спасибо большое! Было сообщение: Не удалось привязать составной идентификатор t.Номенклатура, поэтому подправил:

```1c
    |SELECT
    | ost.Номенклатура [Номенклатура $Справочник.Номенклатура],
    | ost.Остаток
    |FROM
    | #t AS ost
```
---
да нафиг они не нужны, временные таблицы

но если уж оч.хочется, то кури CRE ATE TABLE да INSERT
---
Согласен, конкретно в этом примере они не нужны абсолютно) Мне просто нужно прямой SQL запрос составить с 4-мя или 5тью временными таблицами для последующих соединений, поэтому и интересовался для наглядности примера. Читал про Create, Insert, Ins ert in to - но не получилось что-то. Потому и код правильный нужен чтобы от него отталкиваться.
---
можно же запрос без всяких временных.
сделай вложенными подзапросами
---
Для этого идеально подходит CTE (Common table expression) - обобщенное табличное выражение.