Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Индекс-яТаблица.группировать() Тек-я групировка? (число прочтений - 3891 )
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Индекс-яТаблица.группировать() Тек-я групировка?
19. Апреля 2007 :: 15:44
Печать  
Какая сейчас текушая группировка?
Код
Выбрать все
Функция ОбходИТЗ( псИТЗ, псУровень = 0 )
	ЗначВозврата = 0;
	псУровень = псУровень + 1;
	вИдГруппировки = гСписГруппировок.ПолучитьЗначение(псУровень);
	псИТЗ.ВыбратьСтроки();
	Пока псИТЗ.ПолучитьСтроку() = 1 Цикл
		вЗначГруппировки = псИТЗ.Получить(,вИдГруппировки);
		ПечЗначГруппировки	= вЗначГруппировки;
		ПечВыручка	 = псИТЗ.Оборот;
		ПечЗарплата = псИТЗ.Зарплата;
		гТаб.ВывестиСекцию("Гр"+псУровень);
		Если ТипЗначенияСтр(псИТЗ.тзПотомки) = "ИндексированнаяТаблица" Тогда
		    ОбходИТЗ( псИТЗ.тзПотомки,псУровень);
		КонецЕсли;

	КонецЦикла;
	псУровень = псУровень - 1;

	Возврат ЗначВозврата;
КонецФункции // ОбходИТЗ()
 



псУровень  - не хляет, строка "вСтрокаГруппировокИТЗ" в
Код
Выбрать все
	вИТЗапроса.Группировать(вСтрокаГруппировокИТЗ,"Оборот,Зарплата"); 


динамическая. Как определить чего перебираем?
Али как по другому?
  
Наверх
IP записан
 
noprogrammer
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 465
Зарегистрирован: 16. Июня 2006
Re: Индекс-яТаблица.группировать() Тек-я групировк
Ответ #1 - 19. Апреля 2007 :: 18:00
Печать  
Процедура ВывестиСтроку(итЗапрос, НомерГруппы)
     ИмяГруппировки=ОбъектГруппировки.спГруппировки.ПолучитьЗначение(НомерГруппы);
     Элемент=итЗапрос.ПолучитьЗначение(итЗапрос.НомерСтроки, ИмяГруппировки);
     ИмяЭлемента=СокрЛП(Элемент);

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

Процедура ОбходДереваЗначений(итЗапрос, НомерГруппы)      
     итЗапрос.ВыбратьСтроки();
     Пока итЗапрос.ПолучитьСтроку()=1 Цикл
           ВывестиСтроку(итЗапрос, НомерГруппы);            
           Если ОбъектГруппировки.спГруппировки.РазмерСписка()>НомерГруппы Тогда
                 ОбходДереваЗначений(итЗапрос.тзПотомки, НомерГруппы+1);
           КонецЕсли;
     КонецЦикла;
КонецПроцедуры
//--------------------------------------------

  
Наверх
wwwICQ  
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Индекс-яТаблица.группировать() Тек-я групировк
Ответ #2 - 19. Апреля 2007 :: 18:29
Печать  
noprogrammer писал(а) 19. Апреля 2007 :: 18:00:
Процедура ВывестиСтроку(итЗапрос, НомерГруппы)
..........
     ИмяГруппировки=ОбъектГруппировки.спГруппировки.ПолучитьЗначение(НомерГруппы);
КонецПроцедуры
//--------------------------------------------

Чуток вырвано из контекста....
мало данных...
Индексированная таблица группируется по динамическому набору изменений, включая и иерархические справочники...
Вот они картину и путают.... о чем и спрашивал...
Иначе бы сработал и текст из (0).
  
Наверх
IP записан
 
noprogrammer
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 465
Зарегистрирован: 16. Июня 2006
Re: Индекс-яТаблица.группировать() Тек-я групировк
Ответ #3 - 19. Апреля 2007 :: 18:35
Печать  
trdm писал(а) 19. Апреля 2007 :: 18:29:
noprogrammer писал(а) 19. Апреля 2007 :: 18:00:
Процедура ВывестиСтроку(итЗапрос, НомерГруппы)
..........
     ИмяГруппировки=ОбъектГруппировки.спГруппировки.ПолучитьЗначение(НомерГруппы);
КонецПроцедуры
//--------------------------------------------

Чуток вырвано из контекста....
мало данных...
Индексированная таблица группируется по динамическому набору изменений, включая и иерархические справочники...
Вот они картину и путают.... о чем и спрашивал...
Иначе бы сработал и текст из (0).


спГруппировки - это список который содержит набор этих "динамически формируемых" измерений, следовательно я всегда знаю какую группировку я обхожу.
  
Наверх
wwwICQ  
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Индекс-яТаблица.группировать() Тек-я групировк
Ответ #4 - 19. Апреля 2007 :: 18:44
Печать  
Иерархические справочники используются?
Т.е. "Товар:&Товар;...."
  
Наверх
IP записан
 
noprogrammer
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 465
Зарегистрирован: 16. Июня 2006
Re: Индекс-яТаблица.группировать() Тек-я групировк
Ответ #5 - 19. Апреля 2007 :: 18:50
Печать  
trdm писал(а) 19. Апреля 2007 :: 18:44:
Иерархические справочники используются?
Т.е. "Товар:&Товар;...."


нет. так не пробовал, но попробую Подмигивание
  
Наверх
wwwICQ  
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Индекс-яТаблица.группировать() Тек-я групировк
Ответ #6 - 19. Апреля 2007 :: 19:54
Печать  
noprogrammer писал(а) 19. Апреля 2007 :: 18:50:
trdm писал(а) 19. Апреля 2007 :: 18:44:
Иерархические справочники используются?
Т.е. "Товар:&Товар;...."


нет. так не пробовал, но попробую Подмигивание

сразу говорю, что твой код равно как и мой не взлетит в этом случае.....
  
Наверх
IP записан
 
noprogrammer
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 465
Зарегистрирован: 16. Июня 2006
Re: Индекс-яТаблица.группировать() Тек-я групировк
Ответ #7 - 19. Апреля 2007 :: 20:19
Печать  
trdm писал(а) 19. Апреля 2007 :: 19:54:
noprogrammer писал(а) 19. Апреля 2007 :: 18:50:
trdm писал(а) 19. Апреля 2007 :: 18:44:
Иерархические справочники используются?
Т.е. "Товар:&Товар;...."


нет. так не пробовал, но попробую Подмигивание

сразу говорю, что твой код равно как и мой не взлетит в этом случае.....


а я все же попробовал Подмигивание

Цитата:
Процедура ВывестиСтроку(итЗапрос, НомерГруппы)
     ИмяГруппировки=ОбъектГруппировки.спГруппировки.ПолучитьЗначение(НомерГруппы);
     Элемент=итЗапрос.ПолучитьЗначение(итЗапрос.НомерСтроки, ИмяГруппировки);
     ИмяЭлемента=СокрЛП(Элемент);

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

Процедура ОбходДереваЗначений(итЗапрос, НомерГруппы)      
     итЗапрос.ВыбратьСтроки();
     Пока итЗапрос.ПолучитьСтроку()=1 Цикл
           ВывестиСтроку(итЗапрос, НомерГруппы);

           Попытка
                 Если итЗапрос.__ЭтоГруппа__=1 Тогда
                       ОбходДереваЗначений(итЗапрос.тзПотомки, НомерГруппы);
                       Возврат;
                 КонецЕсли;
           Исключение
           КонецПопытки;

           Если ОбъектГруппировки.спГруппировки.РазмерСписка()>НомерГруппы Тогда
                 ОбходДереваЗначений(итЗапрос.тзПотомки, НомерГруппы+1);                  
           КонецЕсли;
     КонецЦикла;
КонецПроцедуры
//--------------------------------------------


и ведь работает Улыбка
  
Наверх
wwwICQ  
IP записан
 
noprogrammer
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 465
Зарегистрирован: 16. Июня 2006
Re: Индекс-яТаблица.группировать() Тек-я групировк
Ответ #8 - 19. Апреля 2007 :: 20:21
Печать  
упс.. случайно КОД как ЦИТАТУ вставил, но я думаю будет понятно.
  
Наверх
wwwICQ  
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Индекс-яТаблица.группировать() Тек-я групировк
Ответ #9 - 20. Апреля 2007 :: 10:49
Печать  
noprogrammer писал(а) 19. Апреля 2007 :: 20:19:
и ведь работает Улыбка

неа (. Но это уже мои проблемы...
  
Наверх
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Индекс-яТаблица.группировать() Тек-я групировк
Ответ #10 - 20. Апреля 2007 :: 20:10
Печать  
Припарился немного я с этой Инд. таблицей...
набросал функцию, группирующую саму таблицу значений, мож кому понадобится.
Код
Выбрать все
// глГруппироватьТаблицуЗначений( псТЗ, псСЗГруппировок, псСЗРесурсов)
// 	Гроуппирует таблицу, с итогами вверху "по группам" по строкам группировок (псСЗГруппировок) и
// 	ресурсов (псСЗРесурсов).
// Возврашает сгруппированную таблицу...
// *Особенность:
//		можно включить группировку по Родитетям, если поставить символ "&" перед именем группировки.
//		Например: "&Товар,Склад,ТипЦен"
Функция глГруппироватьТаблицуЗначений( псТЗИсх, псСЗГруппировок, псСЗРесурсов) Экспорт
	Перем вСтрСвертки[2];  // 1 - группировки, 2 суммы
	вСтрСвертки[1] = ""; // группировки
	вСтрСвертки[2] = ""; // Ресурсы
	ЗначВозврата = СоздатьОбъект("ТаблицаЗначений");

	вСписГруппировокСРодителями = СоздатьОбъект("СписокЗначений");

	Если ТипЗначенияСтр(псСЗГруппировок) = "Строка" Тогда
	    вСписГруппировок = глСтрокаВСписок(псСЗГруппировок);
	ИначеЕсли ТипЗначенияСтр(псСЗГруппировок) = "СписокЗначений" Тогда
		вСписГруппировок = псСЗГруппировок;
	Иначе
		Сообщить("Неверный параметр (глГруппироватьТаблицуЗначений) ""псСЗГруппировок""","!");
		Возврат 0;
	КонецЕсли;

	СЦ = 0;
	Для СЦ = 1 По вСписГруппировок.РазмерСписка() Цикл
		// Возможно, что не нужны родители для некоторых
		вИдГруппировки = вСписГруппировок.ПолучитьЗначение(СЦ);
		Если Найти(вИдГруппировки,"&")>0 Тогда
		    вИдГруппировки = СтрЗаменить(вИдГруппировки,"&","");
			вИдГруппировки = СокрЛП(вИдГруппировки);
			вСписГруппировок.УстановитьЗначение(СЦ,вИдГруппировки);
			вСписГруппировокСРодителями.ДобавитьЗначение(вИдГруппировки);
		КонецЕсли;
	КонецЦикла;

	Если ТипЗначенияСтр(псСЗРесурсов) = "Строка" Тогда
	    вСписРесурсов = глСтрокаВСписок(псСЗРесурсов);
	ИначеЕсли ТипЗначенияСтр(псСЗРесурсов) = "СписокЗначений" Тогда
		вСписРесурсов = псСЗРесурсов;
	Иначе
		Сообщить("Неверный параметр (глГруппироватьТаблицуЗначений) ""псСЗРесурсов""","!");
		Возврат ЗначВозврата;
	КонецЕсли;

	ЗначВозврата.НоваяКолонка("__НомГр__","Число",3);
	// Создаем колонки группировок
	СЦ = 0;
	Для СЦ = 1 По вСписГруппировок.РазмерСписка() Цикл
		вИдГруппировки = вСписГруппировок.ПолучитьЗначение(СЦ);
		вТип = "";		вДлина = "";		вТочность = "";
		Попытка
			Если псТЗИсх.получитьПараметрыКолонки(вИдГруппировки,вТип, вДлина, вТочность) > 0 Тогда
			    ЗначВозврата.НоваяКолонка(вИдГруппировки,вТип, вДлина, вТочность);
				вСтрСвертки[1] = вСтрСвертки[1] + вИдГруппировки + ?(СЦ = вСписГруппировок.РазмерСписка(),"",",");
			КонецЕсли;
		Исключение
			Сообщить("Плохая колонка (глГруппироватьТаблицуЗначений): " + вИдГруппировки,"!");
			Возврат 0;
		КонецПопытки;
	КонецЦикла;
	вСтрСвертки[1] = "__НомГр__" + ?(СтрДлина(вСтрСвертки[1])>0,",","") + вСтрСвертки[1];

	// Создаем колонки ресурсов
	СЦ = 0;
	Для СЦ = 1 По вСписРесурсов.РазмерСписка() Цикл
		вИдГруппировки = вСписРесурсов.ПолучитьЗначение(СЦ);
		вТип = "";		вДлина = "";		вТочность = "";
		Попытка
			Если псТЗИсх.получитьПараметрыКолонки(вИдГруппировки,вТип, вДлина, вТочность) > 0 Тогда
			    ЗначВозврата.НоваяКолонка(вИдГруппировки,вТип, вДлина, вТочность);
				вСтрСвертки[2] = вСтрСвертки[2] + вИдГруппировки + ?(СЦ = вСписРесурсов.РазмерСписка(),"",",");
			КонецЕсли;
		Исключение
			Сообщить("Плохая колонка (глГруппироватьТаблицуЗначений): " + вИдГруппировки,"!");
			Возврат 0;
		КонецПопытки;
	КонецЦикла;

	// Кешь родителей...
	вТЗРодителей = СоздатьОбъект("ТаблицаЗначений");
	вТЗРодителей.НоваяКолонка("Элемент","Справочник");
	вТЗРодителей.НоваяКолонка("Родитель","Справочник");

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

	псТЗИсх.ВыбратьСтроки();
	Пока псТЗИсх.ПолучитьСтроку() = 1 Цикл
		Если псТЗИсх.НомерСтроки%50 = 0 Тогда
		    Состояние("Обраб: " + Прогрессор(псТЗИсх.КоличествоСтрок(),псТЗИсх.НомерСтроки));
		КонецЕсли;

		вСтекГруппировок = СоздатьОбъект("СписокЗначений");
	    СЦ = 0;
	    Для СЦ = 1 По вСписГруппировок.РазмерСписка() Цикл
		    вИдГруппировки = вСписГруппировок.ПолучитьЗначение(СЦ);
			вЗначГруппировки = псТЗИсх.ПолучитьЗначение(псТЗИсх.НомерСтроки, вИдГруппировки);
			Если ТипЗначенияСтр(вЗначГруппировки) = "Справочник" Тогда
			    Если вЗначГруппировки.ЭтоГруппа() = 1 Тогда
					Продолжить;
			    КонецЕсли;
			КонецЕсли;

			вСтекРодителей.УдалитьВсе();

			Если ТипЗначенияСтр(вЗначГруппировки) = "Справочник" Тогда

			    // поищем родителей
				вРодитель = вЗначГруппировки;
				вСтекРодителей.ДобавитьЗначение(вРодитель);
				Если вСписГруппировокСРодителями.НайтиЗначение(вИдГруппировки)>0 Тогда
					Пока вРодитель.Уровень() > 1 Цикл
						СтрПоиска2 = ""; КолПоиска2 = "";
						Если вТЗРодителей.НайтиЗначение(вРодитель,СтрПоиска2, "Элемент")<>0 Тогда
							вТЗРодителей.ПолучитьСтрокуПоНомеру(СтрПоиска2);
							вРодитель = вТЗРодителей.Родитель;
						Иначе
							вРодительСтар = вРодитель;
							вРодитель = вРодитель.Родитель;
							вТЗРодителей.НоваяСтрока();
							вТЗРодителей.Элемент = вРодительСтар;
							вТЗРодителей.Родитель = вРодитель;
						КонецЕсли;
						вСтекРодителей.ДобавитьЗначение(вРодитель);
					КонецЦикла;
				КонецЕсли;
			Иначе
				вСтекРодителей.ДобавитьЗначение(вЗначГруппировки);
			КонецЕсли;

 

  
Наверх
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Индекс-яТаблица.группировать() Тек-я групировк
Ответ #11 - 20. Апреля 2007 :: 20:11
Печать  
чуток не влезло...
Код
Выбрать все
		    СЦ_2 = 0;
		    Для СЦ_2 = 1 По вСтекРодителей.РазмерСписка() Цикл
				// обратный обход
			    вРодитель = вСтекРодителей.ПолучитьЗначение(вСтекРодителей.РазмерСписка()-СЦ_2+1);
				ЗначВозврата.НоваяСтрока();
				ЗначВозврата.__НомГр__ = СЦ;
				ь);
				СЦ_3 = 0;
				Для СЦ_3 = 1 По вСтекГруппировок.РазмерСписка() Цикл
					вИдГруппировки_Стек = "";
					вЗначГруппировки_Стек = вСтекГруппировок.ПолучитьЗначение(СЦ_3,вИдГруппировки_Стек);
					ачГруппировки_Стек);
				КонецЦикла;

				СЦ_4 = 0;
				Для СЦ_4 = 1 По вСписРесурсов.РазмерСписка() Цикл
					вИдРесурса = вСписРесурсов.ПолучитьЗначение(СЦ_4);
					ЗначВозврата.УстановитьЗначение(
					ЗначВозврата.НомерСтроки,
					вИдРесурса,
					псТЗИсх.ПолучитьЗначение(псТЗИсх.НомерСтроки, вИдРесурса)
					);
				КонецЦикла;

			КонецЦикла;
			вСтекГруппировок.ДобавитьЗначение(вЗначГруппировки,вИдГруппировки);
		КонецЦикла;
		вСтекГруппировок.УдалитьВсе();
	КонецЦикла;
    ЗначВозврата.Свернуть(вСтрСвертки[1],вСтрСвертки[2]);
	Возврат ЗначВозврата;
КонецФункции // глГруппироватьТаблицуЗначений()

 

  
Наверх
IP записан
 
noprogrammer
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 465
Зарегистрирован: 16. Июня 2006
Re: Индекс-яТаблица.группировать() Тек-я групировк
Ответ #12 - 21. Апреля 2007 :: 05:53
Печать  
а по скорости не проверял?! (просто интересно)
почему то стойкое убеждение что ИТ будет работать на порядок быстрее, но может я и ошибаюсь...
  
Наверх
wwwICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать