Имя: Пароль:
1C
1C 7.7
v7: Дополнительное упорядочение в прямом запросе
,
0 Pit0n_08
 
29.05.15
11:15
Конфигурация - переписанная ТиС.
Товары лежат на складах по секциям (Регистр "Остатки" имеет измерения "Склад" и "Секция", справочник "СекцииХранения" подчинен справочнику "Склады").
Склады имеют приоритет отгрузки (реквизит "ПриоритетОтгрузки" тип число) и признак рабочего (реквизит "ИспользоватьДляОстатков" тип число 0/1 - флажок на форме).
В глобальном модуле прямой запрос возвращает ТЗ с остатками на рабочих складах по заданной Номенклатуре с колонками "Склад, Секция, Количество", отсортированную по приоритету склада.
Текст запроса:
  SELECT
    СпрСкл.ID as [Склад $Справочник.Склады],
    Секция as [Секция $Справочник.СекцииХранения],
    $СпрСкл.ПриоритетОтгрузки as [Количество $Число],
    SUM(КоличествоОстаток) as [Количество $Число]
  From
    $Справочник.Склады as СпрСкл
    Inner join $РегистрОстатки.ОстаткиТМЦ(:Пер~,,
                Номенклатура  =  :ВыбНоменклатура,
                (Склад,Секция), (Количество) as Рег
    on Рег.Склад = СпрСкл.ID
  Where
    $СпрСкл.ИспользоватьДляОстатков = '1'
  Group by $СпрСкл.ПриоритетОтгрузки, СпрСкл.ID, Секция
  Order by $СпрСкл.ПриоритетОтгрузки, СпрСкл.ID, Секция

Необходимо дополнительно упорядочить ТЗ по секциям. В строках по одному складу сначала должна идти основная секция, если там есть остатки, потом все остальные. При этом справочник "СекцииХраненияНоменклатуры" подчинен Номенклатуре и имеет реквизиты "Секция" (тип справочник "СекцииХранения") и "Основная" (тип число 0/1 - флажок на форме).
Запрос используется постоянно, дополнительных тормозов не хотелось бы. Подскажите, как сделать оптимально, желательно с фрагментами кода.
1 Pit0n_08
 
29.05.15
11:29
Up. В обычном запросе включил бы функцию, возвращающую признак Основной секции, а как с прямым?
2 Pit0n_08
 
29.05.15
11:51
Понимаю, что пятница, но всё же апну...
3 Pit0n_08
 
29.05.15
12:13
И даже мыслей по теме нет?
4 Ёпрст
 
29.05.15
12:17
и в прямом также, добавляешь реквизит, сортируешь по нему.
5 Pit0n_08
 
29.05.15
12:35
(4) но признак "Основная" есть только у спр. "СекцииХраненияНоменклатуры", а не у секции хранения в складе.
6 Ёпрст
 
29.05.15
12:37
(5) И ?
7 Ёпрст
 
29.05.15
12:38
присоединяй нужный справочник, получай нужный реквизит, втыкай сортировку по нему. Усё.
8 ДенисЧ
 
29.05.15
12:40
(7) Ты, блин, слишком сложно для пятницы говоришь ))
9 Pit0n_08
 
29.05.15
12:45
(7) с прямыми запросами работаю мало...
Как связать секции с остатками с секциями в номенклатуре?
10 Pit0n_08
 
29.05.15
12:46
Хоть рыбу какую-нить подкинь...
11 Ёпрст
 
29.05.15
12:50
(9) запрос у тебя получает данные по складу. При чем тут номенклатура - не ясно. Как и упорядочивание по "основной" секции, которая к складу не имеет никакого отношения, ибо это признак номенклатуры.
12 Ёпрст
 
29.05.15
12:52
разве что, этот запрос висит в формуле колонке в форме списка, поди , да ?
Видно, что для конкретной номенклатуры останки смотришь.
Тогда тупо лефт джоин СекцииХраненияНоменклатуры он паренттекст  = выбНоменклатура энд Секция = Рег.Секция.
усё.
13 Ёпрст
 
29.05.15
12:52
ну и в ордер бай твой реквизит основной . всё
14 Pit0n_08
 
29.05.15
12:54
(11) запрос получает данные по складам и по Номенклатура = :ВыбНоменклатура
и у ВыбНоменклатура есть Основная секция, на которой остатков может не быть вообще, но если они (остатки) есть, то они должны быть первыми.
15 Pit0n_08
 
29.05.15
12:55
(12) не, запрос при подборе в документ
16 Ёпрст
 
29.05.15
13:02
см. (12)
17 Pit0n_08
 
29.05.15
13:05
(12)может
Left join СекцииХраненияНоменклатуры on PARENTEXT  = выбНоменклатура and СекцииХраненияНоменклатуры.Секция = Рег.Секция
18 Pit0n_08
 
29.05.15
13:11
+(17) "СекцииХраненияНоменклатуры" подчинен Номенклатуре и имеет реквизит "Секция"
19 Ёпрст
 
29.05.15
13:18
типа того



|  SELECT
|    Рег.Склад as [Склад $Справочник.Склады],
|    Рег.Секция as [Секция $Справочник.СекцииХранения],
|    $СпрСкл.ПриоритетОтгрузки as [Количество $Число],
|    Sum(КоличествоОстаток) as [Количество $Число],
|   max(isnull($СекцииХраненияНоменклатуры.Секция,0)) as Основная
|  From
|    $Справочник.Склады as СпрСкл (nolock)
|    Inner join $РегистрОстатки.ОстаткиТМЦ(:Пер~,,Номенклатура  =  :ВыбНоменклатура,(Склад,Секция), (Количество) as Рег
|    on Рег.Склад = СпрСкл.ID
|   left join $Справочник.СекцииХраненияНоменклатуры as СекцииХраненияНоменклатуры (nolock) on
|   СекцииХраненияНоменклатуры.parentext =  :ВыбНоменклатура and  $СекцииХраненияНоменклатуры.Секция = Рег.Секция
|  Where
|    $СпрСкл.ИспользоватьДляОстатков = '1'
|  goup by Рег.Склад,Рег.Секция,$СпрСкл.ПриоритетОтгрузки
|  Order by $СпрСкл.ПриоритетОтгрузки, Рег.Склад,Основная desk,Рег.Секция
20 Ёпрст
 
29.05.15
13:20
на desc только поправь там.
21 Pit0n_08
 
29.05.15
13:21
(19) Огромное спасибо!
22 Pit0n_08
 
29.05.15
13:23
(19) может?
max(isnull($СекцииХраненияНоменклатуры.Основная,0)) as Основная
23 Pit0n_08
 
29.05.15
13:31
В итоге:
|  SELECT
|    Рег.Склад as [Склад $Справочник.Склады],
|    Рег.Секция as [Секция $Справочник.СекцииХранения],
|    $СпрСкл.ПриоритетОтгрузки as [Количество $Число],
|    Sum(КоличествоОстаток) as [Количество $Число],
|   max(isnull($СекцииХраненияНоменклатуры.Основная,0)) as Основная
|  From
|    $Справочник.Склады as СпрСкл (nolock)
|    Inner join $РегистрОстатки.ОстаткиТМЦ(:Пер~,,Номенклатура  =  :ВыбНоменклатура,(Склад,Секция), (Количество) as Рег
|    on Рег.Склад = СпрСкл.ID
|   left join $Справочник.СекцииХраненияНоменклатуры as СекцииХраненияНоменклатуры (nolock) on
|   СекцииХраненияНоменклатуры.parentext =  :ВыбНоменклатура and  $СекцииХраненияНоменклатуры.Секция = Рег.Секция
|  Where
|    $СпрСкл.ИспользоватьДляОстатков = '1'
|  group by Рег.Склад,Рег.Секция,$СпрСкл.ПриоритетОтгрузки
|  Order by $СпрСкл.ПриоритетОтгрузки, Рег.Склад,Основная desc,Рег.Секция
24 Ёпрст
 
29.05.15
13:34
(22) ага
25 Ёпрст
 
29.05.15
13:34
копипасте жжж
26 Pit0n_08
 
29.05.15
13:35
(25)нуж копипасте наше всё! Ещё раз спасибо.