Имя: Пароль:
1C
1С v8
Проверка отсутствия строк
0 psknyazev
 
07.01.12
19:48
Есть справочник с табличной частью, в которой две колонки. Назовем их "Свойство" и "Значение". Возможно ли запросом выбрать элементы где "Свойство" и "Значение" совпадают с заданными либо строка с заданным "Свойством" отсутствует вовсе? Выбрать элементы с совпадением проблем нет, а как можно включить в результат запроса элементы, в табличной части которых строка с заданным "Свойством" отсутствует?

Просьба не посылать за книгами или баблом. Лучше просто промолчите :)
1 kotletka
 
07.01.12
20:02
NULL ?
2 psknyazev
 
07.01.12
20:06
Не пройдет. Проблема не в том, что "Значение" у данного "Свойства" не задано, а в том, что строки с таким "Свойством" может вообще не быть.

А насколько я помню NULL - пустое значение.
3 kotletka
 
07.01.12
20:07
null -когда строки нет
4 psknyazev
 
07.01.12
20:20
Это мой запрос

ВЫБРАТЬ
   ГруппировкиХарактеристикСвойстваИЗначения.Ссылка КАК Ссылка
ИЗ
   Справочник.ГруппировкиХарактеристик.СвойстваИЗначения КАК ГруппировкиХарактеристикСвойстваИЗначения
ГДЕ
   ГруппировкиХарактеристикСвойстваИЗначения.Свойство ЕСТЬ NULL

Где ступил?
5 hhhh
 
07.01.12
20:22
вообще нет проверки заданного свойства. И соединений не видно.
6 patapum
 
07.01.12
20:22
а отдельно два запроса можешь написать? а потом их собрать по Объединить
7 psknyazev
 
07.01.12
20:24
Так приведенный запрос и должен выбрать только те элементы, у которых свойство не указано. Соединения я потом сделаю.
8 psknyazev
 
07.01.12
20:25
ВЫБРАТЬ
   ГруппировкиХарактеристикСвойстваИЗначения.Ссылка КАК Ссылка
ИЗ
   Справочник.ГруппировкиХарактеристик.СвойстваИЗначения КАК ГруппировкиХарактеристикСвойстваИЗначения
ГДЕ
   ГруппировкиХарактеристикСвойстваИЗначения.Свойство ЕСТЬ NULL;
9 psknyazev
 
07.01.12
20:26
че то код неверно выделяется.
Вот условие: ГДЕ ГруппировкиХарактеристикСвойстваИЗначения.Свойство ЕСТЬ NULL;
10 Buster007
 
07.01.12
20:47
мдя... без свойства может быть значение? и свойство какого типа?
11 psknyazev
 
07.01.12
21:01
Вот описание условия, при котором элемент должен попасть в результат запроса:

(Свойство=&ЗаданноеСвойство И Значение=&ЗаданноеЗначение) ИЛИ (....Строка, содержащая &ЗаданноеСвойство отсутствует....)

Меня интересует, как в запросе описать условие, указанное во вторых скобках?
12 andrewks
 
07.01.12
21:02
выбери табл часть в соединении с спр. свойств
13 psknyazev
 
07.01.12
21:10
Не понял..
14 psknyazev
 
07.01.12
21:12
пока соединения не касаюсь..
В данный момент мне нужно только:

Если (....Строка, содержащая &ЗаданноеСвойство отсутствует....)  Тогда
  Включаем в результат
Иначе
  Не включаем

Вот как такой запрос составить?
15 ЗашелСпросить
 
07.01.12
21:13
16 andrewks
 
07.01.12
21:13
(13)понимаешь, язык sql - это тебе не паскаль, и не си. его нужно понять, прочувствовать его логику. это как пролог - перед тем, как сесть писать программу на прологе, нужно выкинуть из памяти всё то, что знаешь из алгоритмических языков
17 psknyazev
 
07.01.12
21:16
В общем пять строк кода никто привести не может?
18 psknyazev
 
07.01.12
21:20
Давайте на другом примере: Нужно выбрать документы реализации, у которых в табличной части НЕТ определенной номенклатуры. Запрос на пять - семь строк, неужели ни у кого подобной задачи не возникало?
19 andrewks
 
07.01.12
21:22
покажи запрос, который у тебя сейчас (полный)
20 H A D G E H O G s
 
07.01.12
21:22
Лениво.
21 H A D G E H O G s
 
07.01.12
21:23
(16) Пусть вам Пролог в липких ночных кошмарах присниться.

"Джон овладевает бананом" © Иносказательный пересказ условия задачи на паре по Прологу.
22 andrewks
 
07.01.12
21:25
(18) и в чём проблема? делай соединение со справочником номенклатуры

(21) :-)
23 psknyazev
 
07.01.12
21:25
"|ВЫБРАТЬ
|    ГруппировкиХарактеристикСвойстваИЗначения.Ссылка
|ИЗ
|    Справочник.ГруппировкиХарактеристик.СвойстваИЗначения КАК ГруппировкиХарактеристикСвойстваИЗначения
|ГДЕ
|    ГруппировкиХарактеристикСвойстваИЗначения.Свойство ЕСТЬ NULL
|";
24 andrewks
 
07.01.12
21:26
(23) я сказал - полный. ты говорил, что сейчас уже он у тебя выбирает по условию заданного свойства там, и т.д. где он?
25 psknyazev
 
07.01.12
21:29
ВЫБРАТЬ
   ГруппировкиХарактеристик.Ссылка
ИЗ
   (ВЫБРАТЬ
       ГруппировкиХарактеристикСвойстваИЗначения.Ссылка КАК Ссылка
   ИЗ
       Справочник.ГруппировкиХарактеристик.СвойстваИЗначения КАК ГруппировкиХарактеристикСвойстваИЗначения
   ГДЕ
       ГруппировкиХарактеристикСвойстваИЗначения.Свойство = &Свойство
       И ГруппировкиХарактеристикСвойстваИЗначения.Значение = &Значение) КАК ПоСовпадению
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппировкиХарактеристик КАК ГруппировкиХарактеристик
           ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
               ГруппировкиХарактеристикСвойстваИЗначения.Ссылка КАК Ссылка
           ИЗ
               Справочник.ГруппировкиХарактеристик.СвойстваИЗначения КАК ГруппировкиХарактеристикСвойстваИЗначения
           ГДЕ
               ГруппировкиХарактеристикСвойстваИЗначения.Свойство ЕСТЬ NULL ) КАК ПоОтсутствию
           ПО ПоОтсутствию.Ссылка = ГруппировкиХарактеристик.Ссылка
       ПО ПоСовпадению.Ссылка = ГруппировкиХарактеристик.Ссылка
26 Фокусник
 
07.01.12
21:33
(0) нужно таблицу со всеми свойствами соединить (левое соединение) с таблицей из тч справочника, содержащей значения. В колонке Значения будут либу существующие значения, либо нулл
27 psknyazev
 
07.01.12
21:43
Свойства я могу получить только в виде таблицы значений.
29 H A D G E H O G s
 
07.01.12
21:44
пардон

ВЫБРАТЬ
   РеализацияТоваровУслугТовары.Ссылка,
   СУММА(ВЫБОР
           КОГДА РеализацияТоваровУслугТовары.Номенклатура = &НенужнаяНоменклатура
               ТОГДА 0
           ИНАЧЕ 1
       КОНЕЦ) КАК КоличествоВерныхСтрок,
   СУММА(1) КАК КоличествоСтрок
ИЗ
   Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары

СГРУППИРОВАТЬ ПО
   РеализацияТоваровУслугТовары.Ссылка

ИМЕЮЩИЕ
   СУММА(ВЫБОР
           КОГДА РеализацияТоваровУслугТовары.Номенклатура = &НенужнаяНоменклатура
               ТОГДА 0
           ИНАЧЕ 1
       КОНЕЦ) = СУММА(1)
30 H A D G E H O G s
 
07.01.12
21:44
Без всяких лишних Соединений.
31 GROOVY
 
07.01.12
21:45
(27) Вам же уже неоднократно написали: надо соединить справочник с таблицей свойств и делать проверку на неприсоединенное значение. Что еще непонятного? Какая разница в виде чего у Вас таблица с свойсвами?
32 psknyazev
 
07.01.12
22:00
В табличной части может вообще не быть строки с таким свойством, в этом случае соединения не произойдет, связывать не по чему. Или я неправ?
33 GROOVY
 
07.01.12
22:03
Из справочника выбираем все, из таблицы со свойствами по условию соедиения пытаемся выбрать соответствия, опосля проверяем исоединились свойства или нет.
34 psknyazev
 
07.01.12
22:03
Вот пример справочника:
Элемент1
Размер - 104
Цвет - Белый

Элемент2
Размер - 110
Цвет - Черный

Элемент3
Размер - 104

Мне нужно, чтобы при условии "Размер - 104, Цвет - Белый" в результат попали Элемент1 и Элемент3
35 GROOVY
 
07.01.12
22:08
ВЫБРАТЬ
Спр.Ссылка
ИЗ
Справочник.НАЗВАНИЕСПРАВОЧНИКА КАК Спр
ЛЕВОЕ СОЕДИНЕНИЕ
НАЗВАНИЕТАБЛИЦЫССВОЙСТВАМИ КАК Свойства
ПО
Спр.Ссылка = Свойства.Номенклатура
ГДЕ
Свойства.Свойство = &НужноеСвойство ИЛИ Свойства.Свойство ЕСТЬ NULL
36 GROOVY
 
07.01.12
22:10
(34) А почему под описанные условия не попадает Элемент2? У него ведь нет свойства "Цвет"!

Вообще похоже что условие нужно и на вид свойства и на само свойство. Условие описано в задаче криво. Попробйте сформулировать точное условие хотя бы на русском языке.
37 psknyazev
 
07.01.12
22:11
У элемента2 цвет - черный
38 psknyazev
 
07.01.12
22:13
У элемента2 цвет - черный. Поэтому и не попадает.
39 GROOVY
 
07.01.12
22:15
Ну тогда в условии соединения надо добавить условие на вид свойства, а в где ничего не поменяется.
Вроде бы. Не проверял.
40 psknyazev
 
07.01.12
22:15
Справочник со свойствами никак не связан со справочником номенклатуры и о номенклатуре речи вообще не было.
41 GROOVY
 
07.01.12
22:17
(40) Элемент1, Элемент2 какой тип значения имеют?
42 psknyazev
 
07.01.12
22:20
Это просто элементы справочника, а у них в табличной части уже идет сопоставление (то что я под ними написал)
43 GROOVY
 
07.01.12
22:23
(42) Если у элемента не заполнена таблица с "сопоставлениями" он по условию должен попасть в выборку?
44 psknyazev
 
07.01.12
22:26
Она может быть заполнена частично, либо не заполнена вовсе. В обоих случаях должна попасть.
45 psknyazev
 
07.01.12
22:27
Ну в смысле элемент должен попасть
46 GROOVY
 
07.01.12
22:29
(45) Следовательно первичная выборка должна быть из таблицы справонника где гарантированно есть все элементы, а потом уже на нее накладывать условия надо, на свойства или на то что их нет.
47 psknyazev
 
07.01.12
22:32
ВЫБРАТЬ
   ГруппировкиХарактеристик.Ссылка
ИЗ
   Справочник.ГруппировкиХарактеристик КАК ГруппировкиХарактеристик
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппировкиХарактеристик.СвойстваИЗначения КАК ГруппировкиХарактеристикСвойстваИЗначения
       ПО (ГруппировкиХарактеристикСвойстваИЗначения.Свойство = &Свойство0)
           И (ГруппировкиХарактеристикСвойстваИЗначения.Значение = &Значение0)
           И ГруппировкиХарактеристик.Ссылка = ГруппировкиХарактеристикСвойстваИЗначения.Ссылка
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппировкиХарактеристик.СвойстваИЗначения КАК ГруппировкиХарактеристикСвойстваИЗначения1
       ПО (ГруппировкиХарактеристикСвойстваИЗначения1.Свойство = &Свойство1)
           И (ГруппировкиХарактеристикСвойстваИЗначения1.Значение = &Значение1)
           И ГруппировкиХарактеристик.Ссылка = ГруппировкиХарактеристикСвойстваИЗначения1.Ссылка
ГДЕ (ГруппировкиХарактеристикСвойстваИЗначения.Свойство = &Свойство0 ИЛИ ГруппировкиХарактеристикСвойстваИЗначения.Свойство ЕСТЬ NULL)
   И (ГруппировкиХарактеристикСвойстваИЗначения1.Свойство = &Свойство1 ИЛИ ГруппировкиХарактеристикСвойстваИЗначения1.Свойство ЕСТЬ NULL)

Пробовал так, но так выбирает точное совпадение.
48 psknyazev
 
07.01.12
22:34
Если есть элемент у которого Свойство совпадает со свойством0, а Значение совпадает со Значением0, но вообще нет упоминаний о Свойстве1 - он не попадает в такую выборку.
49 GROOVY
 
07.01.12
22:34
(47) Внимательно читаем (35) Особенно последнюю строку.
Зачем два соединения делать?!
50 psknyazev
 
07.01.12
22:39
ВЫБРАТЬ
   ГруппировкиХарактеристик.Ссылка
ИЗ
   Справочник.ГруппировкиХарактеристик КАК ГруппировкиХарактеристик
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппировкиХарактеристик.СвойстваИЗначения КАК ГруппировкиХарактеристикСвойстваИЗначения
       ПО ГруппировкиХарактеристик.Ссылка = ГруппировкиХарактеристикСвойстваИЗначения.Ссылка
ГДЕ
   ((ГруппировкиХарактеристикСвойстваИЗначения.Свойство = &Свойство0 И ГруппировкиХарактеристикСвойстваИЗначения.Значение = &Значение0)
           ИЛИ ГруппировкиХарактеристикСвойстваИЗначения.Свойство ЕСТЬ NULL )
   И ((ГруппировкиХарактеристикСвойстваИЗначения.Свойство = &Свойство1 И ГруппировкиХарактеристикСвойстваИЗначения.Значение = &Значение1)
           ИЛИ ГруппировкиХарактеристикСвойстваИЗначения.Свойство ЕСТЬ NULL )

Так вообще не отрабатывает.
51 GROOVY
 
07.01.12
22:43
(50) Естественно, у Вас же противоречивое условие "Свойство = Свойство1 И Свойство = Свойство0" - это условие всегда будет ложным.
52 psknyazev
 
07.01.12
22:44
Так свойств то может быть несколько. Поэтому и сделаны были несколько соединений.
53 GROOVY
 
07.01.12
22:46
(52) Даже после этой фразы условие никогда не вернет Истину.
54 psknyazev
 
07.01.12
22:48
Да я понял... я про предыдущий запрос. там где два соединения.
55 GROOVY
 
07.01.12
22:48
В условие соединения добавьте условие не свойства (через оператор "В").
В условие ГДЕ добавьте также проверку на вхождение в список, а лучше на сочетание (Свойство, Значение) В (ВЫБРАТЬ &Свойство, &Значение) ИЛИ Значение ЕСТЬ NULL.

Как то так.
56 psknyazev
 
07.01.12
23:08
Результат не поменялся. Ладно, посижу еще подумаю. Спасибо за помощь.
57 andrewks
 
07.01.12
23:24
(29) как насчёт доков с пустыми ТЧ? или если анализируемых позиций номенклатуры несколько?
58 andrewks
 
07.01.12
23:47
+(57)

у меня как-то так получилось:



   | select
   |  СпрНомен.Ссылка
   | into ТабНомен
   | from
   |  Справочник.Номенклатура as СпрНомен
   | where (СпрНомен.Наименование like &ВыбНаим+"%")
   |
   | ;
   |
   | select
   |  ПрихНакл.Ссылка
   | ,ПрихНакл.Склад
   | ,sum(case when СпрНомен.Ссылка=ПрихНаклМат.Материал then 1 else 0 end) as КолСовпадений
   | from
   |  Документ.ПриходнаяНакладная as ПрихНакл
   | left join
   |  Документ.ПриходнаяНакладная.Материалы as ПрихНаклМат
   | on (ПрихНакл.Ссылка=ПрихНаклМат.Ссылка)
   |,ТабНомен as СпрНомен
   | group by
   |  ПрихНакл.Ссылка
   | ,ПрихНакл.Склад
   | having (sum(case when СпрНомен.Ссылка=ПрихНаклМат.Материал then 1 else 0 end)=0) //доки, не имеющие в ТЧ ни одной из позиций
   //| having (sum(case when СпрНомен.Ссылка=ПрихНаклМат.Материал then 1 else 0 end)>0) //доки, имеющие в ТЧ хотя бы одну из позиций
   | order by ПрихНакл.Ссылка

59 psknyazev
 
08.01.12
01:10
Вопрос остается открытым:

ВЫБРАТЬ
   ГруппировкиХарактеристик.Ссылка,
   ГруппировкиХарактеристикСвойстваИЗначения.Свойство,
   ГруппировкиХарактеристикСвойстваИЗначения.Значение
ИЗ
   Справочник.ГруппировкиХарактеристик КАК ГруппировкиХарактеристик
       ПОЛНОЕ СОЕДИНЕНИЕ Справочник.ГруппировкиХарактеристик.СвойстваИЗначения КАК ГруппировкиХарактеристикСвойстваИЗначения
       ПО ГруппировкиХарактеристик.Ссылка = ГруппировкиХарактеристикСвойстваИЗначения.Ссылка
       ПОЛНОЕ СОЕДИНЕНИЕ Справочник.ГруппировкиХарактеристик.СвойстваИЗначения КАК ГруппировкиХарактеристикСвойстваИЗначения1
       ПО ГруппировкиХарактеристик.Ссылка = ГруппировкиХарактеристикСвойстваИЗначения1.Ссылка
ГДЕ
   (ГруппировкиХарактеристикСвойстваИЗначения.Ссылка ЕСТЬ NULL
   ИЛИ ГруппировкиХарактеристикСвойстваИЗначения.Значение = &Значение0)
   И
   (ГруппировкиХарактеристикСвойстваИЗначения1.Ссылка ЕСТЬ NULL
   ИЛИ ГруппировкиХарактеристикСвойстваИЗначения1.Значение = &Значение1)

С этим запросом в результат попадает и элемент, у которого оба свойства совпадают, и элемент, у которого вообще не заполнена табличная часть. Стоит в него добавить даже пустую строку, как он пропадает из результата. Что не так?
60 andrewks
 
08.01.12
11:16
(59) ты не читатель, да?


вот тебе ещё один пример с документами, для справочников аналогично



   | select
   |  ПрихНакл.Ссылка
   | ,ПрихНакл.Склад
   | from
   |  Документ.ПриходнаяНакладная as ПрихНакл
   | left join
   |  Документ.ПриходнаяНакладная.Материалы as ПрихНаклМат
   | on (ПрихНакл.Ссылка=ПрихНаклМат.Ссылка)
   | group by
   |  ПрихНакл.Ссылка
   | ,ПрихНакл.Склад
   | having (sum(case when (ПрихНаклМат.Материал=&ВыбМатериал) then ПрихНаклМат.Количество else 0 end)>&ВыбКоличество)
   |  or (sum(case when (ПрихНаклМат.Материал=&ВыбМатериал) then ПрихНаклМат.Количество else 0 end)=0)
   |  //доки, имеющие в ТЧ такую позиции в количестве заданном, либо большем, либо не имеющие в ТЧ такой позиции, либо не имеющие ТЧ
   | order by ПрихНакл.Ссылка

61 psknyazev
 
08.01.12
13:36
Вот конечный вариант:
ВЫБРАТЬ
   Группировки.Ссылка
ИЗ
   Справочник.ГруппировкиХарактеристик КАК Группировки
       ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ГруппировкиХарактеристик.СвойстваИЗначения КАК ГруппировкиХарактеристикСвойстваИЗначения
       ПО Группировки.Ссылка = ГруппировкиХарактеристикСвойстваИЗначения.Ссылка
       ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ГруппировкиХарактеристик.СвойстваИЗначения КАК ГруппировкиХарактеристикСвойстваИЗначения1
       ПО Группировки.Ссылка = ГруппировкиХарактеристикСвойстваИЗначения1.Ссылка

СГРУППИРОВАТЬ ПО
   Группировки.Ссылка

ИМЕЮЩИЕ
   (СУММА(ВЫБОР
               КОГДА ГруппировкиХарактеристикСвойстваИЗначения.Свойство = &Свойство0
                       И ГруппировкиХарактеристикСвойстваИЗначения.Значение = &Значение0
                       И ГруппировкиХарактеристикСвойстваИЗначения1.Свойство = &Свойство1
                       И ГруппировкиХарактеристикСвойстваИЗначения1.Значение = &Значение1
                   ТОГДА 1
               ИНАЧЕ 0
           КОНЕЦ) > 0
       ИЛИ СУММА(ВЫБОР
               КОГДА ГруппировкиХарактеристикСвойстваИЗначения.Свойство = &Свойство0
                       И ГруппировкиХарактеристикСвойстваИЗначения1.Свойство = &Свойство1
                   ТОГДА 1
               ИНАЧЕ 0
           КОНЕЦ) = 0)

УПОРЯДОЧИТЬ ПО
   Группировки.Ссылка

Пока вроде работает как надо.
62 psknyazev
 
08.01.12
13:41
andrewks, спасибо!