Имя: Пароль:
1C
1C 7.7
v7: Запрос
,
0 galanUprCom
 
19.03.13
11:36
Имеются 2 объекта
1. Справочник договоров
2. Приходная с реквизитом Договор.

Необходимо получить список договор по которым не было создано Приходных(т.е. договоров которые не встречаются в Приходной).
Использрвать компоненту 1с++. Как сделать встроенным языком запросом?
1 galanUprCom
 
19.03.13
11:37
Имеются 2 объекта
1. Справочник договоров
2. Приходная с реквизитом Договор.

Необходимо получить список договоров по которым не было создано Приходных(т.е. договоров которые не встречаются в Приходной).
Использрвать компоненту 1с++ нельзя! . Как сделать встроенным языком запросом?
2 GLazNik
 
19.03.13
11:39
(0) одним встроенным запросом похоже не обойтись. думается мне что нужно получить отдельно договора, отдельно договора в документах.
3 galanUprCom
 
19.03.13
11:46
(2) Это получается 2-ной цикл(по договорам и протом по документам). Есть другие варианты.
4 Ёпрст
 
19.03.13
11:47
2 запроса и привет, самое простое
5 Ёпрст
 
19.03.13
11:47
можно и одним чорным обойтись.
6 galanUprCom
 
19.03.13
11:49
(5) Через 1c++ нельзя. А 2 запроса не предполагает потом 2-ной цикл?
7 Ёпрст
 
19.03.13
11:50
(6) про прямой запрос речь никто не ведёт.
Никаких циклов нет
8 galanUprCom
 
19.03.13
11:56
(7) Это как?
9 Ёпрст
 
19.03.13
12:00
Чего как ?
Если двумя запросами - то,
первый - запрос по документам с группировкой по договору, второй - запрос по справочнику с фильтром по результатам первого

если всё в одном - то запрос по справочнику с фильтром по внешней функции, или так попробовать соединить и условие на пустое значение договора в документе, не помню ужо, работает ли так чорный запрос или нет
10 galanUprCom
 
19.03.13
12:04
(9) второй - запрос по справочнику с фильтром по результатам первого? Это как?
11 Ёпрст
 
19.03.13
12:13
результат запроса выгрузить в ТЗ, ТЗ в СП, СП использовать в качестве фильтра
12 galanUprCom
 
19.03.13
12:43
Спасибо, получислоь след.:

Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
   "//{{ЗАПРОС(ДоговораИспользуемые)
   |Период с ДатаНач по ДатаКон;
   |ТекущийДокументДоговор = Документ.РасходнаяАвто.Договор;        
   |Группировка ТекущийДокументДоговор;
   |УСЛОВИЕ(ТекущийДокументДоговор.ДатаОкончания<ДатаПо);    
   |"    ;//}}ЗАПРОС
   
   // Если ошибка в запросе, то выход из процедуры
   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
       Возврат;
   КонецЕсли;
                   
   ТаблЗн=СоздатьОбъект("ТаблицаЗначений");
   Запрос.Выгрузить(ТаблЗн);
   
   СписокЗн=СоздатьОбъект("СписокЗначений");
   ТаблЗн.Выгрузить(СписокЗн);
   
   Запрос = СоздатьОбъект("Запрос");
   ТекстЗапроса =
   "//{{ЗАПРОС(ДоговораНеИспользуемые)
   |Договор = Справочник.Договора.ТекущийЭлемент;
   |Группировка Договор;
   |//УСЛОВИЕ(Договор.ДатаОкончания<ДатаПо);    
   |УСЛОВИЕ(СписокЗн.Принадлежит(Договор) = 0);
   |"    ;//}}ЗАПРОС
   
   // Если ошибка в запросе, то выход из процедуры
   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
       Возврат;
   КонецЕсли;

ТаблЗн.Очистить();
   Запрос.Выгрузить(ТаблЗн);                    
   ТаблЗн.ВыбратьСтроки();
   Пока ТаблЗн.ПолучитьСтроку()=1 Цикл
       Таб.ВывестиСекцию("Договор");
   КонецЦикла;
13 Ёпрст
 
19.03.13
12:46
(12)
   |УСЛОВИЕ(ТекущийДокументДоговор.ДатаОкончания<ДатаПо);  
вот это условие тормозит в разы выполнение запроса
14 galanUprCom
 
19.03.13
12:49
А как сделать одним запросом?
15 galanUprCom
 
19.03.13
12:50
(13) В первом запросе это лишнее
16 Ёпрст
 
19.03.13
12:51
(14)

// |УСЛОВИЕ(ТекущийДокументДоговор.ДатаОкончания<ДатаПо);  
|ДатаОкончания = Документ.РасходнаяАвто.Договор.ДатаОкончания;  
|УСЛОВИЕ(ДатаОкончания<ДатаПо);  


ЗЫ: в одном запросе, будет медленнее.. если условие делать во внешней функции

если тупо соединять запрос по справочнику и документу, не факт что проканает такое вообще (скорее нет, чем да)
17 galanUprCom
 
19.03.13
12:51
мне надо одним запросом, пусть медленнее но как?
18 Ёпрст
 
19.03.13
13:03
(17)
так, например:
ТекстЗапроса =
"   |Период с ДатаНач по ДатаКон;
   |ТекущийДокументДоговор =Документ.РасходнаяАвто.Договор,Справочник.Договоры.ТекущийЭлемент;      
   |Договор = Документ.РасходнаяАвто.Договор;
   |Группировка ТекущийДокументДоговор Все;
   |УСЛОВИЕ(ПустоеЗначение(Договор)=1);    
   |"   ;
19 galanUprCom
 
19.03.13
13:27
(18) выдает все договора
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший