Имя: Пароль:
1C
1C 7.7
v7: ПЗ - Запрос нетипизированных доков с отбором по товару в ТЧ
0 monsterZE
 
11.07.12
16:53
продолжим тему ПЗ =)
есть запрос выбирающий все доки с отбором по клиенту..
как бы еще наложить на него условие проверки ТЧ доков, на присутствие в них выбранного товара?.. покурив мануал нарисовал:
[основной запрос]
INNER JOIN
 $ДокументСтроки.РасходнаяНал as Док ON Док.IDDoc = Жур.IDDoc AND $Док.Товар = :ВыбТовар";
работает.. но как написать, если доки в выборке не типизированы? точнее присутствую несколько видов документов.
1 monsterZE
 
12.07.12
14:42
так что, если в выборке содержатся документы разных типов, нельзя в самом запросе накладывать дополнительные условия по содержанию тч или общим реквизитам (если для них не стоит галка отбор)?
2 Mikeware
 
12.07.12
14:44
(1) джойнить со всеми таблицами строк
3 monsterZE
 
12.07.12
14:54
вобщем что возвращает первый запрос - сортировать по док_вид и делать еще запросы, подставляя в отбор иддок-и из первого..
хотелось типа универсальной выборки документов по реквизитам сделать.. =)
4 Ёпрст
 
12.07.12
14:57
(2) зачем из первого ?
Там union all нужно между запросами к документам
5 Mikeware
 
12.07.12
15:03
(4) можно union all, можно coalesce
6 Ёпрст
 
12.07.12
15:08
(5) дык юнион в разы быстрее будет
:)
7 monsterZE
 
12.07.12
15:09
(4) запрос вот такой, с отбором по клиенту (клиент - графа отбора)
   |SELECT
   |    Жур.DocNo НомерД,
   |    Жур.IDDoc as [Док $Документ],
   |    Жур.IDDocDef as Док_вид
   |FROM
   |    _1SJourn as Жур (NOLOCK)
[..]
+ возможные условия по периоду, видам дока, состоянию (проведен/удален)
есть общие реквизиты (без отбора) и табличная часть.. если я не знаю какого вида документы попали в выборку, делать джойн по всем возможным типам? или как-то можно по результирующей табличке? =)
8 monsterZE
 
12.07.12
15:10
если выбраны конкретные виды доков, то понятно.. вопрос. если они не выбраны =)
9 Ёпрст
 
12.07.12
15:11
(7) если клиент графа отбора, то вообще ничего не надо - лефт джоин с 1скрдок и привет.
10 monsterZE
 
12.07.12
15:12
смысл "зачем" я думаю понятен - чтобы быстро найти доки, отвечающие заданным условиям
11 Ёпрст
 
12.07.12
15:12
И это, мот всю задачу целиком озвучишь ?
12 monsterZE
 
12.07.12
15:12
(9) да ее то я джойню и это как-бы первая часть марлезонского балета =)
13 monsterZE
 
12.07.12
15:14
хочу чтобы чел (например я), мог найти все документы соответствующие заданным условиям.. такая выборка.
по товару в тч, по автору, за период, удален, проведен, непроведен
14 Ёпрст
 
12.07.12
15:14
(12) если условие на табличную часть и нет графы отбора - то через обход метаданных выгребаешь нужные виды доков, имя реквизита ТЧ и лепишь свой запрос.
15 Mikeware
 
12.07.12
15:14
(6) не всегла
16 Ёпрст
 
12.07.12
15:15
если есть условие по товару - присоединяешь ТЧ доков, если нет - не присоединяешь.
Остальное, удален, проведен, непроведен - всё есть в 1sjourn
17 Ёпрст
 
12.07.12
15:16
(15) ээ.. например ?
18 monsterZE
 
12.07.12
15:18
(16) ну я к тому и веду, что надо присединять таблички доков, виды которых попали в первую выборку.. а если я не знаю (конкретно не выбрано), то, значит два запроса
19 Ёпрст
 
12.07.12
15:19
(18) ? всегда один запрос. Откуда два то ?
Сам текст запроса строится в зависимости от условий.
20 Mikeware
 
12.07.12
15:19
(17) проджойнить таблицы к журналу, а реквизиты собрать в коаелске 0 быстрее, чем несколько селектов через юнион олл
21 Ёпрст
 
12.07.12
15:19
И че за "первая" выборка у тебя ?
22 monsterZE
 
12.07.12
15:19
в любом случае надо обращаться к табличке конкретного документа. если на реквизитах нет галки отбор.
23 Ёпрст
 
12.07.12
15:20
(20) да ну ?.. не верю.. замеры есть ?
:)
24 monsterZE
 
12.07.12
15:22
(21) "первая выборка", это то, что получается если не подтягивать выбранные конкретно виды документов. т.е. содержащая отбор только по клиенту, период, закрытый док, удален..
25 Mikeware
 
12.07.12
15:23
(23) Повспоминать надо...
26 Mikeware
 
12.07.12
15:23
(24) строй запрос динамически
27 monsterZE
 
12.07.12
15:32
(26) =) я и строю
но, если не знаю, какие виды доков попадут в запрос, подтягивать все возможные таблички? т.е. по всем видам?
---
   ТекстЗапроса = "
   |SELECT
   |    Жур.DocNo НомерД,
   |    Жур.IDDoc as [Док $Документ],
   |    Жур.IDDocDef as Док_вид
   |FROM
   |    _1SJourn as Жур (NOLOCK)
   |INNER JOIN
   |    _1SCRDOC Отбор ON Отбор.ChildID = Жур.IDDoc";

   // клиент
   Если ОтборКлиент=1 Тогда                                  
       ТекстЗапроса = ТекстЗапроса+"
       |                  AND Отбор. MDID = $ГрафаОтбора.Клиент";
       Если ВыбКлиент.ЭтоГруппа()=1 Тогда
           ТекстЗапроса = ТекстЗапроса+"
           |AND Отбор.ParentVal IN (Select 'B1'+$ВидСправочника36.Клиенты+Val from #Группа)";
           Запрос.УложитьСписокОбъектов(ВыбКлиент, "#Группа","Клиенты");
       Иначе
           ТекстЗапроса = ТекстЗапроса+"
           |AND Отбор.ParentVal = :ВыбКлиент*";
           Запрос.УстановитьТекстовыйПараметр("ВыбКлиент", ВыбКлиент);  
       КонецЕсли;
   Иначе
       ТекстЗапроса = ТекстЗапроса+"
       |                  AND Отбор. MDID = 0";
   КонецЕсли;
       
   // период
   Если ФлгЗаВесьПериод=0 Тогда
       ТекстЗапроса = ТекстЗапроса + "
       |AND Отбор.Child_Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~";
       Запрос.УстановитьТекстовыйПараметр("НачДата", НачДата);  
       Запрос.УстановитьТекстовыйПараметр("КонДата", КонДата);  
   КонецЕсли;
   
   // статы-документа
   Если СтатУдален=0 Тогда
       ТекстЗапроса = ТекстЗапроса + "
       |AND Жур.ISMARK = 0";
   Иначе
       ТекстЗапроса = ТекстЗапроса + "
       |AND Жур.ISMARK = 1";
   КонецЕсли;
   Если (СтатПроведен=1) и (СтатНепроведен=0) Тогда
       ТекстЗапроса = ТекстЗапроса + "
       |AND Жур.Closed & 1 = 1";
   ИначеЕсли (СтатПроведен=0) и (СтатНепроведен=1) Тогда
       ТекстЗапроса = ТекстЗапроса + "
       |AND Жур.Closed & 1 = 0";
   КонецЕсли;

   // по всем типам документов
   Если ФлгДокВсе=0 Тогда
       // выбран конкретный тип документа    
       Если ВыбТипДок.Выбран()=1 Тогда    
           ТекстЗапроса = ТекстЗапроса + "
           |AND Жур.IDDocDef = $ВидДокумента."+ВыбТипДок.Идентификатор();
       Иначе
           Операнд = "
           |AND (";
           Если ТипРасхНал=1 Тогда
               ТекстЗапроса = ТекстЗапроса+Операнд+"Жур.IDDocDef = $ВидДокумента.РасходнаяНал";
               Операнд = " OR ";
           КонецЕсли;
           Если ТипРасхНОФ=1 Тогда
               ТекстЗапроса = ТекстЗапроса+Операнд+"Жур.IDDocDef = $ВидДокумента.РасходнаяНОФ";
               Операнд = " OR ";
           КонецЕсли;        
           Если ТипПрихНал=1 Тогда
               ТекстЗапроса = ТекстЗапроса+Операнд+"Жур.IDDocDef = $ВидДокумента.ПриходнаяНал";
               Операнд = " OR ";
           КонецЕсли;        
           Если ТипСчет=1 Тогда
               ТекстЗапроса = ТекстЗапроса+Операнд+"Жур.IDDocDef = $ВидДокумента.Счет";
               Операнд = " OR ";
           КонецЕсли;        
           Если ТипСчетФакт=1 Тогда
               ТекстЗапроса = ТекстЗапроса+Операнд+"Жур.IDDocDef = $ВидДокумента.Счет_фактура";
               Операнд = " OR ";
           КонецЕсли;        
           ТекстЗапроса = ТекстЗапроса+")";
       КонецЕсли;    
   КонецЕсли;
28 Ёпрст
 
12.07.12
15:38
(27) OR надо избегать в условии
заместо этого, пиши так

Жур.IDDocDef in ($ВидДокумента.РасходнаяНал,$ВидДокумента.Счет_фактура,.....)
29 monsterZE
 
12.07.12
15:40
(28) хорошо
30 Ёпрст
 
12.07.12
15:43
(25) ща в 1sqa накидал простецкий запрос для 2-х видов документов.. чет-то coalesce проигрывает юниону.. намного
:)
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.