Имя: Пароль:
1C
 
SQL-запрос. Как получить рекв-ты "Договор"и "Контрагент" из рег-а "КнигаПро
0 МастерВопросов
 
25.05.11
10:13
Ессно, не измерений, ни ресурсов таких в регистре нет.
Есть измерение "КредДокумент" и эти данные можно получать из этого документа. Но проблема в том, что это измерение неопредленного вида "Документ". И к какой конретно таблице джониться не понятно.


       ТекстЗапроса="
       |SELECT
       |    $ЗаявкаПокупателя.Контрагент [Контрагент $Справочник.Контрагенты]
       |   , ПокупателиОстатки.Фирма [Фирма $Справочник.Фирмы]
       |    , ПокупателиОстатки.Договор [Договор $Справочник.Договоры]
       |    , ПокупателиОстатки.СтавкаНП [СтавкаНП $Справочник.СтавкиНП]
       |    , ПокупателиОстатки.ВидДолга [ВидДолга $Перечисление.ВидыДолга]
       |    , ПокупателиОстатки.КредДокумент [КредДокумент $Документ]
       |    , Журнал.IDDOCDEF Документ_вид
       |    , Sum(ПокупателиОстатки.СуммаРубОстаток) СуммаСуммаРубОстаток
       |    , Sum(ПокупателиОстатки.СуммаНПОстаток) СуммаСуммаНПОстаток
       |    , Sum(ПокупателиОстатки.СебестоимостьОстаток) СуммаСебестоимостьОстаток
       |FROM $РегистрОстатки.Покупатели(,
       |        INNER JOIN _1SJOURN AS Журнал ON КредДокумент = Журнал.IDDOC,,,) AS ПокупателиОстатки
       |    INNER JOIN _1SJOURN AS Журнал ON ПокупателиОстатки.КредДокумент = Журнал.IDDOC
       |    LEFT OUTER JOIN $Документ.ЗаявкаПокупателя AS ЗаявкаПокупателя ON ЗаявкаПокупателя.IDDOC = Журнал.IDDOC
       |GROUP BY ПокупателиОстатки.Фирма
       |, ПокупателиОстатки.Договор
       |, ПокупателиОстатки.СтавкаНП
       |, ПокупателиОстатки.ВидДолга
       |, ПокупателиОстатки.КредДокумент
       |, Журнал.IDDOCDEF
       |";
1 МастерВопросов
 
25.05.11
10:17
пример для регистра "Покупатели", но не в этом суть...
2 Ёпрст
 
гуру
25.05.11
10:18
Нелепый запрос какой- то.
3 Ёпрст
 
гуру
25.05.11
10:19
особенно соедиение унутри ВТ.
4 МастерВопросов
 
25.05.11
10:20
(2) да да.
Он приджонивает только $Документ.ЗаявкаПокупателя, а надо все виды документов.
Ну я его по быстрому конструктором накидал.
5 viktor_vv
 
25.05.11
10:21
Джойнь все которые могут там быть, их наверное не так много. Ну и журнал туда приплетать необязательно, если кредДокумент общего вида, он и так типизируется по $Документ. И вот тут тоже непонятно как оно отрабатывает у тебя, если крдеДокумент общего вида.
6 viktor_vv
 
25.05.11
10:22
ПокупателиОстатки.КредДокумент = Журнал.IDDOC
7 МастерВопросов
 
25.05.11
10:22
+(3) и группировки по "$ЗаявкаПокупателя.Контрагент" нет
8 Ёпрст
 
гуру
25.05.11
10:24
INNER JOIN _1SJOURN AS Журнал ON ПокупателиОстатки.КредДокумент = Журнал.IDDOC

это  не верно, КредДокумент  - 13 символов, нужно кастрировать до 9 через substr
9 МастерВопросов
 
25.05.11
10:25
(5) а потом в селекте писать что то типа CAST When($ЗаявкаПокупателя.Контрагент is not null then $ЗаявкаПокупателя.Контрагент Else ... and) as НашКонтрагент
10 viktor_vv
 
25.05.11
10:27
Coalesce($ЗаявкаПокупателя.Контрагент,$ДругойДокумент.Контаргент,$ОпятьДругойКонтаргент.Контаргент) as Контрагент
11 Ёпрст
 
гуру
25.05.11
10:27
(9) можно через coalesce
12 МастерВопросов
 
25.05.11
10:30
(10)(11) Спасибо
13 МастерВопросов
 
25.05.11
10:30
а по (0) я думал есть типовое решение.
Всё таки нередко приходится дергать инфу из регистров.
14 Ёпрст
 
гуру
25.05.11
10:33
Короче, выкидывай везде упоминание о 1SJOURN  - это тебе не нужно там, далее тупо кредДокумент соединяй с нужными видами документов сразу через
on substring(ПокупателиОстатки.КредДокумент,5,9) = ЗаявкаПокупателя.IDDOC

ну и дальше имей
15 Ёпрст
 
гуру
25.05.11
10:33
клиентосов через (10)
16 viktor_vv
 
25.05.11
10:34
(13) В каком смысле типовое ? Можешь динамически формировать текст запроса, только придумать принцип по которому определять какие виды документов двигали или могут двигать регистр.
17 Ёпрст
 
гуру
25.05.11
10:36
Мля.. посмотрел на регистр и сам окуел - у тебя и так всё есть в нём.

Всё что написано выше  - в топку, далее тупо вытаскиваешь измерение Договор из регистра Покупатели (это же измерение!)

Ну и джойнишь справочник Договоры, и типизируешь его владельца - имеешь клиентоса.
18 viktor_vv
 
25.05.11
10:36
(16)+ Вернее какие виды есть в КредДокумент. Можно запросом по всему периоду, но не уверен насчет скорости, хотя по идее не сильно долго.
19 Ёпрст
 
гуру
25.05.11
10:36
Про всё остальное можешь забыть.
Меня тут не было..
:)
20 viktor_vv
 
25.05.11
10:37
(17) Ему из КнигиПродаж. Покупатели он как пример привел. Хотя я не знаю что там в КнигеПродаж есть.
21 МастерВопросов
 
25.05.11
10:38
(14)(15) спасибо
(17) речь идет о "Книге продаж" :-)
22 Ёпрст
 
гуру
25.05.11
10:39
(20)$РегистрОстатки.Покупатели ???
23 Ёпрст
 
гуру
25.05.11
10:39
(21) почему тогда в (0) $РегистрОстатки.Покупатели ?
24 МастерВопросов
 
25.05.11
10:40
(20) Измерения: КредДокумент, СтавкаНДС, ВидДолга.
Ресурсы: СуммаНДС, СуммаРуб, СуммаНП/
Реквизиты: КодОперации, ДокументОплаты, СтавкаНП, ЗаписьДополнительногоЛиста, КорректируемыйПериод
25 МастерВопросов
 
25.05.11
10:41
(22)(23) ну я ж грю, для примера накидал, конструктором. "Покупатели" стоит на строчку выше чем "КнигаПродаж"
26 viktor_vv
 
25.05.11
10:41
Я не очень в Российских типовых, страна немного другая :).
27 Ёпрст
 
гуру
25.05.11
10:42
(25) аа...

ну тогда читай (14)
:)
28 МастерВопросов
 
25.05.11
10:43
+(25) плюс "Покупатели" содержит гораздо меньше остатков, по нему запрос быстрее делается. А по "КнигаПродаж" на 15 мин задумывается. Я отрабатываю текст запроса пока на "Покупателях".
29 МастерВопросов
 
25.05.11
10:59
Заработало!

       ТекстЗапроса="
       |SELECT
       |    Coalesce($ПКО.Контрагент,$РКО.Контрагент,$Реализация.Контрагент,$СтрокаВыпискиРасход.Контрагент,$СтрокаВыпискиПриход.Контрагент) [Контрагент $Справочник.Контрагенты]
       |   , ПокупателиОстатки.Фирма [Фирма $Справочник.Фирмы]
       |    , ПокупателиОстатки.Договор [Договор $Справочник.Договоры]
       |    , ПокупателиОстатки.СтавкаНП [СтавкаНП $Справочник.СтавкиНП]
       |    , ПокупателиОстатки.ВидДолга [ВидДолга $Перечисление.ВидыДолга]
       |    , ПокупателиОстатки.КредДокумент [КредДокумент $Документ]
       |    , Sum(ПокупателиОстатки.СуммаРубОстаток) СуммаРуб
       |    , Sum(ПокупателиОстатки.СуммаНПОстаток) СуммаНП
       |    , Sum(ПокупателиОстатки.СебестоимостьОстаток) Себестоимость
       |   FROM $РегистрОстатки.Покупатели(:ВыбДата,,,,) AS ПокупателиОстатки
       |    LEFT OUTER JOIN $Документ.ПКО AS ПКО on substring(ПокупателиОстатки.КредДокумент,5,9) = ПКО.IDDOC
       |    LEFT OUTER JOIN $Документ.РКО AS РКО on substring(ПокупателиОстатки.КредДокумент,5,9) = РКО.IDDOC
       |    LEFT OUTER JOIN $Документ.Реализация AS Реализация on substring(ПокупателиОстатки.КредДокумент,5,9) = Реализация.IDDOC
       |    LEFT OUTER JOIN $Документ.СтрокаВыпискиРасход AS СтрокаВыпискиРасход on substring(ПокупателиОстатки.КредДокумент,5,9) = СтрокаВыпискиРасход.IDDOC
       |    LEFT OUTER JOIN $Документ.СтрокаВыпискиПриход AS СтрокаВыпискиПриход on substring(ПокупателиОстатки.КредДокумент,5,9) = СтрокаВыпискиПриход.IDDOC
       |GROUP BY ПокупателиОстатки.Фирма
       |, ПокупателиОстатки.Договор
       |, ПокупателиОстатки.СтавкаНП
       |, ПокупателиОстатки.ВидДолга
       |, ПокупателиОстатки.КредДокумент
       |, Coalesce($ПКО.Контрагент,$РКО.Контрагент,$Реализация.Контрагент,$СтрокаВыпискиРасход.Контрагент,$СтрокаВыпискиПриход.Контрагент)
       |";  

Правда кое-где пустые поля "Контрагент" возращаются, но это, видимо, еще не все виды документов учел
30 МастерВопросов
 
25.05.11
11:06
+(29) добавил еще КорректировкаДолга, ВводОстатковПокупателя, ВозвратОтПокупателя

пустых строк больше нет
31 Ёпрст
 
гуру
25.05.11
11:08
(29) Это, раз ты делаешь запрос к Покупатели, тогда нахрена всё ЭТО ????

Делай тогда (17) - это быстрее в РАЗЫ.
32 МастерВопросов
 
25.05.11
11:20
(31) сечас переделаю на книгу продаж.
Читай (28)
33 МастерВопросов
 
25.05.11
11:22
(31) кстати, по Покупателям, рабочий запрос такой:

       ТекстЗапроса="
       |SELECT
       |     Договоры.PARENTEXT [Контрагент $Справочник.Контрагенты]
       |   , ПокупателиОстатки.Фирма [Фирма $Справочник.Фирмы]
       |    , ПокупателиОстатки.Договор [Договор $Справочник.Договоры]
       |    , ПокупателиОстатки.СтавкаНП [СтавкаНП $Справочник.СтавкиНП]
       |    , ПокупателиОстатки.ВидДолга [ВидДолга $Перечисление.ВидыДолга]
       |    , ПокупателиОстатки.КредДокумент [КредДокумент $Документ]
       |    , Sum(ПокупателиОстатки.СуммаРубОстаток) СуммаРуб
       |    , Sum(ПокупателиОстатки.СуммаНПОстаток) СуммаНП
       |    , Sum(ПокупателиОстатки.СебестоимостьОстаток) Себестоимость
       |   FROM $РегистрОстатки.Покупатели(:ВыбДата,,,,) AS ПокупателиОстатки
       |    LEFT OUTER JOIN $Справочник.Договоры AS Договоры on ПокупателиОстатки.Договор = Договоры.ID
       |GROUP BY ПокупателиОстатки.Фирма
       |, ПокупателиОстатки.Договор
       |, ПокупателиОстатки.СтавкаНП
       |, ПокупателиОстатки.ВидДолга
       |, ПокупателиОстатки.КредДокумент
       |, Договоры.PARENTEXT
       |";  

может лучше Inner Join? Или без разницы?
34 МастерВопросов
 
25.05.11
11:32
+(32) переделал:

       ТекстЗапроса="
       |SELECT
       |    Coalesce($ПКО.Контрагент,$РКО.Контрагент,$Реализация.Контрагент,$СтрокаВыпискиРасход.Контрагент,$СтрокаВыпискиПриход.Контрагент,$ВозвратОтПокупателя.Контрагент,$ВводОстатковПокупателя.Контрагент,$КорректировкаДолга.Контрагент) [Контрагент $Справочник.Контрагенты]
       |    , КнигаПродаж.СтавкаНДС [СтавкаНДС $Перечисление.СтавкиНДС]
       |    , КнигаПродаж.ВидДолга [ВидДолга $Перечисление.ВидыДолга]
       |    , КнигаПродаж.КредДокумент [КредДокумент $Документ]
       |    , Sum(КнигаПродаж.СуммаНДСОстаток) СуммаНДС
       |    , Sum(КнигаПродаж.СуммаРубОстаток) СуммаРуб
       |    , Sum(КнигаПродаж.СуммаНПОстаток) СуммаНП
       |   FROM $РегистрОстатки.КнигаПродаж(:ВыбДата,,,,) AS КнигаПродаж
       |    LEFT OUTER JOIN $Документ.ПКО AS ПКО on substring(КнигаПродаж.КредДокумент,5,9) = ПКО.IDDOC
       |    LEFT OUTER JOIN $Документ.РКО AS РКО on substring(КнигаПродаж.КредДокумент,5,9) = РКО.IDDOC
       |    LEFT OUTER JOIN $Документ.Реализация AS Реализация on substring(КнигаПродаж.КредДокумент,5,9) = Реализация.IDDOC
       |    LEFT OUTER JOIN $Документ.СтрокаВыпискиРасход AS СтрокаВыпискиРасход on substring(КнигаПродаж.КредДокумент,5,9) = СтрокаВыпискиРасход.IDDOC
       |    LEFT OUTER JOIN $Документ.СтрокаВыпискиПриход AS СтрокаВыпискиПриход on substring(КнигаПродаж.КредДокумент,5,9) = СтрокаВыпискиПриход.IDDOC
       |    LEFT OUTER JOIN $Документ.ВозвратОтПокупателя AS ВозвратОтПокупателя on substring(КнигаПродаж.КредДокумент,5,9) = ВозвратОтПокупателя.IDDOC
       |    LEFT OUTER JOIN $Документ.ВводОстатковПокупателя AS ВводОстатковПокупателя on substring(КнигаПродаж.КредДокумент,5,9) = ВводОстатковПокупателя.IDDOC
       |    LEFT OUTER JOIN $Документ.КорректировкаДолга AS КорректировкаДолга on substring(КнигаПродаж.КредДокумент,5,9) = КорректировкаДолга.IDDOC
       |GROUP BY
       |  КнигаПродаж.СтавкаНДС
       |, КнигаПродаж.ВидДолга
       |, КнигаПродаж.КредДокумент
       |, Coalesce($ПКО.Контрагент,$РКО.Контрагент,$Реализация.Контрагент,$СтрокаВыпискиРасход.Контрагент,$СтрокаВыпискиПриход.Контрагент,$ВозвратОтПокупателя.Контрагент,$ВводОстатковПокупателя.Контрагент,$КорректировкаДолга.Контрагент)
       |";

Жду результата запроса....
Чот крепко 1С-ина зудмалась.
35 МастерВопросов
 
25.05.11
11:34
+(34) а блин, про договор то забыл.
Как тормознуть SQL запрос?!
36 viktor_vv
 
25.05.11
11:34
(33) Через Inner у тебя с пустым договором в измерении не попадут в выборку.
37 МастерВопросов
 
25.05.11
11:38
(36) ОК. Спасибо.
38 Ёпрст
 
гуру
25.05.11
11:38
попробуй наеборот, заместо субстринга, вид документа прибавлять (я не помню, как там надо написать, чтоб в индекс попасть)

substring(КнигаПродаж.КредДокумент,5,9) = СтрокаВыпискиРасход.IDDOC

замени на
КнигаПродаж.КредДокумент = $ВидДокумента36.СтрокаВыпискиРасход + СтрокаВыпискиРасход.IDDOC
39 МастерВопросов
 
25.05.11
11:42
+(38) так разве быстрее?
При "substring(КнигаПродаж.КредДокумент,5,9) = СтрокаВыпискиРасход.IDDOC" вроде меньшее количество символов сравнивается. И нет преобразования $ВидДокумента36.
40 viktor_vv
 
25.05.11
11:46
$ВидДокумента преобразовывается в момент трансляции текста запроса, не в момент выполнения. Я правда так пробовал, но особого выигрыша не увидел.
41 МастерВопросов
 
25.05.11
12:05
ТабОстатков = рс.ВыполнитьИнструкцию(ТекстЗапроса);    1    157.487874    42.96


это на substring
сейчас попробую на ВидДокумента36
42 Дык ё
 
25.05.11
12:12
(34) если есть графа отбора по контрагентам, все эти left outer можно выбросить нафиг
43 МастерВопросов
 
25.05.11
12:13
(42) но договор то всё равно нужен.

А как писать через графу отбора?
44 Ёпрст
 
гуру
25.05.11
12:14
(43) через _1crdoc
45 Ёпрст
 
гуру
25.05.11
12:15
(42)Дык сразу про неё и не вспомнишь.
46 МастерВопросов
 
25.05.11
12:40
(40) на скольлко я понимаю, $ВидДокумента36 транслирует первые пять цифр (вид документа), в какую то другую систему счисления. Поэтому он работает именно в момент запроса, а не трансляции текста. Или я заблуждаюсь?
Кстати мой запрос с вариантом на $ВидДокумента36 до сих пор еще не завершился. ИМХО работает значительно дольше чем на "substring". Устал ждать :-(
47 Ёпрст
 
гуру
25.05.11
12:44
(46) заблуждаешься, $ВидДокумента36 преобразуется ДО исполнения запроса на sql сервере, это делает метапарсер 1cpp


ЗЫ: я не помню уже, $ВидДокумента36 нужно втыкать или $ВидДокумента