Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Горячая тема (более 10 ответов) Группировка() (число прочтений - 6375 )
mrgreen
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 32
Зарегистрирован: 01. Августа 2009
Группировка()
01. Августа 2009 :: 09:33
Печать  
интересует возможность организации выборки для использования её обхода каким-нибудь аналогом функции "Группировка()" в 7.7

неудобно и нереально обрабатывать таблицу данных полученную из прямого запроса... скажем для построения отчетов с динамическими группировками/фильтрами
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Группировка()
Ответ #1 - 01. Августа 2009 :: 09:37
Печать  
mrgreen писал(а) 01. Августа 2009 :: 09:33:
интересует возможность организации выборки для использования её обхода каким-нибудь аналогом функции "Группировка()" в 7.7

неудобно и нереально обрабатывать таблицу данных полученную из прямого запроса... скажем для построения отчетов с динамическими группировками/фильтрами

А чем ИТЗ и группировка в ней не устраивает?
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
mrgreen
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 32
Зарегистрирован: 01. Августа 2009
Re: Группировка()
Ответ #2 - 01. Августа 2009 :: 10:09
Печать  
ну скажем вот запрос

           |SELECT $ОстаткиИтоги.Номенклатура [Номенклатура $Справочник.Номенклатура]
           |      , $ОстаткиИтоги.Склад [Склад $Справочник.Склады]
           |      , Sum($ОстаткиИтоги.Кво) СуммаКво
           |FROM $РегистрИтоги.Остатки AS ОстаткиИтоги
           |WHERE ($ОстаткиИтоги.Номенклатура IN (:ВыбНоменклатура))
           |GROUP BY $ОстаткиИтоги.Номенклатура
           |      , $ОстаткиИтоги.Склад
           |ORDER BY $ОстаткиИтоги.Склад
           |      , $ОстаткиИтоги.Номенклатура
           |";

2-групировки - номенклатура и склад... так вот необходимо вывести таблицу "вниз" - номенклатура а "вправо" - склады... на пересечении  - количество

в этом конкретном случае конечно можно свернуть её по складам получив список оных затем выводя номенклатуру присоединять списком складов секции с данными о найдёном в исходной таблице значении о количестве

но так это простейший запрос а если добвляем под складами ещё разделения на виды движений (приход расход возвраты списание и т.д.)... номенклатуру по группам а склады с видами движений по перидам... + сап текст запроса зависит от настроек динамических группировок и фильтров

такая обработка уже малореальна... в 1с стандартном всё решается при помощи Запрос.получить(,,,) а там уже Запрос.Группировка()... в моём случае - получаем до уровня склад а там обходим уже по складам
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Группировка()
Ответ #3 - 01. Августа 2009 :: 11:30
Печать  
Во всех отчетах у себя сделал примерно следующим образом. На основании того, что там навыбирает пользователь в настройках отчета, динамически строится текст запроса. Результат инсертится во временную таблицу. Далее на эту временную таблицу ставлю индексы. При выводе отчета рекурсивно обхожу группировки(Номенклатура,Склад), для каждой группировки выполняется соотвт. селект, выводится результат. Все летает, и намного удобнее чем Запрос.получить(,,,) и тп.
  
Наверх
 
IP записан
 
mrgreen
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 32
Зарегистрирован: 01. Августа 2009
Re: Группировка()
Ответ #4 - 01. Августа 2009 :: 12:31
Печать  
а тогда в чем разница между таким методом и методом простого выдёргивания каждого конкретного значения внутри цикла по строкам таблицы из исходной таблицы регистра данных.... ? ну таблица выборки меньше конечно т.к. уже содержит отфильтрованные данные и пошустрее значит

но скорость то падает из за рекурсий и циклических запросов

неужели нет метода выгружать в аналог структуры выборки данных в оригинальном 1с запросе ?
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Группировка()
Ответ #5 - 01. Августа 2009 :: 12:49
Печать  
Ну, во-первых, не тянем на клиента сразу все данные в таблицу значений.
Пользователи любят сделать отчет, чтобы показало все и сразу, фильтрами не очень любят пользоватьсяУлыбка Инсерт во временную таблицу будет куда быстрее, чем загрузка в ТЗ/ИТЗ. Потом в тз загружаем уже порциями.
Во-вторых, удобно писать код, так как есть временная таблица, можно использовать просто sql, не нужны никакие доп.методы. В некоторых случаях нужно вывести, например, не просто сумму для группировки, а диапазон значений, мин/макс и т.д. На sql из врем.таблицы без проблем можно выбрать что угодно.
Скорость из-за циклов и рекурсии не страдает, т.к. в любом  случае нужно пройти циклом все строки и вывести в Таблицу. Только здесь нет, свертки/группировки тз/итз.
зы: ну не знаю, это ж просто вариантУлыбка Сам пользуюсь, устраивает)
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Группировка()
Ответ #6 - 02. Августа 2009 :: 16:12
Печать  
Для запросов с различными группировками вниз-вправо отлично подходит OLAP посмотри отличную вещь - консоль запросов от berezdetsky
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Группировка()
Ответ #7 - 02. Августа 2009 :: 18:40
Печать  
alexdd писал(а) 01. Августа 2009 :: 11:30:
Во всех отчетах у себя сделал примерно следующим образом. На основании того, что там навыбирает пользователь в настройках отчета, динамически строится текст запроса. Результат инсертится во временную таблицу. Далее на эту временную таблицу ставлю индексы. При выводе отчета рекурсивно обхожу группировки(Номенклатура,Склад), для каждой группировки выполняется соотвт. селект, выводится результат. Все летает, и намного удобнее чем Запрос.получить(,,,) и тп.


Делал подобное с помощью grouping & rollup
Вроде гораздо проще
Еще вариант - использование ИТЗ как говорили, так счас и делаю всегда (пришмандолил МФ из ТиС под прямые запросы)
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
mrgreen
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 32
Зарегистрирован: 01. Августа 2009
Re: Группировка()
Ответ #8 - 05. Августа 2009 :: 08:32
Печать  
консоль запросов посмотрел - весчь не спорю разбираюсь пока

я вот что подумал... есть же такая весчь как курсоры... их может быть заюзать в этом деле - перемещение по выборке  - то что нужно вот ещё бы их как-то между собой связать (ну как вложенные группировки) так вообще задача была б решена только построением запроса а обработка при выводе минимальна
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Группировка()
Ответ #9 - 05. Августа 2009 :: 08:45
Печать  
mrgreen писал(а) 05. Августа 2009 :: 08:32:
консоль запросов посмотрел - весчь не спорю разбираюсь пока

я вот что подумал... есть же такая весчь как курсоры... их может быть заюзать в этом деле - перемещение по выборке  - то что нужно вот ещё бы их как-то между собой связать (ну как вложенные группировки) так вообще задача была б решена только построением запроса а обработка при выводе минимальна

не совсем понятно о каких курсорах речь. Лучше примерчик.
Если речь об sql курсорах то во первых их все ругают так как
очень много на них уходит ресурсов sql сервера.
Во вторых курсоры будут лезть за данными к основным таблицам
1с а эти таблицы очень часто могут полностью блокироваться ( 1с в обычном режиме работы ) со всеми вытекающими последствиями.
Лучше делать как говорит alexdd в посте № 3
либо какой либо локальный olap ( pivot ) , либо ИТЗ
  
Наверх
 
IP записан
 
mrgreen
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 32
Зарегистрирован: 01. Августа 2009
Re: Группировка()
Ответ #10 - 06. Августа 2009 :: 06:34
Печать  
Цитата:
Если речь об sql курсорах то во первых их все ругают так как
очень много на них уходит ресурсов sql сервера.


о них самых... ну если не вариант то и фих с ним

Изменено:
Во вторых курсоры будут лезть за данными к основным таблицам
1с а эти таблицы очень часто могут полностью блокироваться


а простые выборки разве не лезут ? да и блокировка происходит полностью журнала док-тов в любом случае (а док-ты мне нужны - там в них птичек признаков много и простым добавлением доп. поля быстрой обработки движений на регистр для отбора по периоду не обойдёшся всё равно)
  
Наверх
 
IP записан
 
mrgreen
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 32
Зарегистрирован: 01. Августа 2009
Re: Группировка()
Ответ #11 - 06. Августа 2009 :: 08:35
Печать  
Код
Выбрать все
посмотри отличную вещь - консоль запросов от berezdetsky  



мдя... а как с её помощью сдулать вывод группировки по документам регистраторам ? нельзя связать журнал документов с виртуальной таблицей "остаткиобороты"
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Группировка()
Ответ #12 - 06. Августа 2009 :: 08:58
Печать  
mrgreen писал(а) 06. Августа 2009 :: 08:35:
мдя... а как с её помощью сдулать вывод группировки по документам регистраторам ? нельзя связать журнал документов с виртуальной таблицей "остаткиобороты"

С чего вдруг? Хоть обсоединяйся.  Смех
Другой вопрос, что польза от использования ВТ ОстаткиОбороты в сводных таблицах представляется мне несколько сомнительной.  Круглые глаза
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Группировка()
Ответ #13 - 06. Августа 2009 :: 10:06
Печать  
mrgreen писал(а) 06. Августа 2009 :: 06:34:
Цитата:
Если речь об sql курсорах то во первых их все ругают так как
очень много на них уходит ресурсов sql сервера.


о них самых... ну если не вариант то и фих с ним

Изменено:
Во вторых курсоры будут лезть за данными к основным таблицам
1с а эти таблицы очень часто могут полностью блокироваться


а простые выборки разве не лезут ? да и блокировка происходит полностью журнала док-тов в любом случае (а док-ты мне нужны - там в них птичек признаков много и простым добавлением доп. поля быстрой обработки движений на регистр для отбора по периоду не обойдёшся всё равно)

Простые выборки свои можно  поставить ( только осознано )
(nolock) и не будет блокировки
Также в посте #3 все один раз закидывается в свою временую таблицу и крути ее сколько хочешь без блокировок.
  
Наверх
 
IP записан
 
mrgreen
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 32
Зарегистрирован: 01. Августа 2009
Re: Группировка()
Ответ #14 - 06. Августа 2009 :: 10:37
Печать  
Ладно - бум ломать голову потом... пока использовал Rollup... итого получилось вот такое (писал вручную без конструктора в мелкософтском анализёре)

Задача была вывести вниз товар с размером а вправо склады с видами движений... т.е. получить на выходе хотяб таблицу с итогами по группировкам Товар,Размер,Склад и выч. полям Приход,  Списание, Продажа, КонОстаток


Код
Выбрать все
SELECT    

			_Номенклатура as НоменклатураСсылка, Размер, _Склад as СкладСсылка, -- ссылка на номенклатуру, размер, склад
			SUM(_НачОст) AS НачОст, -- начальный остаток
			SUM(CASE WHEN (ВидД = 105) OR (ВидД = 52) OR (ВидД = 3737) THEN _Приход ELSE 0 END) AS КвоПрих, -- приход (если Вид док = "Приход" или "ВводОстатков" или "Перемещение")
			SUM(CASE WHEN (ВидД = 443) OR (ВидД = 3737) THEN _Расход ELSE 0 END) AS КвоСпис, -- списание (если Вид док = "Списание" или "Перемещение")
			SUM(CASE WHEN ВидД = 3767 THEN _Расход ELSE 0 END) AS КвоПрод, -- продажа (если Вид док = "Продажа")
			SUM(_НачОст+_Приход-_Расход) AS КвоОст -- конечный остаток

FROM        (SELECT --итог нач. остатки

					SP565 AS _Номенклатура, SC21.DESCR As Размер, SP564 As _Склад,  0 As ВидД,
					SUM(0) AS _Приход,
					SUM(0) AS _Расход,
					SUM(ОстаткиИтоги.SP71) AS _НачОст

					FROM  RG67 AS ОстаткиИтоги
								INNER JOIN --получим ссылку на размеры
									SC21 ON ОстаткиИтоги.SP566 = SC21.ID
								INNER JOIN --получим ссылку на склады
									SC297 ON ОстаткиИтоги.SP564 = SC297.ID

                    WHERE (ОстаткиИтоги.PERIOD = '20090301') --отбираем период

                    GROUP BY  SP565, SC21.DESCR, SP564

             UNION ALL --объединение

             SELECT --итоги движения

					SP565 AS _Номенклатура, SC21_1.DESCR As Размер, SP564 As _Склад, TbD.IDDOCDEF As ВидД,
					SUM(Остатки.SP71 * CASE WHEN Остатки.DEBKRED = 0 THEN 1 ELSE 0 END) AS _Приход,
					SUM(Остатки.SP71 * CASE WHEN Остатки.DEBKRED = 1 THEN 1 ELSE 0 END) AS _Расход,
					SUM(0) AS _НачОст

                    FROM RA67 AS Остатки
								INNER JOIN --получим ссылку на размеры
                                    SC21 AS SC21_1 ON Остатки.SP566 = SC21_1.ID
								INNER JOIN --получим ссылку на виды док-тов
									_1SJOURN As TbD ON Остатки.IDDOC = TbD.IDDOC
								INNER JOIN --получим ссылку на склады
									SC297 As SC297_1 ON Остатки.SP564 = SC297_1.ID

                   WHERE     (CAST(LEFT(Остатки.DATE_TIME_IDDOC, 8) AS datetime) >= '20090401') AND (CAST(LEFT(Остатки.DATE_TIME_IDDOC, 8) AS datetime)<= '20090405') --отбираем период

                   GROUP BY SP565, SC21_1.DESCR, TbD.IDDOCDEF, SP564
			) AS TMP -- алиас виртуальной таблицы с полями Номенклатура,Размер,Склад, ВидД,_Приход,_Расход

WHERE  not((_НачОст=0) and (_Приход=0) and (_Расход=0) and ((_НачОст+_Приход-_Расход)=0)) -- отсекаем нулевые значения ресурсов

GROUP BY _Номенклатура, Размер, _Склад WITH ROLLUP
ORDER BY НоменклатураСсылка, Размер, СкладСсылка 



вот теперь думаю как "уложить" фильтры по складам и товарам (даты то ладно сами сгенерим)

склады ещё ладно - подгенерить код запроса с подсовыванием ИД складов не проблема но вот Товар - как группы отбирать ? (3х уровневый справочник)
  
Наверх
 
IP записан
 
mrgreen
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 32
Зарегистрирован: 01. Августа 2009
Re: Группировка()
Ответ #15 - 06. Августа 2009 :: 14:29
Печать  
Потестировал на больших таблицах (по полсотни тысяч записей и более)... 70% времени уходит на поиск значения в таблице данных при выводе построчно и вцелом занимает времени  в 1,5 раз дольше чем обыкновенный запрос с группировками

ээээх

чтоб не искать по таблице меня может спасти аналог "все вошедшиеВЗапрос" по группировке "Склад"... такое можно организовать (внешними соединенинями попадёт весь справочник а мне только те которые когда-либо появлялись в итогах и движениях) ?
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Группировка()
Ответ #16 - 06. Августа 2009 :: 14:35
Печать  
это типа тот вариант, что я предалагал? там поиск данных(запрос) не построчно, а для группировки. Индексы на таблицу вешал?
  
Наверх
 
IP записан
 
mrgreen
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 32
Зарегистрирован: 01. Августа 2009
Re: Группировка()
Ответ #17 - 06. Августа 2009 :: 14:41
Печать  
да... он самый и поиск по индексу запросом сформированным из ИД Номенклатуры Размера и Склада

поиск стандартом тб.НайтиЗначение() потом позиционируемся на строку и вытягиваем оттуда данные (можно без позиционирования не суть важно там задержки минимальны)
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Группировка()
Ответ #18 - 06. Августа 2009 :: 15:08
Печать  
та ну не верю, ну вот, например, код. Код нерабочий, просто как пример
Код
Выбрать все
Перем СписокГруппировок;
Перем RS;
//=====================================
Процедура ВывестиГруппировку(Номер, спОтбор = 0)
	ИмяГруппировки = СписокГруппировок.ПолучитьЗначение(Номер);

	стрКолонки     = "";
	стрКолонкиСумм = "";

	Если ИмяГруппировки = "Склад" Тогда
		стрКолонки = стрКолонки + "Склад  $Справочник.Склады,"
	ИначеЕсли ИмяГруппировки = "ТМЦ" Тогда
		стрКолонки = стрКолонки + "ТМЦ  $Справочник.ТМЦ,"
	КонецЕсли;

	стрКолонки = стрКолонки + "
	|sum(Сумма) Сумма";


	стрУсловие = "";

	Если ТипЗначенияСтр(спОтбор) = "СписокЗначений" Тогда

		Для инд = 1 По спОтбор.РазмерСписка() Цикл

			стр = "";
			зн  = спОтбор.ПолучитьЗначение(инд,стр);

			Если зн = "" Тогда
				Продолжить;
			КонецЕсли;

			стрУсловие = стрУсловие + стр + " = '" + Метадата.ЗначениеВСтрокуБД(зн) + "' and " ;//Метадата - MetaDataWork

		КонецЦикла;

		стрУсловие = "
		|where " + Сред(стрУсловие,1,СтрДлина(стрУсловие) - 4);
	КонецЕсли;

	ТекстЗапроса = "
	|set nocount on
	|select
	|"+стрКолонки + "
	|from
	|  #tmp  
	|"+стрУсловие+"
	|group by
	| "+ИмяГруппировки+"
	|";


	Попытка
		тз = RS.ВыполнитьИнструкцию(ТекстЗапроса);
	Исключение                                  
		Сообщить(RS.ПолучитьОписаниеОшибки(),"!!!");
		Возврат;
	КонецПопытки;

	тз.ВыбратьСтроки();

	Пока тз.ПолучитьСтроку() = 1 Цикл

		текОбъект = тз.ПолучитьЗначение(тз.НомерСтроки,ИмяГруппировки);


		Если Номер = 1 Тогда
			спОтбор = СоздатьОбъект("СписокЗначений");

			спОтбор.Установить(ИмяГруппировки,текОбъект);
		Иначе
			Для инд = Номер По СписокГруппировок.РазмерСписка() Цикл
				зн = СписокГруппировок.ПолучитьЗначение(инд);

				спОтбор.Установить(зн,"");

			КонецЦикла;
		КонецЕсли;

		спОтбор.Установить(ИмяГруппировки,текОбъект);

		//здесь выводим строки в Таблицу
		ПечОбъект = текОбъект;
		ПечСумма  = тз.Сумма;
		//и т.п.

		Если Номер < СписокГруппировок.РазмерСписка() Тогда

			ВывестиГруппировку(Номер + 1,спОтбор);
		КонецЕсли;

	КонецЦикла;
КонецПроцедуры
//=====================================
Процедура Сформировать()

	СписокГруппировок = СоздатьОбъект("СписокЗначений");
	СписокГруппировок.ДобавитьЗначение("Склад");
	СписокГруппировок.ДобавитьЗначение("ТМЦ");

	RS = СоздатьОбъект("ODBCRecordSet");
	RS.УстБД1С();

	ТекстЗапроса = "
	|if object_id('tempdb..#tmp') is not null
	| drop table #tmp
	|
	|create table #tmp(Склад char(9) not null, ТМЦ char(9) not null, Сумма numeric(11,2) not null)";

	рез = RS.Выполнить(ТекстЗапроса);
	Если рез = 0 Тогда
		Сообщить(RS.ПолучитьОписаниеОшибки(););
		Возврат;
	КонецЕсли;

	ТекстЗапроса = "
	|set nocount on
	|insert into #tmp
	|select
	|  Склад,
	|  ТМЦ,
	|  sum(Сумма) Сумма
	|from
	|  <.....>
	|where
	|  <.....>
	|";

	ТекстЗапроса = "
	|create index indx_Склад on #tmp(Склад)
	|create index indx_ТМЦ on #tmp(ТМЦ)
	|create index indx_СкладТМЦ on #tmp(Склад,ТМЦ)
	|";

	рез = RS.Выполнить(ТекстЗапроса);
	Если рез = 0 Тогда
		Сообщить(RS.ПолучитьОписаниеОшибки(););
		Возврат;
	КонецЕсли;

	ВывестиГруппировку(1);

		   //тут открываем таблицу
КонецПроцедуры
 

  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Группировка()
Ответ #19 - 06. Августа 2009 :: 15:10
Печать  
зы: пропустил там Выполение запроса одно, но принцип понятенУлыбка
  
Наверх
 
IP записан
 
mrgreen
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 32
Зарегистрирован: 01. Августа 2009
Re: Группировка()
Ответ #20 - 06. Августа 2009 :: 15:17
Печать  
угу... ты получается создаешь таблицы для поиска на сервере и потом из них выдергиваешь необходимое а я на клиенте и там уже поиск средствами самой 1це Печаль

этож сколько действий надо... если ничего не придумаю  то так попробуем поступить
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Группировка()
Ответ #21 - 06. Августа 2009 :: 15:20
Печать  
mrgreen писал(а) 06. Августа 2009 :: 15:17:
угу... ты получается создаешь таблицы для поиска на сервере и потом из них выдергиваешь необходимое а я на клиенте и там уже поиск средствами самой 1це Печаль

ну так я ж об этом с самого начала и говорилУлыбка
  
Наверх
 
IP записан
 
classic
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 330
Местоположение: г. Харьков
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Группировка()
Ответ #22 - 06. Августа 2009 :: 18:39
Печать  
А я делаю так: выдергиваю с сервера одним запросом все, что нужно пользователю показать. Как правило, запрос генерируется в зависимости от натыканных пользователем галочек и прочего.

Полученную ТЗ перебираю и вношу в таблицу, формат которой точно совпадает с выводом (создаю доп. колонки для горизонтальных разворотов, заполняю данными). После чего эту таблицу сворачиваю, сортирую и при помощи класса Отчет.ИтогиПоГруппировкам вываливаю на печать. Получается быстро и наглядно, и код легкочитаемый и легко модифицируемый получается.
  
Наверх
 
IP записан
 
mrgreen
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 32
Зарегистрирован: 01. Августа 2009
Re: Группировка()
Ответ #23 - 07. Августа 2009 :: 12:21
Печать  
мдя... и таблицу креатить не быстро и разбирать на кленте полученную тоже не быстро

пока пытаюсь разобраться с олап сделал следующее

Код
Выбрать все
	Для поз=1 По спВыбСклИД.РазмерСписка() Цикл
		ТекстЗапроса = ТекстЗапроса + "
		|			SUM(CASE WHEN ((ВидД = 105) OR (ВидД = 52) OR (ВидД = 3737)) AND (_Склад='"+спВыбСклИД.ПолучитьЗначение(поз)+"') THEN _Приход ELSE 0 END) AS КвоПрих_"+спВыбСклК.ПолучитьЗначение(поз)+", -- приход (если Вид док = 'Приход' или 'ВводОстатков' или 'Перемещение')
		|			SUM(CASE WHEN ((ВидД = 443) OR (ВидД = 3737))AND (_Склад='"+спВыбСклИД.ПолучитьЗначение(поз)+"') THEN _Расход ELSE 0 END) AS КвоСпис_"+спВыбСклК.ПолучитьЗначение(поз)+", -- списание (если Вид док = 'Списание' или 'Перемещение')
		|			SUM(CASE WHEN (ВидД = 3767) AND (_Склад='"+спВыбСклИД.ПолучитьЗначение(поз)+"') THEN _Расход ELSE 0 END) AS КвоПрод_"+спВыбСклК.ПолучитьЗначение(поз)+", -- продажа (если Вид док = 'Продажа')
		|			SUM(CASE WHEN _Склад='"+спВыбСклИД.ПолучитьЗначение(поз)+"' THEN _НачОст+_Приход-_Расход ELSE 0 END) AS КвоОст_"+спВыбСклК.ПолучитьЗначение(поз)+",";
	КонецЦикла; 



т.е. расчитываю данные для по движениям/остаткам для каждого из складов фильтра в оттельные поля и затем при выводе по коду колонки их и вывожу

Код
Выбрать все
		Для поз = 1 По спВыбСклК.РазмерСписка() Цикл
			печТочка = спВыбСклК.получитьЗначение(поз);
			пПрих = тз.ПолучитьЗначение(сч,"квоПрих_"+печТочка);
			пСпис = тз.ПолучитьЗначение(сч,"квоСпис_"+печТочка);
			пПрод = тз.ПолучитьЗначение(сч,"квоПрод_"+печТочка);
			пОст  = тз.ПолучитьЗначение(сч,"квоОст_"+печТочка);
			пИтОст = тз.ПолучитьЗначение(сч,"квоОст_"+печТочка);
			Таб.ПрисоединитьСекцию("Строка|Ост");

		КонецЦикла; 



понимаю что решение больше 1це шное нежели оптимально но так работает и по результатам за 5 дней по паре десятков складов ускорение в 3 раза ны выходе и чем больше период и кол-во складов тем разница ощутимее (растет не линейно)
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать