Имя: Пароль:
1C
1С v8
Помогите с условием в запросе, не работает
,
0 saf112
 
16.09.11
11:54
[code]
ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ (
   ВЫБРАТЬ РАЗЛИЧНЫЕ регистр2.Регистратор КАК регистратор, регистр2.РегистраторПоТП.УвеличениеЗаявленнойМощности КАК мощность
   ИЗ РегистрСведений.ТП_СостоянияДокументов КАК Регистр1, РегистрСведений.ТП_СостоянияДокументов КАК Регистр2
   ГДЕ Регистр1.РегистраторПоТП = Регистр2.РегистраторПоТП
   И Регистр2.СостояниеДокумента.Код = "3.60"                    //договор подписан обеими сторонами
   И НЕ Регистр1.СостояниеДокумента.Код = "7.40"                //но не исполнен (нет подписанных актов)
) как колво     =714


ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ (
   ВЫБРАТЬ РАЗЛИЧНЫЕ регистр2.Регистратор КАК регистратор, регистр2.РегистраторПоТП.УвеличениеЗаявленнойМощности КАК мощность
   ИЗ РегистрСведений.ТП_СостоянияДокументов КАК Регистр1, РегистрСведений.ТП_СостоянияДокументов КАК Регистр2
   ГДЕ Регистр1.РегистраторПоТП = Регистр2.РегистраторПоТП
   И Регистр2.СостояниеДокумента.Код = "3.60"                    //договор подписан обеими сторонами
   //И НЕ Регистр1.СостояниеДокумента.Код = "7.40"                //но не исполнен (нет подписанных актов)
) как колво     =714


ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ (
   ВЫБРАТЬ РАЗЛИЧНЫЕ регистр2.Регистратор КАК регистратор, регистр2.РегистраторПоТП.УвеличениеЗаявленнойМощности КАК мощность
   ИЗ РегистрСведений.ТП_СостоянияДокументов КАК Регистр1, РегистрСведений.ТП_СостоянияДокументов КАК Регистр2
   ГДЕ Регистр1.РегистраторПоТП = Регистр2.РегистраторПоТП
   И Регистр2.СостояниеДокумента.Код = "3.60"                    //договор подписан обеими сторонами
   И Регистр1.СостояниеДокумента.Код = "7.40"                //но не исполнен (нет подписанных актов)
) как колво     =281
[/code]

1-й вариант - это то, что мне нужно.
Но, как показывают варианты 2 и 3, работает он не так, как я ожидаю.
Может подкинет кто идею?
1 PEPEL_1C
 
16.09.11
12:00
Раз 1 вариант - то что нужно, в чем вопрос?
2 saf112
 
16.09.11
12:47
[quote]
Но, как показывают варианты 2 и 3, работает он не так, как я ожидаю.
[/quote]
3 saf112
 
16.09.11
12:51
если быть точным, строка
И НЕ Регистр1.СостояниеДокумента.Код = "7.40"
что есть, что нет - результат один.

В то же время, третий вариант указывает, что документы с кодом состояния "7.40" таки есть.

Вот я и хочу, чтобы первый мой запрос выдавал 714-281=433 записи.
4 forforumandspam
 
16.09.11
12:54
Может так надо:
И Регистр1.СостояниеДокумента = ЗНАЧЕНИЕ(Перечисление.КакоеТоПеречисление.КакоеТоЗначение)
5 saf112
 
16.09.11
13:21
forforumandspam, шило на мыло же. Попробовал так, разницы нет.

С точки зрения логики(моей), запрос должен посчитать документы, у которых есть состояние с кодом "3.60", исключая те документы, которые кроме этого имеют состояние "7.40".
На практике же он(запрос) считает первые НЕ исключая вторые.

Может есть какая-нибуть особенность у регистра сведений?
Или дырка в моей логике?
6 Рыжий Лис
 
16.09.11
13:34
(5) В регистре хранится история состояний документов?
01.01 Регистратор1 Документ1 3.60
01.02 Регистратор2 Документ1 7.40

Тогда первый запрос вернет -2, второй -2, третий -1. А как нужно?
7 saf112
 
16.09.11
13:50
(6) Да, хранится история состояний документов.

Мне нужны те документы, у которых состояние 3.60 есть, а 7.40 нет.

ГДЕ
Регистр1.Регистратор = Регистр2.Регистратор
8 saf112
 
16.09.11
13:57
(6) Да, хранится история состояний документов.

Мне нужны те документы, у которых состояние 3.60 есть, а 7.40 нет.

Вот псевдокод с говорящими именами, и как я вижу его работу (в комментариях)
[code]
...
ИЗ РегистрСведений.СостоянияДокументов как Регистр1,
  РегистрСведений.СостоянияДокументов как Регистр2
ГДЕ
Регистр1.Регистратор = Регистр2.Регистратор //и Регистр1 и Регистр2 ссылаются на один документ
И Регистр1.Состояние = 3.60  //у этого документа есть запись состояния 3.60
И НЕ Регистр2.Состояние = 7.40  //но нет записи состояния 7.40
[/code]
9 Рыжий Лис
 
16.09.11
14:17
ВЫБРАТЬ РегистраторПоТП ИЗ РегистрСведений.ТП_СостоянияДокументов ГДЕ Состояние = 3.60 И РегистраторПоТП НЕ В (ВЫБРАТЬ РегистраторПоТП ИЗ РегистрСведений.ТП_СостоянияДокументов ГДЕ Состояние = 7.40)
10 saf112
 
16.09.11
14:31
(9)Спасибо, понял, сейчас попробую!
11 saf112
 
16.09.11
14:42
(9) Рыжий Лис, все работает как надо, спасибо.

Не затруднит пояснить, почему в (1) вариант 3 работал правильно, а вариант 1 - нет? то есть,
   Первое условие
   И второе условие
-работало, а
   Первое условие
   И НЕ Второе условие
-нет?
12 Рыжий Лис
 
16.09.11
16:55
(11) В результате соединения по твоему запросу без условий получается табличка из 4 строк.
Регистратор1 Документ1 3.60 Регистратор1 Документ1 3.60
Регистратор2 Документ1 7.40 Регистратор1 Документ1 3.60
Регистратор1 Документ1 3.60 Регистратор2 Документ1 7.40
Регистратор2 Документ1 7.40 Регистратор2 Документ1 7.40
условие 1 запроса вернет 1-ю строку, 2 вернет 1 и 2, 3 вернет 2.
Запрос можно переписать и с соединениями, но понимания я думаю он не добавит.
13 saf112
 
19.09.11
16:18
(12) Спасибо, вроде понятно.
Еще возникла проблема в связи с изменениями. Теперь надо отобрать те же документы, только просроченные. Раньше, в варианте с соединениями, это выглядело так:
И РАЗНОСТЬДАТ(Регистр1.Период,Регистр2.Период,День) > 30
А теперь не у чего разность дат считать. Пытался скормить вложенный запрос, как аргумент РАЗНОСТЬДАТ - ругается.
14 Рыжий Лис
 
20.09.11
13:34
(13) Переписать на запрос с соединениями