Имя: Пароль:
1C
1С v8
Использование временных таблиц в логическом операторе "В"
,
0 siggoron
 
18.01.12
10:20
Почему запрос описанный ниже выдаёт ошибку «Поле не найдено «СписокПроведенныхЗаказов»»:


ВЫБРАТЬ
   ЗаказПокупателя.Ссылка
ПОМЕСТИТЬ СписокПроведенныхЗаказов
ИЗ
   Документ.ЗаказПокупателя КАК ЗаказПокупателя
ГДЕ
   ЗаказПокупателя.Дата МЕЖДУ &ДатаНач И &ДатаКон
   И ЗаказПокупателя.Проведен = ИСТИНА
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ДинамикаЗаказовПокупателейПоОплатеСрезПоследних.ЗаказПокупателя,
   ДинамикаЗаказовПокупателейПоОплатеСрезПоследних.СостояниеОплаты
ИЗ
   РегистрСведений.ДинамикаЗаказовПокупателейПоОплате.СрезПоследних(
           &ДатаКон,
           ЗаказПокупателя В
               (СписокПроведенныхЗаказов)) КАК ДинамикаЗаказовПокупателейПоОплатеСрезПоследних


Разве временные таблицы пакетных запросов нельзя использовать в логическом операторе «В»?
Заранее благодарен за ответы.
1 Asmody
 
18.01.12
10:22
ЗаказПокупателя В (ВЫБРАТЬ Ссылка ИЗ СписокПроведенныхЗаказов)
2 Scooter
 
18.01.12
10:22
полагаю должно быть так
выбрать * из СписокПроведенныхЗаказов
3 GenV
 
18.01.12
10:24
1+ скорее ЗаказПокупателя В (ВЫБРАТЬ СписокПроведенныхЗаказов.Ссылка ИЗ СписокПроведенныхЗаказов)
4 siggoron
 
18.01.12
10:25
(3) Вы правы, большое спасибо
5 Sammo
 
18.01.12
10:28
При этом необходимо понимать, что большие списки в значении (В) могут привести к существенной деградации производительности.
6 aleks-id
 
18.01.12
10:28
жесть

ВЫБРАТЬ
   ДинамикаЗаказовПокупателейПоОплатеСрезПоследних.ЗаказПокупателя,
   ДинамикаЗаказовПокупателейПоОплатеСрезПоследних.СостояниеОплаты
ИЗ
   РегистрСведений.ДинамикаЗаказовПокупателейПоОплате.СрезПоследних(
           &ДатаКон,
           ЗаказПокупателя В
               (ВЫБРАТЬ
   ЗаказПокупателя.Ссылка
ИЗ
   Документ.ЗаказПокупателя КАК ЗаказПокупателя
ГДЕ
   ЗаказПокупателя.Дата МЕЖДУ &ДатаНач И &ДатаКон
   И ЗаказПокупателя.Проведен)) КАК ДинамикаЗаказовПокупателейПоОплатеСрезПоследних
7 aleks-id
 
18.01.12
10:29
а за ЗаказПокупателя.Проведен = ИСТИНА надо пальцы отламывать...
8 Maxus43
 
18.01.12
10:29
(6) вложеные запросы не есть гуд, ВТ кошерней
9 aleks-id
 
18.01.12
10:30
(8) замерь производительность ;)
10 Maxus43
 
18.01.12
10:32
(9) я настольной библии 1с доверяю. Так же зависит от количества данных во вложенном запросе. Если там 1 док то понятно, а если 20 тысяч?
11 aleks-id
 
18.01.12
10:33
(10) а ничо, что в ВТ тоже отбирается из этих 20 тысяч, а затем еще и из ВТ ТЕМ ЖЕ ВЛОЖЕННЫМ запросом дергается?
12 siggoron
 
18.01.12
10:45
(7) почему?
13 Maxus43
 
18.01.12
10:45
(11) ВТ можно проиндексировать. в ВТ будет известно уже сколько там записей, от этого зависит какой план запроса выберет СУБД. ЕМНИП СКЛ выбирает 1 из 2х вариантов для работы с вложенными, они оптимизированы или под маленьколе или под большое количество записей. напрямую с вложеным - может выбрать не тот план. Имхо писать дак изначально чтоб по феншую было
14 Maxus43
 
18.01.12
10:51
а вобще - нет смысла говорить про производительность таких вещей в отрыве от конкретной ситуации и базы... но я за работу с ВТ, считай что по религиозным соображениям
15 Кириллка
 
18.01.12
11:06
(7)Ты пойми, что это скуль, а не встроенный язык 1с. В встроенном языке еще можно про пальцы говорить и то спорно. А в запросе так, чем точнее описал предикаты, тем лучше.
16 Кириллка
 
18.01.12
11:07
(5)Нужно помнить, что ЛЮБЫЕ большие списки могут привести к существенной деградации производительности.
17 Kraft
 
18.01.12
11:16
(7) обоснуй
18 aleks-id
 
18.01.12
13:35
(17) булева переменная уже содержит в себе значение ИСТИНА или ЛОЖЬ. зачем его сравнивать если условие выполняется в зависимости от передаваемого в него значения?

Если Документ.Проведен = ИСТИНА Тогда ...
вот за это надо бить.

Если Документ.Проведен Тогда ...
а так правильно.
19 Maxus43
 
18.01.12
13:37
(18) а скулю пофиг, там нет типа "Булево". план запроса будет одинаковый как мне кажется, не проверял. Писать так в 1с правильней конечно с точки зрения красоты и читаемости
20 aleks-id
 
18.01.12
13:41
(19) а ты проверь ;)
21 Jaap Vduul
 
18.01.12
13:48
(18) Ерунда.
(20) Одинаковый, я проверял.
22 1с-кин
 
18.01.12
13:48
(18) а что, с некоторых пор булево стало громоздким составным объектом? ну прихватит сравнение двух единичек... :)
23 Maxus43
 
18.01.12
13:51
(22) я про то что на скуле такого типа нет в явном виде, есно он простой, суть в запросе который будет там делаться
24 alex-pro
 
18.01.12
13:51
(12) некошерно ибо так писать.
25 Кириллка
 
18.01.12
15:00
(24)Некошерно не аргумент.
Нужно понимать:
- при явном сравнении "Если <Что-то слева> = <Что-то справа> Тогда", значение <Что-то слева> неявно приводится к типу <Что-то справа> и выполняется сравнение по правилам этого типа, приведение не удалось - рун-тайм ошибка;
- при неявном сравнении "Если <Что-то> Тогда", значение <Что-то> не приводится ни к какому типу, там тупо ожидается Булево значение и если там что-то отличное от Булева, то рун-тайм ошибку получаем;

Отсюда вывод: если там гарантированное Булево значение, то явное сравнение ни к чему, в противном случае - явное сравнение нужно только для того, чтобы показать, что по логике программы мы там ожидаем Булево значение. И если там прилетело что-то другое, то это где-то касяк.
26 hhhh
 
18.01.12
15:13
(24) Наоборот, часто бывает Документ.Проведен = НЕопределено и тогда

Если Документ.Проведен Тогда ...    

вываливается в ошибку. А

Если Документ.Проведен = ИСТИНА Тогда ...

выполняется нормально. ЭТо кошернее.
27 1с-кин
 
18.01.12
15:15
(26) это специфика 1с.
В 1с вообще все надо стараться писать как можно более явно и наглядно.
а (7) смотрит на выполнение запросов в 1с - как на запросы SQL.
28 Feanor
 
18.01.12
15:27
(26) эт в каких случаях бывает "Документ.Проведен = НЕопределено" ?
29 1с-кин
 
18.01.12
15:28
(28) запросто. когда неинициализирован еще.
30 Feanor
 
18.01.12
15:31
(29) что значит "неинициализирован"?
31 Starhan
 
18.01.12
15:34
(28) естьNULL(документ.Проведен, Неопределено)
:)
32 Maxus43
 
18.01.12
15:36
представляем ещё не созданный документ - там неопределено
33 Feanor
 
18.01.12
15:40
(32) что значит "еще не созданный документ"?
34 rrunover
 
18.01.12
15:53
(33) Форма документа открыта и заполнена, но не записана - оно?
35 Starhan
 
18.01.12
15:54
(34) емнип там пустая ссылка.
36 Starhan
 
18.01.12
15:55
всмысле проведен будет  ложь по умолчанию
37 rrunover
 
18.01.12
15:55
не пустая там ссылка
38 rrunover
 
18.01.12
15:56
а проведён будет ложь, да )
39 Feanor
 
18.01.12
15:57
(38) За ответ - Два, за сообразительность - Пять )))
40 Feanor
 
18.01.12
15:59
На самом деле очень интересно увидеть, как нечто типа "ДокументОбъект.ВидДокумента" будет содержать в свойстве "Проведен" Неопределено
41 rrunover
 
18.01.12
15:59
ми-ми-ми ...
(39) бес (УстановитьСсылкуНового) попутал :)
42 Feanor
 
18.01.12
16:00
(41) отсыпь уже, не томи, а? )))
43 Maxus43
 
18.01.12
16:03
(33) это значит что "представляем" в воображении такую ситуацию и вуаля! а как физически добится такого я хз)
44 Feanor
 
18.01.12
16:04
(43) а вот (29) точно знает, как добиться, но молчит, гад! (
45 1с-кин
 
18.01.12
18:15
(44) ну не конкретно Документ.Проведен = Неопределено.
Спор о том, что если тип Булево - то реквизит может/не может быть неопределено в некий момент времени.
А это (Неопределено) касается любого реквизита в 1С, если не было инициализации.
46 Feanor
 
18.01.12
19:18
(45) конкретно у переменной типа "ДокументОбъект.ВидДокументаРек" или "ДокументСсылка.ВидДокументаРек" свойство "Проведен" никак не может иметь значение, отличное от "Истина" или "Ложь".

З.Ы. До сих пор не понимаю, что есть "инициализация" реквизита в терминах языка 1С
47 Sammo
 
19.01.12
05:04
Если не было "инициализации" то реквизиты принимают значения по умолчанию.
А теперь смотри значения по умолчанию для булевых реквизитов.
48 Kraft
 
19.01.12
05:48
(18) ты просто "лейтенант очевидность" б^ля
49 Feanor
 
19.01.12
09:31
(47) ты тоже из той армии, которая не понимает разницы между двумя словами "переменная" и "реквизит"? )))
50 Sammo
 
19.01.12
09:46
(49) Началось с документ.Проведен - это реквизит.
51 Maxus43
 
19.01.12
09:50
Неинициализированная переменная - Неопределено. Реквизит - значение по умолчанию. Чеготут обсуждать та?
52 Feanor
 
19.01.12
09:51
(51) да в целом нечего, кроме некоторой неграмотности товарища 1с-кин ))
53 1с-кин
 
24.01.12
17:37
(52) это вы неграмотны - при создании объекта, если типа данных реквизита/переменной нет - значение будет НЕОПРЕДЕЛЕНО.
А тип есть - так он сам и накладывает ограничение, что не может быть НЕОПРЕДЕЛЕНО, и поэтому - какое-то значение по-умолчанию.
В корень надо зрить ))
Независимо от того, куда вы едете — это в гору и против ветра!