Имя: Пароль:
1C
1С v8
Можно ли оптимизировать такой запрос в динамическом списке номенклатуры?
,
0 Prog111
 
10.03.17
10:30
В форме списка справочника "Номенклатура" типовой УТ 11.3 набросал запрос в динамическом списке, чтобы получать на форме списка остатки (общие и по определенным складам, а также резервы и заказы):


ВЫБРАТЬ
    СпрНоменклатура.Ссылка КАК Ссылка,
    СпрНоменклатура.Код КАК Код,
    СпрНоменклатура.Наименование КАК Наименование,
    СпрНоменклатура.Артикул КАК Артикул,
    СпрНоменклатура.ВидНоменклатуры КАК ВидНоменклатуры,
    СпрНоменклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
    СпрНоменклатура.СтавкаНДС КАК СтавкаНДС,
    СпрНоменклатура.Родитель,
    ВЫБОР
        КОГДА СпрНоменклатура.ЕстьТоварыДругогоКачества
            ТОГДА 4 + ВЫБОР
                    КОГДА СпрНоменклатура.ПометкаУдаления
                        ТОГДА 1
                    ИНАЧЕ 0
                КОНЕЦ + ВЫБОР
                    КОГДА СпрНоменклатура.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(Перечисление.ВариантыИспользованияХарактеристикНоменклатуры.НеИспользовать)
                        ТОГДА 0
                    ИНАЧЕ 2
                КОНЕЦ
        ИНАЧЕ ВЫБОР
                КОГДА СпрНоменклатура.ПометкаУдаления
                    ТОГДА 1
                ИНАЧЕ 0
            КОНЕЦ + ВЫБОР
                КОГДА СпрНоменклатура.ИспользованиеХарактеристик = ЗНАЧЕНИЕ(Перечисление.ВариантыИспользованияХарактеристикНоменклатуры.НеИспользовать)
                    ТОГДА 0
                ИНАЧЕ 2
            КОНЕЦ
    КОНЕЦ КАК ИндексКартинки,
    ТоварыНаСкладахОстаткиИОбороты.ВНаличииКонечныйОстаток КАК ОбщийОстаток,
    ТоварыНаСкладахОстаткиИОбороты1.ВНаличииКонечныйОстаток КАК ВНаличииКонечныйОстаток1,
    ТоварыНаСкладахОстаткиИОбороты2.ВНаличииКонечныйОстаток КАК ВНаличииКонечныйОстаток2,
    ТоварыНаСкладахОстаткиИОбороты3.ВНаличииКонечныйОстаток КАК ВНаличииКонечныйОстаток3,
    ТоварыНаСкладахОстаткиИОбороты4.ВНаличииКонечныйОстаток КАК ВНаличииКонечныйОстаток4,
    ТоварыНаСкладахОстаткиИОбороты5.ВНаличииКонечныйОстаток КАК ВНаличииКонечныйОстаток5,
    ЗаказыПоставщикамОстаткиИОбороты.ЗаказаноКонечныйОстаток КАК ЗаказаноКонечныйОстаток,
    ЗаказыКлиентовОстаткиИОбороты.ЗаказаноКонечныйОстаток КАК ЗаказыКлиентовКонечныйОстаток
ИЗ
    Справочник.Номенклатура КАК СпрНоменклатура
        ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты КАК ТоварыНаСкладахОстаткиИОбороты
        ПО (ТоварыНаСкладахОстаткиИОбороты.Номенклатура = СпрНоменклатура.Ссылка)
        ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(, , , , Склад = &Склад1) КАК ТоварыНаСкладахОстаткиИОбороты1
        ПО (ТоварыНаСкладахОстаткиИОбороты1.Номенклатура = СпрНоменклатура.Ссылка)
        ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(, , , , Склад = &Склад2) КАК ТоварыНаСкладахОстаткиИОбороты2
        ПО (ТоварыНаСкладахОстаткиИОбороты2.Номенклатура = СпрНоменклатура.Ссылка)
        ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(, , , , Склад = &Склад3) КАК ТоварыНаСкладахОстаткиИОбороты3
        ПО (ТоварыНаСкладахОстаткиИОбороты3.Номенклатура = СпрНоменклатура.Ссылка)
        ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(, , , , Склад = &Склад4) КАК ТоварыНаСкладахОстаткиИОбороты4
        ПО (ТоварыНаСкладахОстаткиИОбороты4.Номенклатура = СпрНоменклатура.Ссылка)
        ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(, , , , Склад = &Склад5) КАК ТоварыНаСкладахОстаткиИОбороты5
        ПО (ТоварыНаСкладахОстаткиИОбороты5.Номенклатура = СпрНоменклатура.Ссылка)
        ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПоставщикам.ОстаткиИОбороты КАК ЗаказыПоставщикамОстаткиИОбороты
        ПО (ЗаказыПоставщикамОстаткиИОбороты.Номенклатура = СпрНоменклатура.Ссылка)
        ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыКлиентов.ОстаткиИОбороты КАК ЗаказыКлиентовОстаткиИОбороты
        ПО (ЗаказыКлиентовОстаткиИОбороты.Номенклатура = СпрНоменклатура.Ссылка)
ГДЕ
    НЕ СпрНоменклатура.ЭтоГруппа
{ГДЕ
    (СпрНоменклатура.Ссылка В
            (ВЫБРАТЬ
                Сегменты.Номенклатура
            ИЗ
                РегистрСведений.НоменклатураСегмента КАК Сегменты
            ГДЕ
                Сегменты.Сегмент = &СегментНоменклатуры))}


Но работает не очень шустро - подвисает при прокрутке страниц, порой весьма ощутимо. Можно ли как-то оптимизировать запрос, чтобы ускорить прокрутку справочника и вообще его использование?
1 DrShad
 
10.03.17
10:34
в корне не верно, у демонических списков уже есть специализированное расширение для подобных задач

ищите на ИТС
2 DrShad
 
10.03.17
10:35
3 Prog111
 
10.03.17
10:39
(1) Гугление выдает только такие методы (с соединением к регистрам).

(2) Там приписка: "Планируется в версии 8.3.10".
4 DrShad
 
10.03.17
11:04
статья от июля 2016, так что вполне вероятно что уже реализовали в более ранних версиях
5 DrShad
 
10.03.17
11:04
шерстите возможности платформы - механизм описан
6 Elatiell
 
10.03.17
11:11
В запросе куча соединений с виртуальными таблицами - это плохо и так делать нельзя, вдобавок к этому еще и количество остаток из "остатков и оборотов" берешь...

Сделай лучше отчетом, динамические списки не для этого придуманы. Либо откажись от динамического списка в пользу таблицы.
7 Prog111
 
10.03.17
11:21
(6) Да, спасибо, сделаю соединение только с таблицами остатков, а не "Остатков и оборотов".

Заказчик требует, поэтому отчет не устроит, нужна оперативная работа менеджеров с остатками.
8 Dmitrii
 
гуру
10.03.17
11:22
(6) >> количество остаток из "остатков и оборотов" берешь...

+1
Собственно совершенно непонятно зачем.

Кроме указания правильной виртуальной таблицы, больше тут оптимизировать некуда.

Работать быстро это угрёбище не сможет по определению.
И даже варианты типа (2) после выхода платформы 8.3.10 вряд ли сильно помогут.
9 Dmitrii
 
гуру
10.03.17
11:25
(7) >> нужна оперативная работа менеджеров с остатками

Придумайте им другой инструмент.
Этот быстро работать не будет никогда.
А по мере роста базы ситуация будет только ухудшаться.
А если, не дай бог, завтра вырастет количество складов с 5 до 10, количество различных позиций номенклатуры и количество номенклатуры единовременно висящей на остатках, то ваш список вообще перестанет работать. Угадайте с трёх раз - кто будет крайним.
10 Prog111
 
10.03.17
11:31
(9) Какие ещё могут быть инструменты, помимо отчета?
11 HardBall
 
10.03.17
11:32
Пятничный мега-пост.
ППЦ в квадрате.
12 Diman000
 
10.03.17
11:33
Динсписки хороши только в элементарных запросах.
ВЫБОР в них большое зло.
И непонятно зачем тут все эти соединения с разными виртуальными таблицами, имеющими один физический базис.
13 HardBall
 
10.03.17
11:34
Походу был взят список с рекомендациями по улучшению производительности и каждый пункт сделан наоборот.
14 HardBall
 
10.03.17
11:36
Там нужна была одна таблица остатков  и "Выбор-Конец" для остатков по складам, + сумма остатков.
15 Prog111
 
10.03.17
11:59
А как в данном запросе получить остатки по разным складам? Вот в этой части запроса получаю общие остатки, а также остатки по складу №1 и №2 (передаваемые параметрами в форме). Разве здесь можно избавиться от соединения к нескольким таблицам?

ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты КАК ТоварыНаСкладахОстаткиИОбороты
        ПО (ТоварыНаСкладахОстаткиИОбороты.Номенклатура = СпрНоменклатура.Ссылка)
        ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(, , , , Склад = &Склад1) КАК ТоварыНаСкладахОстаткиИОбороты1
        ПО (ТоварыНаСкладахОстаткиИОбороты1.Номенклатура = СпрНоменклатура.Ссылка)
        ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(, , , , Склад = &Склад2) КАК ТоварыНаСкладахОстаткиИОбороты2
        ПО (ТоварыНаСкладахОстаткиИОбороты2.Номенклатура = СпрНоменклатура.Ссылка)
16 HardBall
 
10.03.17
12:04
ВЫБРАТЬ
    СпНоменклатура.Ссылка,
    СпНоменклатура.Код,
    ТоварыНаСкладахОстатки.ВНаличииОстаток,
    ТоварыНаСкладахОстатки.ВРезервеОстаток,
    МАКСИМУМ(ВЫБОР
            КОГДА ТоварыНаСкладахОстатки.Склад = &Склад1
                ТОГДА ТоварыНаСкладахОстатки.ВНаличииОстаток
            ИНАЧЕ 0
        КОНЕЦ) КАК Остаток1,
    МАКСИМУМ(ВЫБОР
            КОГДА ТоварыНаСкладахОстатки.Склад = &Склад2
                ТОГДА ТоварыНаСкладахОстатки.ВНаличииОстаток
            ИНАЧЕ 0
        КОНЕЦ) КАК Остаток2,
    МАКСИМУМ(ВЫБОР
            КОГДА ТоварыНаСкладахОстатки.Склад = &Склад3
                ТОГДА ТоварыНаСкладахОстатки.ВНаличииОстаток
            ИНАЧЕ 0
        КОНЕЦ) КАК Остаток3
ИЗ
    Справочник.Номенклатура КАК СпНоменклатура
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
        ПО СпНоменклатура.Ссылка = ТоварыНаСкладахОстатки.Номенклатура

СГРУППИРОВАТЬ ПО
    СпНоменклатура.Ссылка,
    СпНоменклатура.Код,
    ТоварыНаСкладахОстатки.ВНаличииОстаток,
    ТоварыНаСкладахОстатки.ВРезервеОстаток
17 Prog111
 
10.03.17
12:22
(16) Спасибо, буду пробовать.
18 Dmitrii
 
гуру
10.03.17
12:23
(10) >> Какие ещё могут быть инструменты, помимо отчета?

Ну откуда же мне знать ))) Это ваши менеджеры и вам лучше знать как они работают и что им реально нужно.

Но я с 99% уверенностью могу предположить, что менеджеру нахрен не надо видеть остаток одновременно по пяти складам по всей отображаемой номенклатуре да ещё и в момент пролистывания/прокрутки списка.
19 Prog111
 
10.03.17
12:25
(18) Ну не знаю... По-моему, это самая распространенная задача - когда менеджеру звонит (или приходит) клиент, и нужно оперативно знать, на каком складе есть нужный или схожий товар и в каком количестве.
20 Elatiell
 
10.03.17
12:38
(19) И менеджер, для выполнения своей задачи, открывает отчет и смотрит где, сколько, почему, зачем, как и когда. :D
21 Dmitrii
 
гуру
10.03.17
12:42
(19) Ключевое слово - "ТОВАР".
А ты решаешь задачу - показать "ВСЕ-ВСЕ-ВСЕ ТОВАРЫ".
Найди 10 отличий в этих двух задачах.

Вторая задача тобою решена. Решение тормозное. По мере роста базы оно будет работать всё медленнее и медленнее до тех пор пока в один прекрасный день не встанет колом.

Первая задача имеет самые различные способы решения. Один из которых - отчет. А другие... тут целый пучок вариантов.
- показывать остатки только по активной строке списка (ПриАктивизацииСтроки или по отдельной кнопке);
- нарисовать форму подбора, которая будет показывать остатки только тогда, когда пользователь установил отбор по номенклатуре, содержащий в результате, например, не более 10 позиций (ведь реально менеджер ищет в 99% случаев одну конкретную позицию). Пока отбора нет или в результате отбора больше позиций - остатки не показываем.
22 Prog111
 
10.03.17
12:48
(21) В данной базе ищет именно товары, так как есть много товаров-заменителей, и надо смотреть аналоги. (запчасти).
23 Prog111
 
10.03.17
12:48
(21) Спасибо за идеи.
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший