Имя: Пароль:
1C
1С v8
как оптимизировать запрос 1с 8
,
0 Anabella
 
08.04.15
10:24
Есть вот такой запрос. И он здорово тормозит отчет. Как его оптимизировать? Спасибо.

ВЫБРАТЬ
    ВЫБОР
        КОГДА ЗаказыКлиентовОбороты.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
        ТОГДА ЗаказыКлиентовОбороты.СуммаОборот * -1
        ИНАЧЕ ЗаказыКлиентовОбороты.СуммаОборот
    КОНЕЦ КАК СуммаОборот,
    ЗаказыКлиентовОбороты.Номенклатура,
    ВТ.ГруппыТоваров
    ИЗ
    РегистрНакопления.ЗаказыКлиентов.Обороты(, , Регистратор, ) КАК ЗаказыКлиентовОбороты
    ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ВТ
    ПО ЗаказыКлиентовОбороты.Номенклатура = ВТ.Ссылка
    ГДЕ
    ЗаказыКлиентовОбороты.Регистратор = &Регистратор
14 Anabella
 
08.04.15
10:45
(13) Насколько я знаю всегда быстрее отчет работает если обращаться к виртуальным таблицам, а не к самому регистру.
15 Anabella
 
08.04.15
10:45
(13) или это не так ?
16 vi0
 
08.04.15
10:52
(0) какую задачу решаешь запросом?
может быть анализировать приход/расход и не задействовать регистратор?
17 ViSo76
 
08.04.15
10:52
(15) Это было бы так если бы было обращение к остаткам, а обороты будет строиться из РегистрНакопления.ЗаказыКлиентов применяя группировку по , Регистратор, и выбранные измерения в ВЫБРАТЬ.

В вашем случае вы вытаскиваете все движения по регистру накопления за все время, они группируются по правилу выше, потом ( если это MS SQL ) режется по ГДЕ и потом делается ЛЕВОЕ СОЕДИНЕНИЕ, если файловая то левое соединение будет первым потом урезка по ГДЕ ( вроде так )
18 Гёдза
 
08.04.15
10:53
тут таблица оборотов и не нужна
19 vi0
 
08.04.15
10:54
(0) попробуй проиндексировать ВТ по Номенклатура
20 Anabella
 
08.04.15
10:58
(16) задача следующая: "покажи мне какая номенклатура была оплачена!" мне приходится собирать все документы оплаты, а потом по каждому документу оплаты проверять документ-основание (реализация или заказ), и сумму оплаты разносить по всем позициям номенклатуры этого документа.
21 Anabella
 
08.04.15
10:59
(7) Сделала так: РегистрНакопления.ЗаказыКлиентов.Обороты(&МоментВремени, &МоментВремени, , )
не прокатило, по моменту времени он ничего не находит.
22 Anabella
 
08.04.15
11:00
(17) спасибо за объяснение, сейчас попробую
23 vi0
 
08.04.15
11:00
(20) а ЗаказыКлиентов двигают документы оплаты?
24 vi0
 
08.04.15
11:00
в регистр ЗаказыКлиентов пишут документы оплаты?
25 AndreyBarmaley
 
08.04.15
11:00
Добавь в параметру виртуальной таблицы отбор по номенклатуре из ВТ

ИЗ
    РегистрНакопления.ЗаказыКлиентов.Обороты( , Номенклатура В
(ВЫБРАТЬ ВТ.Ссылка ИЗ ВТ КАК ВТ) , Регистратор, ) КАК ЗаказыКлиентовОборот
26 Anabella
 
08.04.15
11:02
(23) нет, сначала я из другого регистра достаю документы оплаты и документ-основание, а потом по документ-основание делаю запрос, который вы и видите выше. я пыталась реализовать это в одном запросе, но, честно говоря, такая ерунда получилась...
27 vi0
 
08.04.15
11:06
(26) у вас в одном документе реализации только одна номенклатура? если нет, то вы уверены что задача методически верна сама по себе?
28 vi0
 
08.04.15
11:07
(25) тут надо понять что именно содержит ВТ
а то, теоритически, такое условие может наоборот замедлить запроса
29 Anabella
 
08.04.15
11:11
(27)Нет, не одна. Но отчет выдает правильный результат. Методически это решение кажется мне наиболее правильным, но я, конечно, могу ошибаться.
Насчет ВТ. Начальник пожелал чтобы номенклатура была разбита на 6 разделов в отчете - инвентарь, оборудование итп. Проще всего было реализовать это, просто разместив её по 6 нужным папкам. Но "менеджеры привыкли к текущей схеме, менять нельзя"! Пришлось пойти обходным путем. Вот запрос ВТ:

ВЫБРАТЬ
        |    Номенклатура.Ссылка КАК Ссылка,
        |    ВЫБОР
        |        КОГДА Номенклатура.Наименование ПОДОБНО ""Дизайн-проект%""
        |            ТОГДА ""Дизайн-проект""
        |        КОГДА Номенклатура.Ссылка В ИЕРАРХИИ
        |                (ВЫБРАТЬ
        |                    Номенклатура.Ссылка
        |                ИЗ
        |                    Справочник.Номенклатура КАК Номенклатура
        |                ГДЕ
        |                    (Номенклатура.Наименование ПОДОБНО ""Видеонаблюдение""
        |                        ИЛИ Номенклатура.Наименование ПОДОБНО ""Запчасти""
        |                        ИЛИ Номенклатура.Наименование ПОДОБНО ""запасные части""
        |                        ИЛИ Номенклатура.Наименование ПОДОБНО ""Оборудование""))
        |            ТОГДА ""Оборудование""
        |        КОГДА Номенклатура.Ссылка В ИЕРАРХИИ
        |                (ВЫБРАТЬ
        |                    Номенклатура.Ссылка
        |                ИЗ
        |                    Справочник.Номенклатура КАК Номенклатура
        |                ГДЕ
        |                    (Номенклатура.Наименование ПОДОБНО ""Кухонная посуда""
        |                        ИЛИ Номенклатура.Наименование ПОДОБНО ""Сервировка""
        |                        ИЛИ Номенклатура.Наименование ПОДОБНО ""Скатерти, салфетки""
        |                        ИЛИ Номенклатура.Наименование ПОДОБНО ""Скатерти, салфетки одноразовые""
        |                        ИЛИ Номенклатура.Наименование ПОДОБНО ""Скатерти, салфетки тканевые""
        |                        ИЛИ Номенклатура.Наименование ПОДОБНО ""Стекло барное""
        |                        ИЛИ Номенклатура.Наименование ПОДОБНО ""Фарфор, керамика""))
        |            ТОГДА ""Посуда""
        |        КОГДА Номенклатура.Ссылка В ИЕРАРХИИ
        |                (ВЫБРАТЬ
        |                    Номенклатура.Ссылка
        |                ИЗ
        |                    Справочник.Номенклатура КАК Номенклатура
        |                ГДЕ
        |                    Номенклатура.Наименование ПОДОБНО ""Столовые приборы"")
        |            ТОГДА ""Столовые приборы""
        |        КОГДА Номенклатура.Ссылка В ИЕРАРХИИ
        |                (ВЫБРАТЬ
        |                    Номенклатура.Ссылка
        |                ИЗ
        |                    Справочник.Номенклатура КАК Номенклатура
        |                ГДЕ
        |                    (Номенклатура.Наименование ПОДОБНО ""Барный инвентарь""
        |                        ИЛИ Номенклатура.Наименование ПОДОБНО ""Инвентарь для пищевых цехов""
        |                        ИЛИ Номенклатура.Наименование ПОДОБНО ""Инвентарь для фаст-фуда""
        |                        ИЛИ Номенклатура.Наименование ПОДОБНО ""Кондитерский инвентарь""
        |                        ИЛИ Номенклатура.Наименование ПОДОБНО ""Поварской инвентарь""
        |                        ИЛИ Номенклатура.Наименование ПОДОБНО ""Спецодежда""
        |                        ИЛИ Номенклатура.Наименование ПОДОБНО ""Ритейл""
        |                        ИЛИ Номенклатура.Наименование ПОДОБНО ""Кухонный инвентарь""
        |                        ИЛИ Номенклатура.Наименование ПОДОБНО ""Хозтовары""))
        |            ТОГДА ""Инвентарь""
        |        КОГДА Номенклатура.Ссылка В ИЕРАРХИИ
        |                (ВЫБРАТЬ
        |                    Номенклатура.Ссылка
        |                ИЗ
        |                    Справочник.Номенклатура КАК Номенклатура
        |                ГДЕ
        |                    Номенклатура.Наименование ПОДОБНО ""Мебель"")
        |            ТОГДА ""Мебель""
        |        КОГДА Номенклатура.Ссылка В ИЕРАРХИИ
        |                    (ВЫБРАТЬ
        |                        Номенклатура.Ссылка
        |                    ИЗ
        |                        Справочник.Номенклатура КАК Номенклатура
        |                    ГДЕ
        |                        Номенклатура.Наименование ПОДОБНО ""Проекты"")
        |                И Номенклатура.Наименование ПОДОБНО ""%проект%""
        |            ТОГДА ""Проекты""
        |        КОГДА Номенклатура.Ссылка В ИЕРАРХИИ
        |                (ВЫБРАТЬ
        |                    Номенклатура.Ссылка
        |                ИЗ
        |                    Справочник.Номенклатура КАК Номенклатура
        |                ГДЕ
        |                    Номенклатура.Наименование ПОДОБНО ""Фирменный стиль"")
        |            ТОГДА ""Фирменный стиль""
        |        ИНАЧЕ """"
        |    КОНЕЦ КАК ГруппыТоваров
        |ПОМЕСТИТЬ ВТ
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура
        |
        |ИНДЕКСИРОВАТЬ ПО
        |    Ссылка"
30 МихаилМ
 
08.04.15
11:12
(0)
условия лучше указывать в условиях виртуальной таблицы

  ВЫБОР
        КОГДА ЗаказыКлиентовОбороты.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
        ТОГДА ЗаказыКлиентовОбороты.СуммаОборот * -1
        ИНАЧЕ ЗаказыКлиентовОбороты.СуммаОборот

это действие относится не к выботке данных а к представлению данных. соответственно обрабатывайте не на субд.
31 Anabella
 
08.04.15
11:15
(30) спасибо!
32 vi0
 
08.04.15
11:17
(30) это не факт
если важна скорость то нужно замеры делать, где будет быстрее на сервере или клиенте
33 vi0
 
08.04.15
11:18
(29) вы же понимаете, что такой хардкодинг потенциально неустойчивый?
34 ViSo76
 
08.04.15
11:19
К стати ЗаказыКлиентовОбороты.СуммаОборот * -1 достаточно заменить на -ЗаказыКлиентовОбороты.СуммаОборот перемножения не будет
35 AndreyBarmaley
 
08.04.15
11:19
Я бы в ВТ еще бы оплаченные заказы клиента добавил:

ВЫБРАТЬ
    ЗаказыКлиентовОбороты.Номенклатура,
    ЗаказыКлиентовОбороты.ЗаказаноПриход - ЗаказыКлиентовОбороты.ЗаказаноРасход КАК Оборот
ИЗ
    РегистрНакопления.ЗаказыКлиентов.Обороты(
            ,
            ,
            Авто,
            (ЗаказКлиента, Номенклатура) В
                (ВЫБРАТЬ РАЗЛИЧНЫЕ
                    ВТ_ЗК.ЗаказКлиента,
                    ВТ_ЗК.Номенклатура
                ИЗ
                    ВТ_ЗК КАК ВТ_ЗК)) КАК ЗаказыКлиентовОбороты
36 vi0
 
08.04.15
11:19
(29) тогда совет в (25) точно не нужен
37 D_E_S_131
 
08.04.15
11:20
Если нужно получить движения документа по регистру "ЗаказыКлиентов" с условием по номенклатуре, то быстрее будет обращаться к реальной таблице и ее данные соединять с номенклатурой из ВТ.
38 ViSo76
 
08.04.15
11:23
(29) Вам нужно вместо
ВЫБОР
...
КОГДА Номенклатура.Ссылка В ИЕРАРХИИ

лучше сделать отборы с условием В ИЕРАРХИИ

И потом эти оборы

ОБЪЕДИНИТЬ ВСЕ

я думаю это будет быстрее значительно.
39 D_E_S_131
 
08.04.15
11:24
Пока писал коммент по регистру не успел увидеть запрос выборки номенклатуры. Вот где дикая дичь! Построитель плана запроса "сойдет с ума" от такого точно.
Все предопределенные папки выносите в массивы и передавайте как параметр, а уже потом только используйте "В ИЕРАРХИИ(&НаборПапок1)", "В ИЕРАРХИИ(&НаборПапок2)"...
40 Anabella
 
08.04.15
11:24
(39) Спасибо! Знаю, что топорно, а как грамотно сделать не знала. Попробую по-вашему.
41 D_E_S_131
 
08.04.15
11:25
+ к (38), разнести куски по подзапросам, меняя условия вхождения в иерархию.
42 ViSo76
 
08.04.15
11:26
(39) Нахуа так делать? В начале вытащить на клиента, потом отправить на сервер... Всё в одном запросе через виртуальную таблицу, просто запрос написать нормально.
43 ViSo76
 
08.04.15
11:28
В запросах у неё всё плохо, но глаза шикарные :)
44 D_E_S_131
 
08.04.15
11:32
(42) С чего взял, что что-то передается между кл и серв? Откуда вообще мы знаем, что это все в УП происходит?
А время на формирование ВТ, индексирование ее полей учитываешь? И конструкция "В ИЕРАРХИИ(Выбрать ПапкаСсылка ИЗ..)" будет медленнее работать чем "В ИЕРАРХИИ(&ВыбПапки)" — х.з. из-за чего, но экспериментально быстрее получается.
45 МихаилМ
 
08.04.15
11:36
(29) бред редкостный. но 25 лет я писал также.

у Вас тяжелай форма болезни одинесника: путать получение данных
с представлением данных.


методически Ваше решение плохое, тк будет требовать постоянной доработки отчета, для добавления удаления групп .

замените ваш список  на  бд РС либо справочник.

Альтернативное видение иерархий, группировок, фильтров  
- это нормальная часть бизнес процессов. но периодически требует секвестирования.


в вашем Запросе нужно отказаться от обработки представления
в субд. Считать справочник и построить иерархию не клиенте.
46 vi0
 
08.04.15
11:43
(45) чувак, тебя читать так же сложно, как в (29) запрос )
47 AndreyBarmaley
 
08.04.15
11:50
(29) если справочник небольшой то прокатит... , но я бы через доп. свойство сделал. Всеравно новые папки будут создаваться и придется отчет переделывать.
48 D_E_S_131
 
08.04.15
11:55
(47) "если справочник небольшой то прокатит" — из-за подобного подхода было загублено не мало ИБ. Когда "специалист" пишет запрос, все вроде бы быстро работает, а через год у людей "таймауты" начинают "валиться".
49 ViSo76
 
08.04.15
11:57
(44) Все предопределенные папки выносите в массивы и передавайте как параметр, а уже потом только используйте "В ИЕРАРХИИ(&НаборПапок1)", "В ИЕРАРХИИ(&НаборПапок2)"...

Подразумевается что номенклатуру в начале ты выберешь несколькими запросами на клиента, затем передашь на сервер в качестве параметров и не важно что толстый клиент там тоже виртуальный сервер. А если сервер не виртуальный то сетевые накладки будут выше чем даже запись виртуальной таблицы, если вообще будет запись вместо курсора...
50 piter3
 
08.04.15
11:58
(45) +100
51 AlexITGround
 
08.04.15
12:15
(29) А что это такое?
52 AndreyBarmaley
 
08.04.15
12:37
(48) на ошибках учаться.
(29) "красивей" (39) по крайней мере все в одном запросе...
53 AndreyBarmaley
 
08.04.15
12:38
учатся
54 Anabella
 
08.04.15
14:34
Начала пробовать предложенные варианты.
(17) переделала в запрос:
"ВЫБРАТЬ
                          |    ВТ.ГруппыТоваров,
                          |    ЗаказыКлиентов.Номенклатура,
                          |    ВЫБОР
                          |        КОГДА ЗаказыКлиентов.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
                          |            ТОГДА -ЗаказыКлиентов.Сумма
                          |        ИНАЧЕ ЗаказыКлиентов.Сумма
                          |    КОНЕЦ КАК СуммаОборот
                          |ИЗ
                          |    РегистрНакопления.ЗаказыКлиентов КАК ЗаказыКлиентов
                          |        ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ВТ
                          |        ПО ЗаказыКлиентов.Номенклатура = ВТ.Ссылка
                          |ГДЕ
                          |    ЗаказыКлиентов.Регистратор = &Регистратор";

Стало выполняться дольше на 10 секунд( или можно как-то из ГДЕ переместить условие на регистратор?
55 D_E_S_131
 
08.04.15
14:40
(54) Соединение ВНУТРЕННЕЕ надо, тебе же строго позии номенклатуры из ВТ нужны. Ну и условие можно в условия связи перенести.
56 Anabella
 
08.04.15
14:48
(55)
Нет, в ВТ я вытаскиваю только Группы номенклатуры. Саму номенклатуру тяну из ЗаказКлиентов
57 ViSo76
 
08.04.15
14:50
(54) Попробуй сделать так:

"ВЫБРАТЬ
|    ВТ.ГруппыТоваров,
|    ЗаказыКлиентов.Номенклатура,
|    ЗаказыКлиентов.СуммаОборот
|ИЗ
|    ( ВЫБРАТЬ
|        Номенклатура,
|        ВЫБОР
|            КОГДА Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
|                ТОГДА -Сумма
|                ИНАЧЕ Сумма
|        КОНЕЦ КАК СуммаОборот
|    ИЗ
|        РегистрНакопления.ЗаказыКлиентов
|    ГДЕ
|        Регистратор = &Регистратор" ) КАК ЗаказыКлиентов
|
|    ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ВТ
|        ПО ЗаказыКлиентов.Номенклатура = ВТ.Ссылка
58 D_E_S_131
 
08.04.15
14:52
(49) Вы уже просто "загнались" с этими "Клиентами" и "Серверами".
(56) Ну и зря.
59 D_E_S_131
 
08.04.15
14:52

ГруппыМебель = Новый Массив;
ГруппыМебель.Добавить("Столы");
ГруппыМебель.Добавить("Стулья");
ГруппыМебель.Добавить("Диваны");

ГруппыПосуда = Новый Массив;
ГруппыПосуда.Добавить("Тарелки");
ГруппыПосуда.Добавить("Вилки");
ГруппыПосуда.Добавить("Стаканы");

Запрос = Новый Запрос;

// Мебель в параметры
НовМассив = Новый Массив;

Для каждого ТекСтр Из ГруппыМебель Цикл

    СпрСсылка = Справочники.Номенклатура.НайтиПоНаименованию(ТекСтр);
    
    Если СпрСсылка.Пустая() Тогда
        Продолжить;
    КонецЕсли;
    
    НовМассив.Добавить(СпрСсылка);

КонецЦикла;

Запрос.УстановитьПараметр("ГруппыМедель", НовМассив);

// Посуда в параметры
НовМассив = Новый Массив;

Для каждого ТекСтр Из ГруппыПосуда Цикл

    СпрСсылка = Справочники.Номенклатура.НайтиПоНаименованию(ТекСтр);
    
    Если СпрСсылка.Пустая() Тогда
        Продолжить;
    КонецЕсли;
    
    НовМассив.Добавить(СпрСсылка);

КонецЦикла;

Запрос.УстановитьПараметр("ГруппыПосуда", НовМассив);

Запрос.Текст =
"ВЫБРАТЬ
|    Номенклатура.Ссылка КАК НомСсылка
|ПОМЕСТИТЬ ВТ_Товары
|ИЗ
|    Справочник.Номенклатура КАК Номенклатура
|ГДЕ
|    НЕ Номенклатура.ЭтоГруппа
|    И Номенклатура.Ссылка В ИЕРАРХИИ(&ГруппыМебель)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|    Номенклатура.Ссылка
|ИЗ
|    Справочник.Номенклатура КАК Номенклатура
|ГДЕ
|    НЕ Номенклатура.ЭтоГруппа
|    И Номенклатура.Ссылка В ИЕРАРХИИ(&ГруппыПосуда)
|
|ИНДЕКСИРОВАТЬ ПО
|    НомСсылка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    ВТ_Товары.НомСсылка,
|    ЗаказыПокупателей.Количество
|ИЗ
|    ВТ_Товары КАК ВТ_Товары
|        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПокупателей КАК ЗаказыПокупателей
|        ПО ВТ_Товары.НомСсылка = ЗаказыПокупателей.Номенклатура
|            И (ЗаказыПокупателей.Регистратор = &ДокРегистратор)"
;

Запрос.УстановитьПараметр("ДокРегистратор", ВыбДокумент);
60 AndreyBarmaley
 
08.04.15
14:54
(56) сделай ВТ из заказов клиентов далее (35)
Виртуальная таблица быстрей, регистр не нужен...

(59) очень криво
61 D_E_S_131
 
08.04.15
14:59
(60) Что именно?
62 ViSo76
 
08.04.15
14:59
(59) 1. Цикле отбор номенклатур на клиенте, всё это можно сделать и в 1 запросе.

2. ЛЕВОЕ СОЕДИНЕНИЕ вместо:

ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПокупателей КАК ЗаказыПокупателей

3. И почему ты уверен что нужно отбрасывать некоторые позиции заказ если они не входят в эти группы?
63 AlexSmirnov272
 
08.04.15
15:02
(57) избавьтесь от условия ГДЕ, Вам писали уже)
64 D_E_S_131
 
08.04.15
15:03
(62) Возьми консоль запросов с инструментом замера времени выполнения запроса и посмотри сколько займет время сделать "одним запросом" и "передать как параметр". Совсем недавно делал нечто подобное и был удивлен, что условие "В" компилятор запроса формирует не так как "В (Выбрать...)". И раза в 3 быстрее сделал (но тут от кол-ва данных будет зависеть ускорение).
65 Anabella
 
08.04.15
15:07
(59) Ничего себе... пошла пробовать.
66 ViSo76
 
08.04.15
15:09
(64) Ты чушь пишешь. Я не предлагал писать В ( ВЫБРАТЬ ... ИЗ ). Если у тебя понимания не хватает я тебе его рихтовать не буду. И я понимаю что "один запрос" это всего лишь один текст, но возможно несколько запросов к базе.
67 D_E_S_131
 
08.04.15
15:09
+ к (64) При чем "построитель плана запроса" с третьего или четвертого раза вывел "В (Выбрать...)" на скорость выполнения такую как у "В(&Парам)". Проделывалось на MS SQL 2008 R2.
68 D_E_S_131
 
08.04.15
15:10
(66) А ты не кипятись и просто свой вариант покажи. А уж я не поленюсь и прогоню его через замер скорости выполнения и профайлер.
69 AndreyBarmaley
 
08.04.15
15:16
(61) Время запросов в цикле учитывал?

СпрСсылка = Справочники.Номенклатура.НайтиПоНаименованию(ТекСтр);
70 Anabella
 
08.04.15
15:19
Господа, хорош спорить. У меня еще другой запрос к той же ВТ обращается, но тормозит именно тот который ЗаказКлиента
71 Anabella
 
08.04.15
15:20
Номенклатуру-то я конечно переделаю по группам товаров чтоб грамотно-красиво, но проблема не в ней.
72 vi0
 
08.04.15
15:21
(57) нехороший совет
будет только хуже
73 Anabella
 
08.04.15
15:22
(57) на секунду дольше выполняется
74 vi0
 
08.04.15
15:22
(59) Для каждого ТекСтр Из ГруппыПосуда Цикл
    СпрСсылка = Справочники.Номенклатура.НайтиПоНаименованию(ТекСтр);
...
КонецЦикла;


это называется запрос в цикле
75 D_E_S_131
 
08.04.15
15:22
(69) Когда свой случай решал — да. Найти десяток элементов по индексированному полю это было быстрее даже чем получить эти же элементы одним запросом и поместить их в ВТ. При чем исходил из того, что передавая массив в условие "В", система так же сформирует временную таблицу в tempdb и будет выборкой в ней проверять условия. Оказалось, что ничего подобного.
76 D_E_S_131
 
08.04.15
15:25
(70) А как долго у тебя выполняется просто выборка записей РН с условием по &Регистратор?
(74) Для нескольких элементов это оправдывается выигрышем в скорости выполнения в дальнейшем (в моем случае было всего 5 таких папок).
77 AndreyBarmaley
 
08.04.15
15:26
(75) ок... может быть

(73)  (35) пробовала?
78 ViSo76
 
08.04.15
15:29
(68) Сравнивай

ГруппыМебель = Новый Массив;
ГруппыМебель.Добавить("Столы");
ГруппыМебель.Добавить("Стулья");
ГруппыМебель.Добавить("Диваны");

ГруппыПосуда = Новый Массив;
ГруппыПосуда.Добавить("Тарелки");
ГруппыПосуда.Добавить("Вилки");
ГруппыПосуда.Добавить("Стаканы");

Запрос = Новый Запрос(
"ВЫБРАТЬ
|    Ссылка

|ПОМЕСТИТЬ ВТ_ГруппаМебель

|ИЗ
|    Справочник.Номенклатура
|ГДЕ
|    Наименование В ( &ГруппаМебель )
|;

|ВЫБРАТЬ
|    Ссылка

|ПОМЕСТИТЬ ВТ_ГруппаПосуда

|ИЗ
|    Справочник.Номенклатура
|ГДЕ
|    Наименование В ( &ГруппаПосуда )
|;

|ВЫБРАТЬ
|    ""Мебель"" КАК Группа,
|    Номенклатура.Ссылка КАК НомСсылка

|ПОМЕСТИТЬ ВТ_Товары

|ИЗ
|    Справочник.Номенклатура КАК Номенклатура
|ГДЕ
|    Номенклатура.Ссылка В ИЕРАРХИИ( ВЫБРАТЬ Ссылка ИЗ ВТ_ГруппаМебель )
|    И Номенклатура.ЭтоГруппа = Ложь
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|    ""Посуда"" КАК Группа,
|    Номенклатура.Ссылка
|ИЗ
|    Справочник.Номенклатура КАК Номенклатура
|ГДЕ
|    Номенклатура.Ссылка В ИЕРАРХИИ( ВЫБРАТЬ Ссылка ИЗ ВТ_ГруппаПосуда )
|    И Номенклатура.ЭтоГруппа = Ложь
|;
|
|////////////////////////////////////////////////////////////////////////////////

|ВЫБРАТЬ
|    ВТ_Товары.НомСсылка,
|    ЗаказыПокупателей.Количество
|ИЗ
|    ВТ_Товары КАК ВТ_Товары

|    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПокупателей КАК ЗаказыПокупателей
|        ПО ВТ_Товары.НомСсылка = ЗаказыПокупателей.Номенклатура
|            И (ЗаказыПокупателей.Регистратор = &ДокРегистратор)" );

Запрос.УстановитьПараметр( "ГруппаМебель", ГруппыМебель );
Запрос.УстановитьПараметр( "ГруппаПосуда", ГруппыПосуда );
Запрос.УстановитьПараметр( "ДокРегистратор", ВыбДокумент );
79 ViSo76
 
08.04.15
15:29
(78) Код не проверял, не знаю что за конфа если что подправишь огрехи
80 ViSo76
 
08.04.15
15:31
Да подмени не заметил

|    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПокупателей КАК ЗаказыПокупателей
|        ПО ЗаказыПокупателей.Регистратор = &ДокРегистратор
|            И ВТ_Товары.НомСсылка = ЗаказыПокупателей.Номенклатура" );
81 AndreyBarmaley
 
08.04.15
15:38
(0) покажи весь запрос с документами оплаты
УТ11?
82 Anabella
 
08.04.15
15:41
(81)да. Я сейчас как раз втыкаю смысл в (35). У вас там обращение к ВТ, в которой и номенклатура и заказ клиента. У меня в ВТ исключительно номенклатура, запрос к справочнику номенклатуры. Предлагаете создать ВТ с заказами и соединить её с запросом в котором заказы? Зачем? Я соединяю, чтобы отдельно разбивались по группам и не портило основной запрос. А зачем запрос с заказами соединять с ВТ с запросом с заказами как-то не улавливаю.
83 AndreyBarmaley
 
08.04.15
15:45
(82) Я бы в справочник номенклатура лез после того как определил какие именно заказы оплатили...
84 Anabella
 
08.04.15
15:53
(83)Думала-думала, решила лучше спросить. Технически как это сделать?) сначала один запрос, потом второй, или как ?)
85 D_E_S_131
 
08.04.15
15:55
(79) Ну и вот результат:
1. Твой изначальный вариант — первый запуск 852 мс, далее 440 мс.
2. Изменяю твой вариант и вместо поиска по наименованию "подсовываю" сразу массив с папками — результат колеблется около 330 мс.
3. Не использую ВТ вообще и сразу двумя подзапросами выбираю номенклатуру по переданным группам — результат 250-260 мс.

Тут даже особо другого результата и не ожидалось. При большой выборке данных зачастую не дооценивают время формирования всех этих ВТ. Более того, выбирая элементы справочника в ВТ, на них накладывается оптимистическая блокировка и пока моя ВТ что-то там тянет из записей РН, никто не сможет что-то записать в справочник номенклатуры. Выбирая же просто папки и сравнивая с папками я никаким образом не блокирую обычные элементы справочника.
86 AndreyBarmaley
 
08.04.15
15:56
(84) какая конфигурация?
87 vi0
 
08.04.15
15:59
(85) > выбирая элементы справочника в ВТ, на них накладывается оптимистическая блокировка
блокировка накладывается если читаешь в транзакции
88 D_E_S_131
 
08.04.15
16:01
(87) Разницу между пессимистичной и оптимистичной блокировкой ощущаешь?
89 Anabella
 
08.04.15
16:02
(86) УТ 11
90 vi0
 
08.04.15
16:02
(88) и к чему вопрос?
там не будет блокировки
91 Anabella
 
08.04.15
16:03
(85) Вот спасибо, буду знать!
92 Fragster
 
гуру
08.04.15
16:04
(91) в (85) фигня, есличо
93 D_E_S_131
 
08.04.15
16:05
(92) Консоль запросов врет?
94 H A D G E H O G s
 
08.04.15
16:08
(93) У тебя похоже, особая консоль
95 D_E_S_131
 
08.04.15
16:08
(90) Хочешь сказать, что если мы читаем данные из Спр.Номенклатура, помещаем их в ВТ, потом используем эту ВТ дальше, то кто-то в это время может удалить один или несколько элементов Спр.Номенклатура?
96 D_E_S_131
 
08.04.15
16:09
(94) Возможно. Но пока с "тормозами" в базе успешно помогала справляться.
97 H A D G E H O G s
 
08.04.15
16:12
(95) Читаем вне транзакции - да.
Читаем в транзакции - по разному.
98 vi0
 
08.04.15
16:12
(95) честно скажу, именно удалить не пробовал
ты выше пишешь не про удаление, а про изменение
нормальная схема, когда удалением занимается администратор, а не так запросто в течение работы пользователей
99 D_E_S_131
 
08.04.15
16:19
(97) Можно пример того как мы прочитаем данные из справочника вообще без блокировок?
(98) Для блокировок какая разница удалить или изменить?
100 AndreyBarmaley
 
08.04.15
16:20
(91)

ВЫБРАТЬ
    РасчетыСКлиентамиОбороты.ЗаказКлиента,
    РасчетыСКлиентамиОбороты.Регистратор,
    РасчетыСКлиентамиОбороты.КОплатеРасход
ПОМЕСТИТЬ ВТ_Оплаты
ИЗ
    РегистрНакопления.РасчетыСКлиентами.Обороты(&НП, &КП, Авто, ) КАК РасчетыСКлиентамиОбороты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЗаказыКлиентовОбороты.ЗаказКлиента,
    ЗаказыКлиентовОбороты.Номенклатура,
    ЗаказыКлиентовОбороты.СуммаПриход
ПОМЕСТИТЬ ВТ_Заказы
ИЗ
    РегистрНакопления.ЗаказыКлиентов.Обороты(
            ,
            ,
            Авто,
            ЗаказКлиента В
                (ВЫБРАТЬ РАЗЛИЧНЫЕ
                    ВТ_Оплаты.ЗаказКлиента
                ИЗ
                    ВТ_Оплаты КАК ВТ_Оплаты)) КАК ЗаказыКлиентовОбороты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Номенклатура.Ссылка,
    Номенклатура.Артикул,
    Номенклатура.Вес,
    Номенклатура.Объем
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Ссылка В
            (ВЫБРАТЬ РАЗЛИЧНЫЕ
                ВТ_Заказы.Номенклатура
            ИЗ
                ВТ_Заказы КАК ВТ_Заказы)
101 H A D G E H O G s
 
08.04.15
16:21
(99)
ВЫБРАТЬ
    Номенклатура.Наименование
ИЗ
    Справочник.Номенклатура КАК Номенклатура
102 disk-2008
 
08.04.15
16:21
(0)Делай две ВТ - заказов и номенклатуры.
103 vi0
 
08.04.15
16:22
(99) значит не будет блокировки
можешь проверить
104 ViSo76
 
08.04.15
16:25
(85) Ты всё посчитал, вместе с твоими обращениями за ссылками папок в базу? Или только запросы сравнил?
105 ViSo76
 
08.04.15
16:30
Часто лучше сделать чуть дольше но с гарантированным планом исполнения. В нашем случае 2 ВТ по группам лучше сразу пихать В ( ВЫБРАТЬ ... )
106 ViSo76
 
08.04.15
16:32
Да и чем больше текста в запросе тем больше по времени он в начале парсится
107 ViSo76
 
08.04.15
16:33
И ещё нужно на холодных данных проверять твой и мой запрос после опускания базы. Так как мой запрос мог в начале в кэш данные загнать а твой их от туда достать из физической их подгрузки
108 D_E_S_131
 
08.04.15
16:37
(104) 3 мс на поиск по наименованию тратится и делаем 6 раз. И я специально запускал запрос несколько раз и привожу минимальные значения.

(101) Вот тут я конечно "прогнал". Если только добавить конструкцию транзакции (автоматические блокировки), то получим WITH(REPEATABLEREAD), а просто всегда WITH(nolock) выходит. :(
109 ViSo76
 
08.04.15
16:42
(108) А на остальной код 1С сколько тратится?
110 H A D G E H O G s
 
08.04.15
16:42
(108) Ты даже не представляешь, насколько там все сложнее.
111 D_E_S_131
 
08.04.15
16:52
(110) Представляю. Просто я со своими таймаутами и блокировками загнался так, что смешал все с нетранзакционным чтением данных.
112 D_E_S_131
 
08.04.15
16:56