Имя: Пароль:
1C
1C 7.7
v7: производительность запроса продажи по дням
,
0 perkos
 
25.12.12
06:46
ТекстЗапроса =
   "//{{ЗАПРОС(Продажи)
   |Период с ВыбНачПериода по ВыбКонПериода;
   |Номенклатура = Регистр.Продажи.Номенклатура.ТекущийЭлемент;
   //|Фирма = Регистр.Продажи.Фирма.ТекущийЭлемент;
   |Склад = Регистр.Продажи.Склад.ТекущийЭлемент;
   |Количество = Регистр.Продажи.Количество;
   |ПродСтоимостьРуб = Регистр.Продажи.ПродСтоимостьРуб;
   |Функция КоличествоСумма = Сумма(Количество);
   |Функция ПродСтоимостьРубСумма = Сумма(ПродСтоимостьРуб);
   |Группировка День;
   |Группировка Номенклатура;
   //|Группировка Фирма;
   //|Группировка Склад без групп;
   |Условие(Номенклатура в СписокТоваров);
   |Условие(Склад в СписокСкладов);
   |"//}}ЗАПРОС
   ;

база на mssql запрос выполняется довольно долго даже за неделю более 60 секунд, а мне бы еще этот отчет не помешало делать для разных наборов складов

есть какойнить совет?
1 Андрей_Андреич
 
naïve
25.12.12
07:05
прямые запросы и 1С++
2 Mikeware
 
25.12.12
07:13
попиарюсь, однако.
http://s019.radikal.ru/i641/1212/67/22d446f73dc7.jpg
3 1Сергей
 
25.12.12
07:22
убери .ТекущийЭлемент во всём запросе
4 perkos
 
25.12.12
07:28
(2) это че за зло?
5 perkos
 
25.12.12
07:29
(3) а что так?
6 dk
 
25.12.12
07:32
В СписокТоваров и СписокСкладов сколько элементов?
попробуй по 1 складу и 1 товару ну и (3)
7 Морозов Александр
 
25.12.12
07:32
выключи скл...
8 1Сергей
 
25.12.12
07:32
(5) а нахрена они там нужны? тормозов мало?
9 dk
 
25.12.12
07:33
еще есть волшебные слова "Без Итогов;" )
10 Mikeware
 
25.12.12
07:38
(4) почему "зло"?
сводный анализ продаж.
порядка 20 разрезов, 5 видов итогов. строится в онлайне за месяц порядка 1.5 минут (это около 40 тысяч документов продаж), и дальше крутится-фильтруется в любом виде.
11 perkos
 
25.12.12
07:51
(9) надо итоги ради них запрос...
(6) надо по всем, в списке группы номенклатуры складов, что толку по одному, пробовал быстро.... врядли будет быстрее если я сперва сделаю запрос по списку товаров учавствующем в эти дни в продажах а потом чистый список в запрос суну

(10) ты по документам данные собираешь чтоли? вк?
12 Mikeware
 
25.12.12
07:58
(11) почему "по документам"? из регистра продажи - ну и соответсвенно, реквизиты свойства номенклатуры, контрагентов, договоров... Просто количество документов - чтоб объем мог прикинуть...
13 dk
 
25.12.12
08:09
Итоги можно потом на клиенте посчитать, хотя не факт что быстрее
А про кол-во элементов в фильтре я не просто так спросил, если их там больше сотни, то 1с начинает тупить (в скульной версии)
14 Mikeware
 
25.12.12
08:17
(13) да прямым запросом дернуть, и все.
дольше обсуждать, нежели сделать.
делов ровно на 10 минут с чаем...
15 ЧеловекДуши
 
25.12.12
08:24
>>> |Функция КоличествоСумма = Сумма(Количество);
   |Функция ПродСтоимостьРубСумма = Сумма(ПродСтоимостьРуб);

Народ, мне одному показалось этот текст запроса странный?
Учитывая, что автор работает с регистром :)
16 ЧеловекДуши
 
25.12.12
08:24
+ Нет так же информации, какой это регистр, оборотный или остатков
17 dk
 
25.12.12
08:25
(15) все верно оборотный регистр
18 ЧеловекДуши
 
25.12.12
08:27
Тогда что автор хочет?
Если у него там большой оборот, т.е. торгуют спичками.
То все нормально, запросы от 1Свсегда долго играющие :)
...
Если автору нужна скорость, то ему нужно читать (1) до просветления :)
19 perkos
 
25.12.12
08:28
(14) раз так просто набросай как начать
20 Mikeware
 
25.12.12
08:28
(18) автор хочет, чтоб сделали за него...
21 perkos
 
25.12.12
08:29
(18) тут дело не в спичках а в большом номенклатурном справочнике похоже.... продаж не так и много
22 Mikeware
 
25.12.12
08:29
во! я ж говорил!
(19)начни с
SELECT
23 ЧеловекДуши
 
25.12.12
08:33
(19)

Перем ЗапросSQL, ТекстЗапроса;
Перем Мета;
   
ТЗ_Результ=СоздатьОбъект("ТаблицаЗначений");
   
Мета=СоздатьОбъект("MetaDataWork");
   
//ЗапросSQL = глУстановитьНаборЗаписей();
ЗапросSQL = 0;
ЗапросSQL = СоздатьОбъект("ODBCRecordSet");
ЗапросSQL.УстБД1С();  
   
Если глОтладкаSQL=1 Тогда
   ЗапросSQL.Отладка(1);
КонецЕсли;
   
ЗапросSQL.УстановитьТекстовыйПараметр("ВыбНачПериода",ВыбНачПериода);
ЗапросSQL.УстановитьТекстовыйПараметр("ВыбКонПериода",ВыбКонПериода);

ТекстЗапроса = "
|SELECT ";
|FROM $Справочник.Контрагенты AS Контр(NOLOCK)
|LEFT OUTER JOIN $Регистр.АкцииНаЦены AS АЦ(NOLOCK) ON (Контр.ID = $АЦ.Контрагент)
|LEFT OUTER JOIN $Справочник.Номенклатура AS Товар(NOLOCK) ON ($АЦ.Номенклатура = Товар.ID)
|Where
|    ( ($АЦ.НачалоАкции >= :ВыбНачПериода~~) and ($АЦ.КонецАкции <= :ВыбКонПериода~~)
|    or ($АЦ.НачалоАкции >= :ВыбНачПериода~~) and ($АЦ.НачалоАкции <= :ВыбКонПериода~~)
|    or ($АЦ.КонецАкции >= :ВыбНачПериода~~) and ($АЦ.КонецАкции <= :ВыбКонПериода~~) )
|    And Товар.ID is not null
|    And IsNull($АЦ.ТипЦены,:ПустойЭлемент) <> :ПустойЭлемент
|    And IsNull($АЦ.Единица,:ПустойЭлемент) <> :ПустойЭлемент ";
ТекстЗапроса = ТекстЗапроса + "
|Group By
|    Матрица.Сети
|    ,Матрица.ЦенаС
|    ,Матрица.НачалоАкции
|    ,Матрица.КонецАкции
|    ,Матрица.ДокумАкции
|   ,Матрица.ПорядокДок
|
//|Having
//|    $АЦ.Цена <> 0
//|
|Order By
|    Replace(Матрица.Контрагент + Матрица.ТипЦен + Матрица.Номенклатура,' ','%')
|    ,Матрица.ПорядокДок
|
|";

   Если ЗапросSQL.Подготовить(ТекстЗапроса) = 0 Тогда
       Сообщить(""+ЗапросSQL.GetLastError()+"
       |"+ТекстЗапроса, "!");
       Возврат ;
   КонецЕсли;
   
   Попытка
       ЗначСпс = ЗапросSQL.ВыполнитьИнструкцию(,ТЗ_Результ,1);
   Исключение
       Сообщить("ВыполнитьИнструкцию: "+ОписаниеОшибки());
   КонецПопытки;
   
   Попытка
       ЗапросSQL.Закрыть();
   Исключение
       Сообщить("Закрыть SQL запрос: "+ОписаниеОшибки());
   КонецПопытки;
   
   Если ТЗ_Результ.КоличествоКолонок() = 0 Тогда
       Сообщить("Ошибка в запросе SQL! Запрос не выполнен! СформироватьSQLзапрос("+Строка(ЗначСпс)+")");
       Возврат;
   КонецЕсли;
24 ЧеловекДуши
 
25.12.12
08:34
+ Текст самого запроса накидаешь сам :)
По аналогии, читать про 1С++ тут http://www.1cpp.ru/forum/YaBB.pl?board=general
25 ЧеловекДуши
 
25.12.12
08:38
+(21)Если продаж не много, то ты походу вообще не разбираешься в объемах информации :)
...порой, все дело куда хуже... ДНК...
26 perkos
 
25.12.12
09:01
а можно сделать чтобы по итогам шагалось типа

Пока Запрос.Группировка(1) = 1 Цикл
       // День
       
       тзПродаж.НоваяКолонка(БезРазделителей(Запрос.День),,,,Строка(Запрос.День));
       
       Склад = Запрос.Склад;
       Пока Запрос.Группировка(2) = 1 Цикл
           // Номенклатура
           Если СписокТоваров.НайтиЗначение(Запрос.Номенклатура)<>0 Тогда
.
.
.
27 dk
 
25.12.12
09:04
выгрузи в Индексную таблицу, сгруппируй и потом через ИндТЗ.ТЗПотомки
28 Mikeware
 
25.12.12
09:05
(27) бугага©
29 dk
 
25.12.12
09:06
?
30 Mikeware
 
25.12.12
09:08
(29)см (20), и последняя строчка в (25)
31 perkos
 
25.12.12
09:12
ну вы и тролли(=
32 МихаилМ
 
25.12.12
09:14
замените
|Группировка Номенклатура без упорябочивания;
33 ЧеловекДуши
 
25.12.12
09:15
(29)Он к тому, что в (20), и последняя строчка в (25) :)
34 ЧеловекДуши
 
25.12.12
09:17
(31)Тебе привели возможность написать прямой запрос в (23) (24)... Учись, познавай новое... Если не хочется, то твоя строчка в (25) :)
35 perkos
 
25.12.12
09:17
(20) и (25) самое важное обратите внимание(=
36 ЧеловекДуши
 
25.12.12
09:18
(35)Постигай тогда в (27)... там еще круче :)
37 ЧеловекДуши
 
25.12.12
09:18
+ Думать нужно меньше
38 perkos
 
26.12.12
06:55
http://www.1cpp.ru/forumfiles/Attachments/mod_002.zip

качественно разжеванное руководство
39 perkos
 
26.12.12
12:37
|SELECT
   |Продажи.Период AS Период,    
   |Продажи.Номенклатура AS [Товар $Справочник.Номенклатура],
   |Продажи.Склад AS [Склад $Справочник.Склады],
   |SUM(Продажи.КоличествоОборот) AS Количество,
   |SUM(Продажи.ПродСтоимостьРубОборот) AS ПродСтоим
   |FROM $РегистрОбороты.Продажи(:ВыбНачПериода,:ВыбКонПериода~,День,,,(Номенклатура,Склад),(Количество,ПродСтоимостьРуб)) AS Продажи
   |WHERE $Продажи.Склад IN (SELECT Val FROM #Группа))
   |GROUP BY
   |Продажи.Период,
   |Продажи.Номенклатура,
   |Продажи.Склад
   |ORDER BY Продажи.Период,
   |Продажи.Склад,
   |Продажи.Номенклатура
   |";        

Meta name parser error: неизвестное метаимя или алиас "$Продажи"

а если без доллара делаю то пишет
ВыполнитьИнструкцию: State 42000, native 170, message [Microsoft][ODBC SQL Server Driver][SQL Server]Line 25: Incorrect syntax near ')'.
Ошибка в запросе SQL! Запрос не выполнен! СформироватьSQLзапрос()

хелп
40 Dolly_EV
 
26.12.12
13:28
(39)
   |SELECT
   |    Продажи.Период AS Период    
   |    ,Продажи.Номенклатура AS [Товар $Справочник.Номенклатура]
   |    ,Продажи.Склад AS [Склад $Справочник.Склады]
   |    ,SUM(Продажи.КоличествоОборот) AS Количество
   |    ,SUM(Продажи.ПродСтоимостьРубОборот) AS ПродСтоим
   |FROM
   |    $РегистрОбороты.Продажи(:ВыбНачПериода,:ВыбКонПериода~,День,,(Склад IN (SELECT Val FROM #Группа)),(Номенклатура,Склад),(Количество,ПродСтоимостьРуб)) AS Продажи
   |GROUP BY
   |    Продажи.Период,Продажи.Номенклатура,Продажи.Склад
   |ORDER BY Продажи.Период,Продажи.Склад,Продажи.Номенклатура";
41 Dolly_EV
 
26.12.12
13:30
Ну а в твоем варианте - в строке WHERE в конце лишняя скобка ))) ну и "$" убрать
42 Ёпрст
 
26.12.12
13:34
как бэ гроуп бай там не нужен вообще, ВТ и так свёрнута
43 perkos
 
26.12.12
14:37
(42) да нет не сворачивает без груп бай...
2664 строк с груп бай
3002 без груп бай


далею так

   Перем ЗапросSQL, ТекстЗапроса;
   Перем Мета;
   
   ТЗ_Результ=СоздатьОбъект("ТаблицаЗначений");
   
   Мета=СоздатьОбъект("MetaDataWork");
   
   //ЗапросSQL = глУстановитьНаборЗаписей();
   
   ЗапросSQL = 0;
   ЗапросSQL = СоздатьОбъект("ODBCRecordSet");
   ЗапросSQL.УстБД1С();  
   
   ЗапросSQL.УстановитьТекстовыйПараметр("ВыбНачПериода",ВыбНачПериода);
   ЗапросSQL.УстановитьТекстовыйПараметр("ВыбКонПериода",ВыбКонПериода);
   
   СписокСкладов = СоздатьОбъект("СписокЗначений");
   тзСклады.Выгрузить(СписокСкладов,,,"Склад");
   ЗапросSQL.УложитьСписокОбъектов13(СписокСкладов, "#Группа");
   
   ТекстЗапроса = "
   |SELECT
   |Продажи.Период AS Период,    
   |Продажи.Номенклатура AS [Товар $Справочник.Номенклатура],
   |SUM(Продажи.КоличествоОборот) AS Количество,
   |SUM(Продажи.ПродСтоимостьРубОборот) AS ПродСтоим
   |FROM $РегистрОбороты.Продажи(:ВыбНачПериода,:ВыбКонПериода~,День,,Склад IN (SELECT Val FROM #Группа),(Номенклатура,Склад),(Количество,ПродСтоимостьРуб)) AS Продажи
   |GROUP BY Продажи.Период,Продажи.Номенклатура
   |ORDER BY Продажи.Период,Продажи.Номенклатура
   |";                                                              
   
   Если ЗапросSQL.Подготовить(ТекстЗапроса) = 0 Тогда
       Сообщить(""+ЗапросSQL.GetLastError()+"
       |"+ТекстЗапроса, "!");
       Возврат ТЗ_Результ;
   КонецЕсли;
   
   Попытка
       ЗначСпс = ЗапросSQL.ВыполнитьИнструкцию(,ТЗ_Результ,1);
   Исключение
       Сообщить("ВыполнитьИнструкцию: "+ОписаниеОшибки());
   КонецПопытки;
   
   Попытка
       ЗапросSQL.Закрыть();
   Исключение
       Сообщить("Закрыть SQL запрос: "+ОписаниеОшибки());
   КонецПопытки;
   
   Если ТЗ_Результ.КоличествоКолонок() = 0 Тогда
       Сообщить("Ошибка в запросе SQL! Запрос не выполнен! СформироватьSQLзапрос("+Строка(ЗначСпс)+")");
       Возврат ТЗ_Результ;
   КонецЕсли;
                             
   Сообщить(ТЗ_Результ.КоличествоСтрок());

   ТЗ_Результ.ВыбратьСтроку();
                 
   Возврат ТЗ_Результ;

с этим условием хоть внутри ВТ хоть во WHERE выборка пустая... хотя по (0) с тем же списком все выбирает...
44 perkos
 
26.12.12
14:40
этот запрос без условия по складам и номенклатуре выполняется за 2 секунды, а 1с запрос за 140 секунд
45 perkos
 
26.12.12
14:45
(41)
в статье acsent пример

Тот же пример, но по списку контрагентов:
ТекстЗапроса = "
|SELECT
|    Док.IDDoc as [Док $Документ.Реализация]
|FROM
|    $Документ.Реализация as Док
|WHERE
|    $Док.Контрагент IN (SELECT Val FROM #Группа)";
RS.УложитьСписокОбъектов13(Список, "#Группа");
46 perkos
 
26.12.12
14:52
СписокСкладов = СоздатьОбъект("СписокЗначений");
   тзСклады.Выгрузить(СписокСкладов,,,"Склад");
   ЗапросSQL.УложитьСписокОбъектов13(СписокСкладов, "#Группа");
   
   ТекстЗапроса = "
   |SELECT
   |Продажи.Период AS Период,    
   |Продажи.Номенклатура AS [Товар $Справочник.Номенклатура],
   |SUM(Продажи.КоличествоОборот) AS Количество,
   |SUM(Продажи.ПродСтоимостьРубОборот) AS ПродСтоим
   |FROM $РегистрОбороты.Продажи(:ВыбНачПериода,:ВыбКонПериода~,День,,,(Номенклатура,Склад),(Количество,ПродСтоимостьРуб)) AS Продажи
   |WHERE $Продажи.Склад IN (SELECT Val FROM #Группа)
   |GROUP BY Продажи.Период,Продажи.Номенклатура
   |ORDER BY Продажи.Период,Продажи.Номенклатура
   |";

Meta name parser error: неизвестное метаимя или алиас "$Продажи"

почему? я думаю какраз в преобразовании дело, в списке моем 1с склады сравниваются с складами МССКЛ
47 Dolly_EV
 
27.12.12
06:09
(46) в примере из статьи $Док - потому что это алиас реальной таблицы (Документ.Реализация), а у тебя Продажи - это алиас виртуальной таблицы, поэтому надо без $
в (39) у тебя таки в строке в ГДЕ в конце - лишняя скобка
и список складов вот так уложи:
ЗапросSQL.УложитьСписокОбъектов(СписокСкладов,"#Группа","ВидСправочникаСкладыКакУТебяНазывается")
48 Dolly_EV
 
27.12.12
06:13
И если тебе в итоге не нужна группировка по "Склад" - выкини его из измерений ВТ, и не надо будет делать ГрупБай (поэтому у тебя и разное количество строк: без ГрупБай - Номенклатура, помноженная на колво Складов, с ГрупБай - только Номенклатура)
49 perkos
 
27.12.12
06:17
угу уже попробовал укладывать с видом и без 13, работает... вот и надейся на руководства(=
50 perkos
 
27.12.12
06:26
вот такая красота получилась

   ТекстЗапроса = "
   |SELECT
   |Продажи.Период AS Период,
   |Продажи.Номенклатура AS [Товар $Справочник.Номенклатура],
   |Продажи.КоличествоОборот AS Количество,
   |Продажи.ПродСтоимостьРубОборот AS ПродСтоим
   |FROM $РегистрОбороты.Продажи(:ВыбНачПериода,:ВыбКонПериода~,День,,Склад IN (SELECT Val FROM #Группа),(Номенклатура),(Количество,ПродСтоимостьРуб)) AS Продажи
   |ORDER BY Продажи.Период,Продажи.Номенклатура
   |";                                                              

   СписокСкладов = СоздатьОбъект("СписокЗначений");
   тзСклады.Выгрузить(СписокСкладов,,,"Склад");
   ЗапросSQL.УложитьСписокОбъектов(СписокСкладов, "#Группа", "Склады");
51 perkos
 
27.12.12
06:59
ТекстЗапроса =
   "//{{ЗАПРОС(Продажи)
   |Период с ВыбНачПериода по ВыбКонПериода;
   |Номенклатура = Регистр.Продажи.Номенклатура;
   |Склад = Регистр.Продажи.Склад;
   |Количество = Регистр.Продажи.Количество;
   |ПродСтоимостьРуб = Регистр.Продажи.ПродСтоимостьРуб;
   |Функция КоличествоСумма = Сумма(Количество);
   |Функция ПродСтоимостьРубСумма = Сумма(ПродСтоимостьРуб);
   |Группировка День;
   |Группировка Номенклатура;
   |Условие(Номенклатура в СписокТоваров);
   |Условие(Склад в СписокСкладов);
   |"//}}ЗАПРОС
   ;    

146секунд

ТекстЗапроса = "
   |SELECT
   |Продажи.Период AS Период,
   |Продажи.Номенклатура AS [Товар $Справочник.Номенклатура],
   |Продажи.КоличествоОборот AS Количество,
   |Продажи.ПродСтоимостьРубОборот AS ПродСтоим
   |FROM $РегистрОбороты.Продажи(:ВыбНачПериода,:ВыбКонПериода~,День,,(Склад IN (SELECT Val FROM #СписокС)) AND (Номенклатура IN (SELECT Val FROM #СписокН)),(Номенклатура),(Количество,ПродСтоимостьРуб)) AS Продажи
   |ORDER BY Продажи.Период,Продажи.Номенклатура
   |";                                                              
   
   СписокТоваров = СоздатьОбъект("СписокЗначений");
   тзТовары.Выгрузить(СписокТоваров,,,"Товар");
   ЗапросSQL.УложитьСписокОбъектов(СписокТоваров, "#СписокН", "Номенклатура");
   
   СписокСкладов = СоздатьОбъект("СписокЗначений");
   тзСклады.Выгрузить(СписокСкладов,,,"Склад");
   ЗапросSQL.УложитьСписокОбъектов(СписокСкладов, "#СписокС", "Склады");

157 секунд

одбц проиграл(= проблема производительности в условии с "В" по номенклатуре(мой случай) нельзя им пользоватся впринципе, обрабатывать только после полной выборки....

без условия оба варианта работают одинаково быстро..
52 perkos
 
27.12.12
07:14
я что то не так понимаю или всетаки голые запросы все же не эффективны без скрипта обработки результата?

курсоры в т-скл или циклы в 1с необходимы для нормальной производительности
53 ЧеловекДуши
 
27.12.12
07:28
(52)Да... не понимаешь...
"РегистрОбороты" - создает вложенный запрос, и тут все зависит от производительности сервера SQL.
Так, как у тебя оборотный регистр, то лучше написать запрос к регистру самому и без подзапросов :)
54 ЧеловекДуши
 
27.12.12
07:29
+ >>>     |Продажи.КоличествоОборот AS Количество,
   |Продажи.ПродСтоимостьРубОборот AS ПродСтоим

А где команда "Sum(<!>)" ?
55 ЧеловекДуши
 
27.12.12
07:30
+ Он у тебя вообще выдал простыню :DDDDD
56 ЧеловекДуши
 
27.12.12
07:32
+ Убери еще вот это

|ORDER BY Продажи.Период,Продажи.Номенклатура

Зачем еще быстрее получится :)
57 perkos
 
27.12.12
07:40
(55)

   |SELECT
   |Продажи.Период AS Период,
   |Продажи.Номенклатура AS [Товар $Справочник.Номенклатура],
   //|SUM(Продажи.КоличествоОборот) AS Количество,
   //|SUM(Продажи.ПродСтоимостьРубОборот) AS ПродСтоим
   |Продажи.КоличествоОборот AS Количество,
   |Продажи.ПродСтоимостьРубОборот AS ПродСтоим
//    |FROM $РегистрОбороты.Продажи(:ВыбНачПериода,:ВыбКонПериода~,День,,(Склад IN (SELECT Val FROM #СписокС)) AND (Номенклатура IN (SELECT Val FROM #СписокН)),(Номенклатура),(Количество,ПродСтоимостьРуб)) AS Продажи
   |FROM $РегистрОбороты.Продажи(:ВыбНачПериода,:ВыбКонПериода~,День,,Склад IN (SELECT Val FROM #СписокС),(Номенклатура),(Количество,ПродСтоимостьРуб)) AS Продажи
   //|GROUP BY Продажи.Период,Продажи.Номенклатура
   |ORDER BY Продажи.Период,Продажи.Номенклатура
   |";

количество строк одинаковое с sum и без, sum без групБай не пашет Column 'Продажи.Период' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.

(56) да это не принципиально...
58 dk
 
27.12.12
07:43
(54) мимо
(51)
попробуй

   |Период с ВыбНачПериода по ВыбКонПериода;
   |Номенклатура = Регистр.Продажи.Номенклатура;
   |Склад = Регистр.Продажи.Склад;
   |Количество = Регистр.Продажи.Количество;
   |ПродСтоимостьРуб = Регистр.Продажи.ПродСтоимостьРуб;
   |Функция КоличествоСумма = Сумма(Количество);
   |Функция ПродСтоимостьРубСумма = Сумма(ПродСтоимостьРуб);
   |Без Итогов;
   |Группировка День;
   |Группировка Номенклатура;
   |Условие(Склад в СписокСкладов);
   |Условие(Номенклатура в СписокТоваров);

Скуль или дбф?
59 ЧеловекДуши
 
27.12.12
07:44
Скуль у него
60 ЧеловекДуши
 
27.12.12
07:45
(57)Паццак, это SQL, тут тебе дается мего механизм запросов, где нужно варьировать и оптимизировать самому :)
т.е. все зависит от твоей фантазии...
"Просто вы не умеете её готовить" (с)
61 ЧеловекДуши
 
27.12.12
07:48
+(57)>>> да это не принципиально...

Не принципиально, ты еще и с ТЗ работать не умеешь?
Поди команду "Сортировать" не знаешь?
Да и как всегда делаешь все методом:

ТЗ.ВыбратьСтроки();
+ и т.д.

Так вот, этот метод мего тормозит при больших простынках :)
Так же, не забывай, 1С-ные запросы еще мего тормозят при 30-50-ти пользователях в одной БД. :)
62 perkos
 
27.12.12
07:53
(61) а про выбрать строки итд действительно так и делаю, покажи как быстрее хотя это тоже принципиально не меняет производительность..

(60) ты о чем вапще? (54) мимо видишь? (61) сортировка не меняет время выполнения на 100 секунд как это делает отсутствие условия В или подзапрос...
человек не души уже....



(58) мне этот запрос без итогов не нужен... я номенклатуру быстро после запроса выбираю за секунду... это все копейки... просто нельзя совать условие В
63 dk
 
27.12.12
07:56
я уже спрашивал сколько элементов ты в условие пихаешь?
может у тебя в ТЗ несколько тысяч строк
ну и свернуть фильтр не помешает
64 dk
 
27.12.12
08:00

SELECT
   ПродажиОбороты.Период Период
   , ПродажиОбороты.Товар [Товар $Справочник.Номенклатура]
   , ПродажиОбороты.КоличествоОборот
   , ПродажиОбороты.СуммаОборот
FROM $РегистрОбороты.Продажи(:НачДата,
       :КонДата~,
       День,,
       (Товар = :ВыбТовар),
       Товар,
       (Количество, Сумма)) AS ПродажиОбороты

работает без группировок
65 perkos
 
27.12.12
08:02
(63) там много номенклатуры группами выбирается может и несколько тысяч,
свернуть фильтр - убрать условие, правильно понял?
(64) это зачем? тема иссякла кажется
66 dk
 
27.12.12
08:03
свернуть фильтр, условие оставить
67 perkos
 
27.12.12
08:10
фильтр == условие ??? что такое фильтр по твоему список номенклатуры? свернуть? я пробовал его уменьшать ставить в него только номенклатуру которая реально была продана за период выборки это не дает результатов... ты об этом?
68 perkos
 
27.12.12
08:14
тут либо без ВТ делать запрос как говорит (53) что впринципе для меня сомнительно...

либо просто убрать это условие на список номенклатуры из запроса и добавить его на обработку результата.
69 dk
 
27.12.12
08:19
СписокСкладов = СоздатьОбъект("СписокЗначений");
ВремТЗ = СоздатьОбъект("ТаблицаЗначений");
тзСклады.Выгрузить(ВремТЗ,,,"Склад");
ВремТЗ.Свернуть("Склад", "");
ВремТЗ.Выгрузить(СписокСкладов,,,"Склад");

и с товарами тоже самое
70 perkos
 
27.12.12
09:09
пробовал я примерно так же, никаких задвоев в списке номенклатуры небыло проверял...
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс