|   |   | 
| 
 | Оптимизация запроса из трех таблиц | ☑ | ||
|---|---|---|---|---|
| 0
    
        slowklg 21.06.16✎ 17:28 | 
        Здравствуйте. Подскажите как лучше сделать.
 Делаю отчет по товарам в конкретной ячейке склада. Из регистров МестаХранения, ТоварыНаСкладах (по определенному складу) и справочника Номенклатура (для артикула). Если делаю одним запросом (с упорядочиванием по количеству), то не получаю номенклатуру с остатком 0. Если делать последовательно двумя запросами (получить всю номенклатуру для конкретной ячейки) и для каждой получать количество, то заметно дольше выполняется и нет упорядочивания по кол-ву. Как лучше сделать? | |||
| 1
    
        Ёпрст гуру 21.06.16✎ 17:33 | 
        зачем вам весь справочник номенклатура ?     | |||
| 2
    
        torgm 21.06.16✎ 17:34 | 
        Я так понимаю УТ 10?
 Места хранения - Это РС? тогда Места хранения левый джоин товары на складах. | |||
| 3
    
        Ёпрст гуру 21.06.16✎ 17:35 | 
        К примеру, у нас несколько тысяч позиций номенклатуры, из которых на складе есть всего пара сотен. Зачем в отчете нужны эти тясячи "нулей" ?     | |||
| 4
    
        impulse9 21.06.16✎ 17:35 | 
        (0) "то не получаю номенклатуру с остатком 0"
 Надо нужные галочки проставить во вкладке "Связи" | |||
| 5
    
        faramund 21.06.16✎ 17:35 | 
        (0) Запросы по регистрам разнеси по двум временным таблицам, проиндексируй по соединяемому полю, в твоем случае это номенклатура, как я  понял. В параметрах виртуальных таблиц остатков по максимому необходимые условия (напрмиер Организация, Склад и т.п.)
 Итоговый запрос это запрос по всему справочнику номенклатура (Таблица номенклатура) и левое соединение к двум верхним временным таблицам по ссылке. Поля в запросе: Номерклатуру берешь из таблицы номенклатура, значения остатков из временных таблиц остатков, обязательно еспользуй конструкцию ЕстьNULL к выбираемым ресурсным полям | |||
| 6
    
        Guk 21.06.16✎ 17:36 | 
        (3) чтобы было видно, что НЕТУ товара!...     | |||
| 7
    
        faramund 21.06.16✎ 17:37 | 
        (5) "по ссылке" читать как "по номенклатуре"     | |||
| 8
    
        impulse9 21.06.16✎ 17:37 | 
        (5) судя по первому сообщению, парню рано еще про "левые соединения" рассказывать     | |||
| 9
    
        slowklg 21.06.16✎ 17:57 | 
        (4) а какие галочки и куда? я так понимаю, что в регистре накопления "ТоварыНаСкладах" на тек.момент нет записи с отсутствующим товаром в данном складе.
 (8) левые соединения то я использую в запросе, а вот со временными таблицами да, сложности. Подскажите тег здешний для вставки кода, чтоб я свой запрос выложил, или он ненужен? (5) про конструкцию ЕстьNULL, это для чего? а то есть у меня подозрение, что она то мне и нужна | |||
| 10
    
        Михаил Козлов 21.06.16✎ 18:13 | 
        (6) А товары, которые ВООБЩЕ никогда не участвовали в товарообороте тоже можно считать, что "НЕТУ"?
 Ваша ситуация полностью аналогична обычному отчету по остаткам: нет остатка - нет и в отчете. | |||
| 11
    
        slowklg 21.06.16✎ 18:16 | 
        (10) товар приписанный к конкретной ячейке конкретного склада (месту хранения), остатков щас нет, а завтра к примеру появятся     | |||
| 12
    
        Михаил Козлов 22.06.16✎ 15:38 | 
        (11) Ну и чем тогда не годится левое соединение справочника номенклатуры с остатками регистра?     | |||
| 13
    
        ptiz 22.06.16✎ 15:42 | 
        (0) "Как лучше сделать?" - показать текст запроса.     | |||
| 14
    
        slowklg 23.06.16✎ 10:42 | 
        (12) Не годится тем, что не выдает номенклатуру, приписанную с ячейке с отстатком 0. запрос - 
 "ВЫБРАТЬ | МестаХраненияНоменклатуры.Номенклатура, | СпрНоменклатура.Артикул, | СпрНоменклатура.БазоваяЕдиницаИзмерения, | ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток |ИЗ | РегистрСведений.МестаХраненияНоменклатуры КАК МестаХраненияНоменклатуры | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНоменклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки | ПО СпрНоменклатура.Ссылка = ТоварыНаСкладахОстатки.Номенклатура | ПО МестаХраненияНоменклатуры.Номенклатура.Ссылка = СпрНоменклатура.Ссылка |ГДЕ | МестаХраненияНоменклатуры.МестоХранения.Ссылка = &Ячейка | И ТоварыНаСкладахОстатки.Склад.Ссылка = &Склад | |УПОРЯДОЧИТЬ ПО | КоличествоОстаток УБЫВ"; | |||
| 15
    
        catena 23.06.16✎ 10:47 | 
        И ТоварыНаСкладахОстатки.Склад.Ссылка = &Склад
 нужно перенести в соединение | |||
| 16
    
        catena 23.06.16✎ 10:47 | 
        ТоварыНаСкладахОстатки.КоличествоОстаток
 Заменить на ЕстьNULL(ТоварыНаСкладахОстатки.КоличествоОстаток,0), если потом с количеством нужно производить манипуляции. | |||
| 17
    
        Ёпрст гуру 23.06.16✎ 10:48 | 
        Ну и писать, лучше так:
 И ТоварыНаСкладахОстатки.Склад.Ссылка.ССылка.ССылка.ССылка.ССылка = &Склад чтоб наверняка! | |||
| 18
    
        slowklg 23.06.16✎ 11:53 | 
        (16) Попробовал замену на ЕстьNULL, ничего не изменилось. номенклатуры с остатком 0 не выдаёт. (17) Точно! забыл я ещё пару-тройку ссылок поставить, а если серьёзно, спасибо, лишние выкинул     | |||
| 19
    
        ptiz 23.06.16✎ 11:57 | 
        (14) лютая жесть
 (17) +1 1: убрать ересь типа ".Склад.Ссылка" 2: сначала сделать запрос к РегистрСведений.МестаХраненияНоменклатуры и поместить результат в ВТ - и её использовать вместо обращения к регистру на последнем этапе 3: в ТоварыНаСкладах.Остатки вставить отбор по складу и товарам из ВТ из пункта 2 | |||
| 20
    
        catena 23.06.16✎ 12:01 | 
        (18)А (15) намеренно было проигнорировано??     | |||
| 21
    
        vde69 23.06.16✎ 12:05 | 
        ВЫБРАТЬ
 | МестаХраненияНоменклатуры.Номенклатура, | естьNULL(ТоварыНаСкладахОстатки.КоличествоОстаток,0) КАК КоличествоОстаток |ИЗ | РегистрСведений.МестаХраненияНоменклатуры КАК МестаХраненияНоменклатуры | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки | ПО МестаХраненияНоменклатуры.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура |ГДЕ | МестаХраненияНоменклатуры.МестоХранения= &Ячейка | И ТоварыНаСкладахОстатки.Склад= &Склад | |УПОРЯДОЧИТЬ ПО | КоличествоОстаток УБЫВ"; чего покажет? | |||
| 22
    
        vde69 23.06.16✎ 12:07 | 
        (21) правда тут есть логическая ошибка которая может приводить к задвоению и затроению остатка, предлогаю ее найти самому     | |||
| 23
    
        Михаил Козлов 23.06.16✎ 12:16 | 
        ГДЕ
 ... И ТоварыНаСкладахОстатки.Склад= &Склад Это и отрубает (превращает левое соединение во внутреннее). Поставьте условие на склад в условие виртуальной таблицы остатков. | |||
| 24
    
        vde69 23.06.16✎ 12:17 | 
        (23) его вообще лучше убрать это условие, ведь ячейка однозначно находится на складе     | |||
| 25
    
        vde69 23.06.16✎ 12:18 | 
        ВЫБРАТЬ 
 | МестаХраненияНоменклатуры.Номенклатура, | естьNULL(ТоварыНаСкладахОстатки.КоличествоОстаток,0) КАК КоличествоОстаток |ИЗ | РегистрСведений.МестаХраненияНоменклатуры КАК МестаХраненияНоменклатуры | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки | ПО МестаХраненияНоменклатуры.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура |ГДЕ | МестаХраненияНоменклатуры.МестоХранения= &Ячейка | |УПОРЯДОЧИТЬ ПО | КоличествоОстаток УБЫВ"; вот так!!! | |||
| 26
    
        slowklg 23.06.16✎ 12:47 | 
        (25)без этого условия выдаётся остаток этой номенклатуры по всем складам, а мне нужен только по одному.     | |||
| 27
    
        Ёпрст гуру 23.06.16✎ 12:49 | 
        (26) 
 ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки | ПО МестаХраненияНоменклатуры.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура И ТоварыНаСкладахОстатки.Склад= &Склад | |||
| 28
    
        Ёпрст гуру 23.06.16✎ 12:50 | 
        хотя, если у тебя ячейка принадлежит разным складам - хз, что там у вас за учёт такой нелепый.     | |||
| 29
    
        vde69 23.06.16✎ 12:59 | 
        (26) ты возьми МОЙ запрос из (25) а не в своем убирай условие     | |||
| 30
    
        slowklg 23.06.16✎ 13:00 | 
        (28) вот жеж косноязычие то моё... ячейка принадлежит одному складу, к той ячейке приписана определённая номенклатура, по которой я соединением получаю кол-во остатков, но в регистре накопления остатков записи по номенклатуре расписаны по разным складам, из которых мне нужен только один (а если его нет, т.е. кол-во 0, то и записи не вернёт по запросу)     | |||
| 31
    
        Ёпрст гуру 23.06.16✎ 13:02 | 
        (28) если ячейка принадлежит одному складу, условие на склад - лишнее     | |||
| 32
    
        catena 23.06.16✎ 13:06 | 
        (31)Так у него Номенклатура может принадлежать разным ячейкам же.     | |||
| 33
    
        slowklg 23.06.16✎ 13:06 | 
        (29) взял, и что с того? количество остатков номенклатуры выдаёт по всем складам.     | |||
| 34
    
        catena 23.06.16✎ 13:07 | 
        (30)ПОТОМУ  ЧТО у тебя условие на склад отрезает нулевые количества... И тебе уже раз 30 здесь сказали, что это условие надо перенести в связь.     | |||
| 35
    
        Ёпрст гуру 23.06.16✎ 13:08 | 
        (32) аа..., ну тогда (25) + (27) 
 :) | |||
| 36
    
        trad 23.06.16✎ 13:13 | 
        (28) у него не "ячейка принадлежит разным складам", а номенклатура может быть на разных складах     | |||
| 37
    
        slowklg 23.06.16✎ 13:16 | 
        (34) да это я понимал и так. послезавтра, как время появится, возьму книжку и буду вспоминать язык запросов 1с, чтоб тонкости со связями и внутренними таблицами реализовывать. а то когда этим годами не пользуешься, то напрочь забывается. Меня вот озадачило условие на ограничение доступа к полям в справочниках "прочие поля - ГДЕ Ложь", я так понимаю, что это просто чтоб никакие поля не подходили, но для чего тогда право-то на чтение давать с таким условием?     | |||
| 38
    
        trad 23.06.16✎ 13:16 | 
        (35) а артикул?     | |||
| 39
    
        slowklg 23.06.16✎ 13:17 | 
        (38) да артикул с ед.изм они выкинули, не беда, добавить то не долго     | |||
| 40
    
        trad 23.06.16✎ 13:18 | 
        (14)+(15)
 вопрос закрыт | |||
| 41
    
        vde69 23.06.16✎ 13:20 | 
        (33) условие по складу запихни в отбор виртуальной таблицы остатков (внутри скобок) тогда будет валидно, но все равно не всегда ибо остатки по складам ведутся более чем по 2м измерениям, и если ты юзаешь хоть одно измерение остаков кроме номенклатуры и склада - будет задвоение о чем я писал раньше....     | |||
| 42
    
        vde69 23.06.16✎ 13:23 | 
        ВЫБРАТЬ 
 | МестаХраненияНоменклатуры.Номенклатура, | естьNULL(ТоварыНаСкладахОстатки.КоличествоОстаток,0) КАК КоличествоОстаток |ИЗ | РегистрСведений.МестаХраненияНоменклатуры КАК МестаХраненияНоменклатуры | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &Склад) КАК ТоварыНаСкладахОстатки | ПО МестаХраненияНоменклатуры.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура |ГДЕ | МестаХраненияНоменклатуры.МестоХранения= &Ячейка | |УПОРЯДОЧИТЬ ПО | КоличествоОстаток УБЫВ"; | |||
| 43
    
        slowklg 23.06.16✎ 13:35 | 
        (42) спасибо, оно. ну и я вернул ещё свои артикул и ед.изм.
 И подскажите, если знаете про условие на ограничение доступа к полям в некоторых справочниках "прочие поля - ГДЕ Ложь", зачем это? | |||
| 44
    
        catena 23.06.16✎ 13:37 | ||||
| 45
    
        slowklg 23.06.16✎ 13:39 | 
        (44)благодарю ещё раз, про перенос условия в соединение Вы тоже писали, спасибо     | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |