Имя: Пароль:
1C
1C 7.7
v7: Прямой запрос
0 koteyka-2
 
02.12.19
14:57
Добрый день. Я в прямых запросах новичок, поэтому прошу помощи.

|SELECT
| Жур.IDDoc as [Док $Документ],
| Жур.IDDocDef as Док_вид,
| Жур.$ОбщийРеквизит.Склад as [Склад $Справочник.Склад]
| $ПоследнееЗначение.Склад.Фирма(Склад.ID, cast(left(Жур.date_time_iddoc,8) as datetime) Фирма
|FROM
| _1SJourn Жур
|WHERE
| (cast(left(Жур.date_time_iddoc,8) as datetime) >= :НачДата)
| AND (cast(left(Жур.date_time_iddoc,8) as datetime) <= :КонДата)
| AND Жур.IDDocDef = $
| AND Жур.Closed & 1 = 1
|";

Сейчас запрос выдает ошибку, но если я комментирую строку | $ПоследнееЗначение.Склад.Фирма(Склад.ID, cast(left(Жур.date_time_iddoc,8) as datetime) Фирма
То запрос работает
Собственно, есть документ РасходнаяНакладная и у нее реквизит Склад, он общий. У всех документов общий реквизит склад (Справочник.Склад), а у склада периодический реквизит Фирма (Справичник.Фирмы)
Мне нужно выбрать Суммы по документам (пока не дописал), склады и фирмы у склада на дату документа
Что у меня не так со строкой | $ПоследнееЗначение.Склад.Фирма(Склад.ID, cast(left(Жур.date_time_iddoc,8) as datetime) Фирма ?
1 ДенисЧ
 
02.12.19
14:59
Есть такой символ на клавиатуре, "запятая" называется...
Ты её в складе забыл...
2 koteyka-2
 
02.12.19
15:03
Спасибо за оперативность.
Действительно забыл, но теперб ругается на Склад.ID
3 ДенисЧ
 
02.12.19
15:04
Там вроде есть ещё одна закорючка, $ называется.
Я могу ошибаться, но нужно  
$ПоследнееЗначение.Склад.Фирма($Склад.ID, cast(left(Жур.date_time_iddoc,8) as datetime) Фирма
Но это не точно...
4 koteyka-2
 
02.12.19
15:04
The multi-part identifier Склад.ID could not be bound
5 koteyka-2
 
02.12.19
15:06
Не. Так выходит неизвестное метаимя или алиас $Склад
6 koteyka-2
 
02.12.19
15:07
Там я еще скобку пропустил в строке
$ПоследнееЗначение.Склад.Фирма(Склад.ID, cast(left(Жур.date_time_iddoc,8) as datetime)) Фирма
Но в коде она есть
7 Sserj
 
02.12.19
15:09
У тебя нет в запросе таблицы Склад, зато есть Жур.$ОбщийРеквизит.Склад
8 koteyka-2
 
02.12.19
15:10
Да. Но без строки с выбором последнего значения запрос работает и склады выбирает
9 Sserj
 
02.12.19
15:11
Т.е. согласно идеологии SQL секция SELECT происходит "в один момент" и в ней нельзя использовать алиасы присвоенные в этой же секции, их ты сможешь использовать только в секциях позже, т.е. собственно только в ORDER BY, но и то алиас у тебя не Склад а [Склад $Справочник.Склад]
10 Sserj
 
02.12.19
15:12
(8) И помоему не нужно кастить к datetime, достаточно
$ПоследнееЗначение.Склад.Фирма( Жур.$ОбщийРеквизит.Склад, left(Жур.date_time_iddoc,8))
11 Злопчинский
 
02.12.19
15:15
начдата и кондата - если что - можно битвин использовать
12 koteyka-2
 
02.12.19
15:18
Знаю, но он не спасает ситуацию
13 koteyka-2
 
02.12.19
15:18
$ПоследнееЗначение.Склад.Фирма( Жур.$ОбщийРеквизит.Склад, left(Жур.date_time_iddoc,8))
Так ругается на неизвестны алиас $ОбщийРеквизит
14 Sserj
 
02.12.19
15:19
(cast(left(Жур.date_time_iddoc,8) as datetime) >= :НачДата)

Вот это однозначно нужно переделать в
left(Жур.date_time_iddoc,8) BETWEEN :НачДата AND :КонДата~

Потому как если ты используешь приведение то SQLServer уже не будет использовать индекс а будет выполнено полное сканирование журнала.
15 Sserj
 
02.12.19
15:21
(13) Ну тогда просто без Жур его поставь, так как таблица у тебя одна то и никаких двусмысленностей не будет
$ПоследнееЗначение.Склад.Фирма($ОбщийРеквизит.Склад, left(Жур.date_time_iddoc,8))
16 dk
 
02.12.19
15:22
про скобку в
$ПоследнееЗначение.Склад.Фирма(Склад.ID, cast(left(Жур.date_time_iddoc,8) as datetime)) Фирма
уже было?
17 koteyka-2
 
02.12.19
15:24
Да Было. То я здесь не дописал. В коде она есть.
В нете вычитал, что если нужно на дату документа, то используется cast(left(Жур.date_time_iddoc,8) as datetime)
18 koteyka-2
 
02.12.19
15:24
Не могу просто скопипастить код, т.к. по RDP работаю
19 koteyka-2
 
02.12.19
15:25
Приходится вручную здесь писать
20 koteyka-2
 
02.12.19
15:27
Ошибка только при наличии этой строки
$ПоследнееЗначение.Склад.Фирма(Склад.ID, cast(left(Жур.date_time_iddoc,8) as datetime)) Фирма

Пробовал после
|FROM
| _1SJourn Жур

Дописать LEFT JOIN $Справочник.Склад as Склад
Не помогло
21 Ёпрст
 
02.12.19
15:36
выложи последний запрос, лень все смотреть
22 Ёпрст
 
02.12.19
15:37
AND Жур.IDDocDef = $ //очень интересное условие
23 dk
 
02.12.19
15:40
SELECT
    Влож.IDDOC [Документ $Документ]
    , Влож.IDDOCDEF [Документ_вид $ВидДокументаПредставление]
    , Влож.DOCNO Документ_ном
    , Влож.Дата
    , Влож.Фирма [Фирма $Справочник.Фирмы]
    , $ПоследнееЗначение.Фирмы.ГлБухгалтер(Влож.Фирма, Влож.Дата)    глБух
FROM
(SELECT Журнал.IDDOC
    , Журнал.IDDOCDEF
    , Журнал.DOCNO
    , CAST(LEFT(Журнал.DATE_TIME_IDDOC,8) AS DATETIME) Дата
    , Журнал.$ОбщийРеквизит.Фирма Фирма
FROM _1SJOURN AS Журнал With (NOLOCK)
WHERE (Журнал.DATE_TIME_IDDOC >= :выб)
    AND (Журнал.IDDOCDEF = $ВидДокумента.ПриходнаяНакладная)
) Влож
24 Ёпрст
 
02.12.19
15:40
(20) не нужен там лефт джоин склад
25 dk
 
02.12.19
15:40
оберни через вложенный все
26 Ёпрст
 
02.12.19
15:41
(23) ну, вложенный тут не нужен как бэ..
27 Ёпрст
 
02.12.19
15:41
(25) а зачем ?
28 dk
 
02.12.19
15:44
последнеезанчение не хочет принимать общий реквизит как параметр
29 koteyka-2
 
02.12.19
15:44
Вот, что у меня на данный момент
|SELECT
| Жур.IDDoc as [Док $Документ],
| Жур.IDDocDef as Док_вид,
| Жур.$ОбщийРеквизит.Склад as [Склад $Справочник.Склад],
| $ПоследнееЗначение.Склад.Фирма(Склад.ID, cast(left(Жур.date_time_iddoc,8) as datetime)) Фирма
|FROM
| _1SJourn Жур
|WHERE
| (cast(left(Жур.date_time_iddoc,8) as datetime) >= :НачДата)
| AND (cast(left(Жур.date_time_iddoc,8) as datetime) <= :КонДата)
| AND Жур.IDDocDef = $
| AND Жур.Closed & 1 = 1
|";

Ошибка
The multi-part identifier Склад.ID could not be bound
30 koteyka-2
 
02.12.19
15:48
Сори.
Там вот так
AND Жур.IDDocDef = $ВидДокумента.РасходнаяНакладная
31 Злопчинский
 
02.12.19
15:51
(29) может пригодится, информационно

| select Жур.iddoc
| from      1sjourn as Жур
| where
| between
| (
| Жур.iddocdef+dtos(Жур.date)+Жур.time+Жур.iddoc,
| $ВидДокумента.ЗаявкаПокупателя+dtos(:ДатаН~~)+'      '+'         ',
| $ВидДокумента.ЗаявкаПокупателя+dtos(:ДатаК~~)+'ZZZZZZ'+'ZZZZZZZZZ'
| )
32 Sserj
 
02.12.19
15:51
(28) Так блин не мудрить а просто этот общий руками тупо вбить
МетаДата = СоздатьОбъект("MetaDataWork");
полеСклада = "sp" + МетаДата.ИДОбъекта(Метаданные.ОбщийРеквизитДокумента("Склад"));
"..
$ПоследнееЗначение.Склад.Фирма("+полеСклада+", left(Жур.date_time_iddoc,8))
.."
33 dk
 
02.12.19
15:56
(32) да, так тоже робит
34 dk
 
02.12.19
16:01
(31) Это чтобы по индексу iddocdef + date_time_iddoc идти?
а чего такой сложно? скуль сам его выберет, если фильтры поставить по iddocdef и date_time_iddoc типа как (23)
35 koteyka-2
 
02.12.19
16:02
Похоже на костыль, но сработало.
Но теперь фирмы выданы как Н001, 4001 и т.д.
36 Sserj
 
02.12.19
16:04
(34) А это он для DBF написал, там поля отдельно date, time, iddoc вместо date_time_iddoc в SQL

(35) Дэк типизируй колонку
as [Фирма $Справочник.Фирмы]
37 Ёпрст
 
02.12.19
16:04
(28)та ну ?

автор, проверь:


SELECT
    Жур.IDDOC [Документ $Документ]
    , Жур.IDDOCDEF Документ_вид
    , Жур.DOCNO Документ_ном
    , CAST(LEFT(Жур.DATE_TIME_IDDOC,8) AS DATETIME) Дата
    , Жур.$ОбщийРеквизит.Склад [Склад $Справочник.Склады]
    , $ПоследнееЗначение.Склад.Фирма(Жур.$ОбщийРеквизит.Склад,CAST(LEFT(Жур.DATE_TIME_IDDOC,8) AS DATETIME))  [Фирма $Справочник.Фирмы]
FROM
FROM _1SJOURN AS Жур(NOLOCK)
WHERE left(Жур.date_time_iddoc,8) BETWEEN :НачДата AND :КонДата~
    AND Жур.IDDOCDEF = $ВидДокумента.ПриходнаяНакладная
38 Ёпрст
 
02.12.19
16:06
(29)

это че ???
>>>AND Жур.IDDocDef = $
39 koteyka-2
 
02.12.19
16:06
Пару минут, а то нужно руками набрать, копипаст на RDP отключен
40 Ёпрст
 
02.12.19
16:07
(39) беги оттуда, или открой браузер в самом сеансе rdp
41 koteyka-2
 
02.12.19
16:23
Нет там браузера. Всё зашифровано. Самого бесит такая паранойя.
Ошибка в вашем варианте неизвестное метаимя или алиас $ОбщийРеквизит
Вариант Sserj работает, остановлюсь на нем.
Спасибо всем
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший