Имя: Пароль:
1C
1C 7.7
v7: Помогите с прямым запросом
,
0 Sk0rp
 
25.01.12
16:18
Черный запрос выглядит так:

   ТекстЗапроса = "
   |Период с НачДата по ПоДату;
   |Без Итогов;
   |
   |Номенклатура    = Регистр.ПартииТоваров.Товар;
   |Покупатель        = Регистр.ПартииТоваров.ТекущийДокумент.РасходнаяНакладная.Клиент;
   |
   |ПродСтоимость    = Регистр.ПартииТоваров.Оборот;
   |Количество        = Регистр.ПартииТоваров.ОстатокТовара;
   |КодОперации    = Регистр.ПартииТоваров.КодОперации;
   |
   |Функция СуммаОбщая            = Расход(ПродСтоимость);
   |Функция КоличествоОбщее    = Расход(Количество);
   |
   |Группировка Номенклатура без упорядочивания без групп;
   |
   |Условие(Покупатель = ВыбПокупатель);
   |Условие(Номенклатура в Фильтр);
   |Условие(КодОперации = ПродажаТовара);
   |";
   

Надо переписать на прямой запрос, т.к. в SQL базе он чертовски медленный (в файловой работает в сотни раз быстрее)

Я не большой специалист по прямым запросам и проблема у меня вот в чем. В таблице "$Регистр.ПартииТоваров" есть ссылка на документ движения, но нет поля ОстатокТовараРасход, которое есть в виртуальной таблице $РегистрОбороты.ПартииТоваров, но там нет ссылки на документ.
Как мне и с таблицей документов пересечь и расход за период получить?

Правильнее всего было бы использовать для такой задачи оборотный регистр Продажи, но его в этой конфигурации нет.
1 Ёпрст
 
25.01.12
16:21
(0) ну и каша в голове..
Остатка в виртуальной табличке РегистрОбороты тоже нет, если что
2 Ёпрст
 
25.01.12
16:21
+1 там только обороты
3 Sk0rp
 
25.01.12
16:22
(2) Так мне только оборот и нужен, я про остаток нигде не писал.
4 Ёпрст
 
25.01.12
16:22
+2 и там есть документ движения регистра при указании периодичности Документ
5 Ёпрст
 
25.01.12
16:23
(3) да вижу уже..
И нафига ресурс регистра обзывать ОстатокТовара ?
6 Ёпрст
 
25.01.12
16:24
А по теме, в виртуальной табличке РегистрОбороты задай периодичность Документ и имей свой документ движения через ВидДокумента + райт(ПозицияДокумента,9)
7 Sk0rp
 
25.01.12
16:25
(5) Это типовой регистр из ТиС 8.7
8 Sk0rp
 
25.01.12
16:31
(6) Спасибо. Нашел.
9 Sk0rp
 
25.01.12
16:39
В догонку: по виртульной таблице оборотов можно сумму по реквизиту регистра получить?
Регистр.ПартииТоваров.Оборот - это не ресурс, а реквизит.
А то конструктор запросов из OpenConf Не дает его в запрос добавить.
10 viktor_vv
 
25.01.12
16:44
(9) Неа.
11 Ёпрст
 
25.01.12
16:46
(9) нет.
для реквизитов регистра придётся руками писать из таблички движения регистра  - Регистр.ИмяРегистра
12 viktor_vv
 
25.01.12
16:46
Так если тебе только движения, тяни не из виртуальной таблицы, а из реальной таблицы движений регистра, там и до реквизита достучишься, может чуть медленне будет.
13 Sk0rp
 
25.01.12
16:50
(12) Так с сделал сначала, не понял как только Расход выбрать?
14 viktor_vv
 
25.01.12
16:55
РегОст.debkred  - 0 приход, 1 расход.
15 Ёпрст
 
25.01.12
16:55
(13) :))
вот что значит конструкторы всякие..они сушат мозг.
ЗЫ: смотреть флаг debkred регистра, 1 - расход, 0- приход
16 Sk0rp
 
25.01.12
16:59
(14), (15) ОК, спасибо.
17 Sk0rp
 
25.01.12
18:18
Что-то я все равно не понимаю:

       |SELECT $ПартииТоваров.Товар [Товар $Справочник.Номенклатура]
       |    , Sum($ПартииТоваров.ПродСтоимость) СуммаПродажи
       |    , Sum($ПартииТоваров.ОстатокТовара) Продано
       |FROM $Регистр.ПартииТоваров AS ПартииТоваров With (NOLOCK)
       |    INNER JOIN $Документ.РасходнаяНакладная AS РасходнаяНакладная With (NOLOCK) ON ПартииТоваров.IDDOC = РасходнаяНакладная.IDDOC
       |    INNER JOIN _1SJOURN AS Журнал With (NOLOCK) ON ПартииТоваров.IDDOC = Журнал.IDDOC
       |WHERE ($ПартииТоваров.КодОперации = :ПродажаТовара)
       |    AND ($ПартииТоваров.Товар = :ВыбТовар)
       |    AND ($РасходнаяНакладная.Клиент = :ВыбПокупатель)
       |    AND (Журнал.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~)
       |GROUP BY $ПартииТоваров.Товар





В "Продано" правильный оборот, в "СуммаПродажи" ноль. Не хочет сумму по реквизиту считать. Что не так делаю?
18 viktor_vv
 
25.01.12
18:25
А такой выполни, че покажет.

|SELECT $ПартииТоваров.Товар [Товар $Справочник.Номенклатура]
       |    ,$ПартииТоваров.ПродСтоимость СуммаПродажи
       |    ,$ПартииТоваров.ОстатокТовара Продано
       |FROM $Регистр.ПартииТоваров AS ПартииТоваров With (NOLOCK)
| INNER JOIN _1SJOURN AS Журнал With (NOLOCK) ON ПартииТоваров.IDDOC = Журнал.IDDOC
       |WHERE ($ПартииТоваров.КодОперации = :ПродажаТовара)
       |    AND ($ПартииТоваров.Товар = :ВыбТовар)
       |    AND (Журнал.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~)
19 Sk0rp
 
25.01.12
18:30
(18) Кучу строк с одинаковым товаром, везде Продано заполнено, СуммаПродажи везде нули.
Реквизит в движения точно заполнен, т.к. черным запросом все выводится.
20 Sk0rp
 
25.01.12
18:39
В SQL это так приходит:

SELECT ПартииТоваров.sp1131 [Товар $Справочник.Номенклатура]
   ,ПартииТоваров.sp2799 СуммаПродажи
   ,ПартииТоваров.sp1133 Продано
FROM ra1130 AS ПартииТоваров With (NOLOCK)
INNER JOIN _1SJOURN AS Журнал With (NOLOCK) ON ПартииТоваров.IDDOC = Журнал.IDDOC
WHERE (ПартииТоваров.sp3027 = 'П')
   AND (ПартииТоваров.sp1131 = '   PYI   ')
   AND (Журнал.DATE_TIME_IDDOC BETWEEN '20110330' AND '20120124Z')
21 viktor_vv
 
25.01.12
18:40
Оставь только

     |WHERE
       |    ($ПартииТоваров.Товар = :ВыбТовар)
       |    AND (Журнал.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~)

И в селект добавь

|SELECT $ПартииТоваров.Товар [Товар $Справочник.Номенклатура]
      |   ,$ПартииТоваров.КодОпреации as [КодОперации $Перечисление.КодыОпераций]
      |    ,$ПартииТоваров.ПродСтоимость СуммаПродажи

И смотри по твоему коду есть суммы заполненые.
22 viktor_vv
 
25.01.12
18:43
Блин, ну ты даешь. Вот это сравни

|ПродСтоимость    = Регистр.ПартииТоваров.Оборот;

и

$ПартииТоваров.ПродСтоимость СуммаПродажи
23 viktor_vv
 
25.01.12
18:44
Самый прикол, что у тебя есть или измеренеие или реквизит ПродСтоимость, поэтому ошибка не выходит, но он не заполнен. А черным запросом ты берешь из "Оборот".
24 Sk0rp
 
25.01.12
18:46
А-А-А-А-А-А !!!!!
все точно! Огромное спасибо
25 monsterZE
 
26.01.12
17:09
Чтобы не плодить тем, подниму =) как выдернуть сумму из документа?

   ТекстЗапроса = "
   |SELECT
   |    Жур.IDDoc as [Док $Документ],
   |    Жур.IDDocDef as Док_вид,
   |   $Док.Вид as [ВидР $Перечисление.ВидРасходной]
//    |    SUM($ДокС.Сумма) as Сумма
   |FROM
   |    _1SJourn as Жур
   |INNER JOIN
   |    $Документ.РасходнаяНОФ as Док ON Док.IDDoc = Жур.IDDoc
//    |INNER JOIN
//    |   $ДокументСтроки.РасходнаяНОФ as ДокС ON ДокС.IDDoc = Жур.IDDoc
   |WHERE
   |    Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~ AND
   |    Жур.IDDocDef = $ВидДокумента.РасходнаяНОФ AND
   |   $Док.Вид = $Перечисление.ВидРасходной.ДоплатаЗаНал";
26 Ёпрст
 
26.01.12
17:11
если сумма - реквизит шапки - взять из таблички dh
если сумма - реквизит табличной части - проссуммировать из таблички dt
если сумма - реквизит табличной части с галкой итог по колонке - взять с таблички шапки dh
27 monsterZE
 
26.01.12
17:12
ну вобще она с галкой итог
выше, это я попробывал просуммировать =)
28 monsterZE
 
26.01.12
17:15
вобщем прекрасно взялось как реквизит шапки, а как правильно, если надо просуммировать?
29 Ёпрст
 
26.01.12
17:16
(28) ну, как у тебя в коде, расскоменти и привет
30 Ёпрст
 
26.01.12
17:18
только еще group by нужен..
31 Ёпрст
 
26.01.12
17:18
по iddoc
32 monsterZE
 
26.01.12
17:48
Ёпрст4, спасибо, что всего оперативно помогаешь (отвечаешь)! =)
2 + 2 = 3.9999999999999999999999999999999...