Имя: Пароль:
1C
1С v8
Помогите составить запрос
0 alexei366
 
05.06.12
16:53
Необходимо ограничить список выбора контрагентов, выводить только тех которые не встречались в реквизите другого справочника (договоры). Вот скелет

Запрос.Текст = "ВЫБРАТЬ
                  |    Контрагенты.Ссылка,
                  |    Контрагенты.Наименование,
                  |    Контрагенты.Код
                  |ИЗ
                  |    Справочник.Контрагенты КАК Контрагенты
                  |        
                  | ";
1 shuhard
 
05.06.12
16:56
(0)ВЫБРАТЬ
   Контрагенты.Ссылка
ИЗ
   Справочник.Контрагенты КАК Контрагенты
       ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
       ПО Контрагенты.Ссылка = ДоговорыКонтрагентов.Владелец
ГДЕ
   ДоговорыКонтрагентов.Ссылка ЕСТЬ NULL
   И Контрагенты.ЭтоГруппа = ЛОЖЬ
2 alexei366
 
05.06.12
17:01
Про это я думал уже, а вложенный запрос в условии не работает?
3 ОператорПК
 
05.06.12
17:12
(0) На формах списков работает конструкция "Не в" так что можно  получить список:

ВЫБРАТЬ
   ДоговорыКонтрагентов.Владелец
ИЗ
   Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов

и использовать "Не в списке"
4 alexei366
 
05.06.12
17:29
ВЫБРАТЬ
   Контрагенты.Ссылка
ИЗ

   Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов

Где  использовать Не В (Выбрать Договоры.Владелец Из Справочник Договоры КАК Договоры )



Типо того?
5 ОператорПК
 
05.06.12
17:39
(4) можно и так, только зачем? В (3) все проще.
6 shuhard
 
05.06.12
17:42
(2) вложенный запрос работает в разы медленнние
7 alexei366
 
05.06.12
17:51
Так в будущем мне понадобиться к примеру выводить список контрагентов, с указанием количества подчиненных справочников по каждому из них.Вот вложенный запрос в качестве итогового поля у меня не получается, посылает подальше, это вообще возможно в 1с 8.2. Пример


ВЫБРАТЬ
   Контрагенты.Ссылка,
   (Выбрать Количество(*) Из Справочник.ПодчиненныйСпр КАК ПодчиненныйСпр Где ПодчиненныйСпр.Владелец = Контрагенты.Ссылка) КАК Количество
ИЗ

   Справочник.Контрагенты КАК Контрагенты
8 alexei366
 
05.06.12
17:52
ИЛИ же придётся сначало групировать по владельцу подчинённый , а потом лепить Контрагентов
9 shuhard
 
05.06.12
17:58
(7) ВЫБРАТЬ
   ДоговорыКонтрагентов.Владелец КАК Контрагент,
   КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДоговорыКонтрагентов.Ссылка) КАК ЧислоДоговоров
ИЗ
   Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов

СГРУППИРОВАТЬ ПО
   ДоговорыКонтрагентов.Владелец
10 alexei366
 
05.06.12
18:07
Итог какойто такой, кто что скажит и добавит



Процедура АвтоподборЗаказчик(Текст,СсИспол,ДанныеВыбора) Экспорт
   
   ДанныеВыбора = Новый СписокЗначений;
   
   
   
   Запрос = Новый Запрос;
   Запрос.Текст = "ВЫБРАТЬ
                  |    Контрагенты.Ссылка,
                  |    Контрагенты.Наименование,
                  |    Контрагенты.Код
                  |ИЗ
                  |    Справочник.Контрагенты КАК Контрагенты
                  |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеИсполнителя КАК ДанныеИсполнителя
                  |        ПО Контрагенты.Ссылка = ДанныеИсполнителя.Контрагент.Ссылка
                  |ГДЕ
                  |    Контрагенты.Наименование ПОДОБНО &Наим
                  |    И ДанныеИсполнителя.Контрагент.Ссылка ЕСТЬ NULL
                  |    И Контрагенты.Ссылка НЕ В (Выбрать Договоры.Заказчик.Ссылка Из Справочник.Договоры КАК Договоры Где Договоры.Исполнитель.Ссылка = &Исполн)";
   
   
   Запрос.УстановитьПараметр("Наим","%"+Текст+"%");
   Запрос.УстановитьПараметр("Исполн",СсИспол);
   
   Выборка = Запрос.Выполнить().Выбрать();
   
   Пока Выборка.Следующий() Цикл
       ДанныеВыбора.Добавить(Выборка.Ссылка,Выборка.Наименование+" ("+Выборка.Код+")");
   КонецЦикла;

КонецПроцедуры
11 alexei366
 
05.06.12
18:12
А почему тута ругается на условие?


|    Контрагенты.Наименование ПОДОБНО &Наим
                  |    И (Выбрать Количество(*) ИЗ РегистрСведений.ДанныеИсполнителя КАК ДанныеИсполнителя1 Где ДанныеИсполнителя1.Контрагент.Ссылка = Контрагенты.Ссылка) = 0
12 sergeante
 
05.06.12
18:14
(11) бред написал
13 alexei366
 
05.06.12
18:14
Последнее или предпоследнее?
14 hhhh
 
05.06.12
18:15
(13) вот это

Выбрать Количество(*) ИЗ РегистрСведений.ДанныеИсполнителя КАК ДанныеИсполнителя1 Где ДанныеИсполнителя1.Контрагент.Ссылка = Контрагенты.Ссылка

не число.

А ты его с нулем сравниваешь.
15 sergeante
 
05.06.12
18:15
(10) разыменовывание полей до ссылки "Договоры.Заказчик.Ссылка" - атата! Вложеный запрос - атата! Тебе ж написали как - левым соединением с фильтрацией по NULL!

делай как (6) и (9)
16 sergeante
 
05.06.12
18:17
(14) ага, ещё и в условии.
17 alexei366
 
05.06.12
18:24
А для интереса как правильно написать


И (Выбрать Количество(*) ИЗ РегистрСведений.ДанныеИсполнителя КАК ДанныеИсполнителя1 Где ДанныеИсполнителя1.Контрагент.Ссылка = Контрагенты.Ссылка) = 0
18 shuhard
 
05.06.12
18:32
(17) Открой для себя HAVING
19 alexei366
 
05.06.12
18:33
Если не впадлу, покажешь на примере, как это в 1с. На постгресе то я знаю
20 alexei366
 
05.06.12
18:33
Пытаюсь по анологии с постгресом писать
21 shuhard
 
05.06.12
18:33
(19) в 1С так же как на постгресе
22 alexei366
 
05.06.12
18:34
вот это в постгресе работает без проблем



И (Выбрать Количество(*) ИЗ РегистрСведений.ДанныеИсполнителя КАК ДанныеИсполнителя1 Где ДанныеИсполнителя1.Контрагент.Ссылка = Контрагенты.Ссылка) = 0
23 alexei366
 
05.06.12
18:35
вот это даже как отдельное поле не выведешь в итоги

(Выбрать Количество(*) ИЗ РегистрСведений.ДанныеИсполнителя КАК ДанныеИсполнителя1 Где ДанныеИсполнителя1.Контрагент.Ссылка = Контрагенты.Ссылка)
КАК Колич
24 SUA
 
05.06.12
18:40
(23)->(9)