Имя: Пароль:
1C
1С v8
Запрос в цикле (или цикл в запросе)?
,
0 Мисти
 
15.10.13
16:36
Как решить, как быстрее будет работать обработка табличной части - расчет (с несколькими запросами по доп. реквизитам и т.д.) по каждой строчке отдельно, или все нужные (а, возможно, и лишние) данные посчитать сразу для всей табличной части, а потом из результата запроса вытягивать нужное?
1 eklmn
 
гуру
15.10.13
16:38
1 запрос и все
2 DexterMorgan
 
15.10.13
16:39
что такое цикл в запросе?
3 vicof
 
15.10.13
16:40
(0) Известная велосипедистка Мисти не сдавала экзамен на специалиста по платформе.
4 exwill
 
15.10.13
16:40
(2) Это - запрос в цикле наоборот.
5 Мисти
 
15.10.13
16:41
(3) не-а, не сдавала. И не сдам никогда! У меня склероз, до сих пор всё ищу в словарике "7-8"
6 vicof
 
15.10.13
16:42
(5) Пейте таблеточки
7 Мисти
 
15.10.13
16:42
(2) Я пояснила, что я имею в виду.
Просто часть данных заведомо не понадобиться.
Не, ну теоретически - возможно все-все условия указать в запросе и не искать лишнего, но так я не умею.
8 Зойч
 
15.10.13
16:43
Какая то слабенькая попытка потроллить. До Светы тебе ой как далеко
9 Enders
 
15.10.13
16:45
А потом: "1С тормозит, на костёр 1С" =)))
10 Мисти
 
15.10.13
16:45
(9) и без меня тормозит.
11 Мисти
 
15.10.13
16:54
Ну так что, всё в одном запросе? А 1с разве не рассчитвает по строкам?
12 Dmitry1c
 
15.10.13
16:55
(11) делай рекурсивный запрос в цикле
13 kiruha
 
15.10.13
16:55
(0)
Самое медленное - запрос
Он должен быть один.
Не должны по возможности извлекаться лишние данные
И потом не должно быть в постобработке обращений через точку.

Пост обработка это доли сек если нет супер пупер партионного учета
14 Chai Nic
 
15.10.13
16:56
Запрос в цикле - это хорошо. Особенно если при этом выводить прогресс-бар с процентиками. Это бухгалтера любят, это настраивает на позитив.. можно спокойно попить кофе.
15 Infsams654
 
15.10.13
17:03
(11) это вопрос к Defender-у. Удивляюсь, зачем запрос, ежели в объекте ТЧ уже есть. Если чего-то не хватает, доставай обычными методами объекта (который уже есть). Ну уж, если нет, то как хочешь
16 kiruha
 
15.10.13
17:05
(13)+
Не , ну если очень постараться можно завесить и постобработку результата запроса - например  в цикле создавать ТЗ по 10 000 элементов
17 azernot
 
15.10.13
17:09
Лучше выполнить одни большой запрос, потом проверить данные подзапросами в цикле, и плюс убедиться в корректности обращением через точку к объектам. Для надёжности и в целях подстраховки.
18 User_Agronom
 
15.10.13
17:12
А передать табличную часть в запрос как параметр?
И тогда будет один запрос. Или я что-то неправильно понял?
19 Мисти
 
15.10.13
17:13
Хватит издеваться!
А вот серьезно, неужели "для каждого стр из Объект.Товары" - существенно медленнее, чем если это выгрузить в таблицу?
20 Dmitry1c
 
15.10.13
17:15
(19) один раз открыть дверь или сто раз открыть дверь?
21 Мисти
 
15.10.13
17:15
Предположим, по списку номенклатуры нужно искать доп. реквизиты, но в зависимости от разных условий (в частности, от остатка на складе, который в другом запросе, в один я их точно не объединю) нужно искать разные доп. реквизиты. Можно сразу найти все и потом из таблицы вытаскивать нужные, или в в цикле по каждой строчке - но зато искать только нужное, где-то доп. реквизиты и вовсе не нужны.
22 azernot
 
15.10.13
17:17
(21) Доп реквизиты - это одна таблица. Если всё так сложно, получай все, а потом по необходимости используй нужные.
23 kiruha
 
15.10.13
17:18
(21)
>>в один я их точно не объединю
Выгружаешь результат во временную (Поместить)
Дальше с ней работаешь Все в один запрос сувать не надо
24 Мисти
 
15.10.13
17:21
А несколько запросов отдельно, или в пакете - принципиально на скорость влияют?
25 azernot
 
15.10.13
17:22
(24) В пакете - в смысле пактным запросом? Конечно принципиально. Пакетный обычно быстрее.
26 kiruha
 
15.10.13
17:28
Если про поместить - я большой разницы не заметил
27 kiruha
 
15.10.13
17:29
Менеджер временных должен быть один
28 hhhh
 
15.10.13
17:33
(24) там время всех запросов приблизительно одинаково у вас. Поэтому 100 запросов по 100 строкам табчасти будет выполняться ровно в 100 раз больше, чем один запрос по 100 строкам.
29 azernot
 
15.10.13
17:41
(23) Не думаю, что если не хватает знаний для простого объединения запросов по остаткам и доп.реквизитам номенклатуры, хватит знаний для объединения данных об остатках номенклатуры помещённых во временную таблицу с данными о доп. реквизитах в одном менеджере временных таблиц запроса..
30 zladenuw
 
15.10.13
17:49
(29) та да
31 Мисти
 
15.10.13
18:03
У меня будет 2 запроса, а в циклке по строкам я разберусь, что откуда брать.
32 Мисти
 
15.10.13
18:06
Ну а простой вопрос:
        Запрос = Новый Запрос;
        Запрос.Текст =
        "ВЫБРАТЬ
        |    НоменклатураДополнительныеРеквизиты.Свойство,
        |    НоменклатураДополнительныеРеквизиты.Значение,
        |    НоменклатураДополнительныеРеквизиты.Ссылка
        |ИЗ
        |    Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
        |ГДЕ
        |    НоменклатураДополнительныеРеквизиты.Ссылка В(&МассивНомен)";
        
        Запрос.УстановитьПараметр("МассивНомен", МассивНомен);

Как красиво вставить туда массив?
У меня вот так пока

        МассивНомен = Новый Массив;
        Для Каждого СтрокаТовары Из ВыборкаДокументы.Ссылка.Товары Цикл
            МассивНомен.Добавить(СтрокаТовары.Номенклатура);
        КонецЦикла;

Ну и, кстати, работает - незаметно как. Быстро. Хотя некрасиво, конечно.
33 Eugene_life
 
15.10.13
18:11
(32) Открой для себя МассивНомен =ВыборкаДокументы.Ссылка.Товары.ВыгрузитьКолонку(Номенклатура");
34 kiruha
 
15.10.13
18:22
Вообще то достаточно Ссылки
35 kiruha
 
15.10.13
18:25
Запрос = Новый Запрос;
        Запрос.Текст =
        "ВЫБРАТЬ
        |    НоменклатураДополнительныеРеквизиты.Свойство,
        |    НоменклатураДополнительныеРеквизиты.Значение,
        |    НоменклатураДополнительныеРеквизиты.Ссылка
        |ИЗ
        |    Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
        |ГДЕ
        |    НоменклатураДополнительныеРеквизиты.Ссылка
|В(ВЫБРАТЬ РАЗЛИЧНЫЕ
|    ПоступлениеТоваровУслугТовары.Номенклатура
|ИЗ
|    Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
|ГДЕ
|    ПоступлениеТоваровУслугТовары.Ссылка = &Ссылка)";
36 Зойч
 
15.10.13
18:31
(35) двойка тебе
37 Мисти
 
15.10.13
19:10
Не надо двойку, надо совет.
38 sttt
 
15.10.13
21:31
как то так:
-------------

ВЫБРАТЬ
    НоменклатураДополнительныеРеквизиты.Свойство,
    НоменклатураДополнительныеРеквизиты.Значение,
    НоменклатураДополнительныеРеквизиты.Ссылка
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
        ПО РеализацияТоваровУслугТовары.Номенклатура = НоменклатураДополнительныеРеквизиты.Ссылка
ГДЕ
    РеализацияТоваровУслугТовары.Ссылка В(&МассивДокументов)
39 Лефмихалыч
 
15.10.13
21:38
(0) у тех, кто использует запросы в цикле без жизненной на то необходимости, денег нет и не будет. Народная примета
40 ilkoder
 
15.10.13
21:41
это опять же смотря какой сервер и какой запрос - можно запросом по всем документам за год сервер и вообще положить, а разбив на части потихоньку выполнить. мне нравится запрос из нескольких складывать через временные... забыл как они и называются в запросе "ПОМЕСТИТЬ В"
41 sttt
 
15.10.13
21:42
(39) злыдень)))
42 lEvGl
 
гуру
15.10.13
22:21
не знаю известную велосипедистку лично, как некоторые отписавшиеся в теме, но трололо, по-моему, витает в воздухе. по теме - речь идет о регистре сведений ЗначенияСвойстОбъектов?
43 sttt
 
15.10.13
22:25
(42) не угадал, смотри внимательно (32) это УТ11
44 ilkoder
 
15.10.13
22:27
Дополнительные реквизиты - это табличная часть справочника номенклатура вроде...
45 dmpl
 
15.10.13
22:31
(35) Это будет глючить. Потому что ТЧ в БД и ТЧ в объекте не обязаны совпадать. Да, кстати, а если документ новый и еще ни разу не записанный - что делать?
46 kiruha
 
15.10.13
23:19
(45)
Посмотри на выборку девушки - документы не новый.
Как довести до ума с массивом - пущай сама думает
Разница с  (38) никакой нет, если не нужны реквизиты из ТЧ
А что такое ТЧ в объекте - вообще не понял
47 kiruha
 
15.10.13
23:27
В варианте 38 она может получить в 10 раз больше строк, чем необходимо, что не комильфо
48 фобка
 
15.10.13
23:34
Ответ можно узнать очень просто - реализовать оба варианта и замерить
49 dmpl
 
16.10.13
08:18
(46) Вот я записал документ со 100500 строками, потом открыл документ, очистил табличную часть и добавил 1 строку. Твой запрос даст 100500 строк вместо 1.
50 mishgan75
 
16.10.13
09:16
(46) разница с 38 очень даже есть выражается в скорости(35 будет выполняться существенно дольше)
табличная часть товары в документе (измененном, но еще не записанном) будет отличаться от данных в Базе
51 sttt
 
16.10.13
09:28
(47)(50) про ограничения ничего не было сказано))
52 sttt
 
16.10.13
09:51
(50) сделал как у нее в (32), на каждую строку в документе выводит доп. реквизит, что просили то и получили. ну может малость недоделан, выборку документов в этот же запрос закинуть вместо МассивДокументов
53 kiruha
 
16.10.13
09:52
(50)
Вы что издеваетесь ?
Предположим что есть 10 000 документов с 10 строками 10 свойств. 500 различной номенклатуры
Вариант слевым соединением даст
10 000 * 10 * 10 = 1 млн строк

Вариант "в" (ссылку заменить на массив) даст
500*10 = 5000 строк
54 dmpl
 
16.10.13
10:18
(53) Быстро, но неправильно - это не наш метод.
55 mishgan75
 
16.10.13
10:29
(53) если в (38) добавить "Различные" или сгруппировать правильно запрос, результатом будут те же 5000 строк, только выполняться он будет раз в 100 быстрее (35)
56 mishgan75
 
16.10.13
10:30
(50),(52) с моей точки зрения ты предложил гораздо более правильное решение
57 mishgan75
 
16.10.13
10:31
+(56) естественно к постам (51)(52)
58 kiruha
 
16.10.13
11:32
(55)
Можно поинтересоваться с какой стати Вы так решили ?

Видели план запроса, делали замеры или с чего ?
59 sttt
 
16.10.13
11:56
))))

ВЫБРАТЬ РАЗЛИЧНЫЕ
    ТестовыйДокументТовары.Товар КАК Товар
ПОМЕСТИТЬ СписокТоваров
ИЗ
    Документ.ТестовыйДокумент.Товары КАК ТестовыйДокументТовары
ГДЕ
    ТестовыйДокументТовары.Ссылка.Дата МЕЖДУ &Начало И &Конец

ИНДЕКСИРОВАТЬ ПО
    Товар
;

ВЫБРАТЬ
    ТоварыДополнительныеРеквизиты.Свойство,
    ТоварыДополнительныеРеквизиты.Значение,
    ТоварыДополнительныеРеквизиты.Ссылка
ИЗ
    СписокТоваров КАК СписокТоваров
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Товары.ДополнительныеРеквизиты КАК ТоварыДополнительныеРеквизиты
        ПО СписокТоваров.Товар = ТоварыДополнительныеРеквизиты.Ссылка
60 sttt
 
16.10.13
11:56
(58) тогда лучше это мерять (59)