Переключение на Главную Страницу Страницы: 1 [2]  ОтправитьПечать
Очень популярная тема (более 25 ответов) ИТЗ Суммы по группам справочников (число прочтений - 10254 )
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ИТЗ Суммы по группам справочников
Ответ #15 - 18. Ноября 2008 :: 11:09
Печать  
JohnyDeath писал(а) 18. Ноября 2008 :: 10:59:
Федор, а как ты в ДБФ в запросе добавляешь всех вышестоящих родителей?

Я это делаю не в запросе Улыбка
  
Наверх
www  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ИТЗ Суммы по группам справочников
Ответ #16 - 18. Ноября 2008 :: 11:10
Печать  
artbear писал(а) 18. Ноября 2008 :: 11:05:
fez писал(а) 18. Ноября 2008 :: 10:56:
artbear писал(а) 18. Ноября 2008 :: 10:37:
PS Федор, ты не прав.

Скажем мягче: я тоже прав.

По мне, так метод Группировать можно использовать только в самых простых случаях. Поскольку этот метод добавляет много ненужной сложности.

Скажем мягче: Улыбка немного сложности, которая во многих случаях группировки полезна !


Скажем еще мягче. Это вопрос вкуса и личных предпочений.

Я же просто хочу показать автору ветки еще один способ сделать то, что ему нужно. Выбирать он будет, естественно, сам.
  
Наверх
www  
IP записан
 
Looking
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 33
Зарегистрирован: 11. Апреля 2007
Re: ИТЗ Суммы по группам справочников
Ответ #17 - 18. Ноября 2008 :: 11:32
Печать  
Цитата:
Проверь тзПотомки без этого кода и убедись в правильности/неправильности 1С++ Улыбка


я думаю дело не в "неправильности 1С++", а в том что не так как мне надо, а причина возможно в том что я сам неправильно использую метод "Группировать"

Вот наглядный результат выполнения процедуры

Код
Выбрать все
Процедура ПоказатьИТЗПотомки(ИТЗИсточник)
ИТЗИсточник.ВыбратьСтроки();
Пока ИТЗИсточник.ПолучитьСтроку()=1 Цикл
Если ИТЗИсточник.НомерКолонки("тзПотомки")>0 Тогда
ИТЗИсточник.Показать();
Если Вопрос("Прервать?",4)=6  Тогда
    Возврат;
КонецЕсли;
ПоказатьИТЗПотомки(ИТЗИсточник.тзПотомки);
КонецЕсли;
КонецЦикла;
КонецПроцедуры	   



ИТЗ1


ИТЗ2


ИТЗ3


ИТЗ4


а мне нужно чтобы в ИТЗ2 были не группы
"Шампанское"
"Коньяк"

а значения группы первого уровня по местам хранения
"Алкоголь"-"Магазин № 8"
"Алкоголь"-"Магазин № 26"
"Алкоголь"-"Магазин № 19"
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ИТЗ Суммы по группам справочников
Ответ #18 - 18. Ноября 2008 :: 12:07
Печать  
Вот я об этом и говорю. Тебе не нужны группы ВСЕХ уровней. Тебе нужны группы только самого верхнего уровня. Как раз тот случай, где метод Группировать добавляет излишнее количество сложностей.

Добавь колонку со значением этой группы и пользуйся методом Итог().
  
Наверх
www  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ИТЗ Суммы по группам справочников
Ответ #19 - 18. Ноября 2008 :: 12:12
Печать  
fez писал(а) 18. Ноября 2008 :: 12:07:
Вот я об этом и говорю. Тебе не нужны группы ВСЕХ уровней. Тебе нужны группы только самого верхнего уровня. Как раз тот случай, где метод Группировать добавляет излишнее количество сложностей.

Добавь колонку со значением этой группы и пользуйся методом Итог().

+1

ЗЫ Но не забывай, что Группировать может использовать спец.колонки для родителей и уровня для увеличения производительности. Подробности в доке.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: ИТЗ Суммы по группам справочников
Ответ #20 - 18. Ноября 2008 :: 12:12
Печать  
Когда речь идёт о сложно структурированных данных полезно бывает взглянуть на эти данные глазами. Для этого есть такая хрень, называется РедакторТЗ. Одним махом решает кучу непоняток. Взять можно например на инфостарте.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ИТЗ Суммы по группам справочников
Ответ #21 - 18. Ноября 2008 :: 12:14
Печать  
ADirks писал(а) 18. Ноября 2008 :: 12:12:
Когда речь идёт о сложно структурированных данных полезно бывает взглянуть на эти данные глазами. Для этого есть такая хрень, называется РедакторТЗ. Одним махом решает кучу непоняток. Взять можно например на инфостарте.

+1
Ага, я также хотел предложить твой редактор.
Кстати, сколько ему лет уже ?
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Looking
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 33
Зарегистрирован: 11. Апреля 2007
Re: ИТЗ Суммы по группам справочников
Ответ #22 - 18. Ноября 2008 :: 12:40
Печать  
fez спасибо за новый для меня метод и его "разжёвывание"

artbear спасибо за разъяснения

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

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


I Love YaBB 2!

Сообщений: 33
Зарегистрирован: 11. Апреля 2007
Re: ИТЗ Суммы по группам справочников
Ответ #23 - 18. Ноября 2008 :: 12:45
Печать  
Цитата:
Тебе не нужны группы ВСЕХ уровней. Тебе нужны группы только самого верхнего уровня.


всё же мне нужны группы всех уровней, возможно я непонятно это в (0) объяснил, то есть мне нужно видеть значения показателей в группировке "Группа каждого уровня"-"Место хранения" и "Элемент"-"Место хранения". Возможно получится если поменять индексы местами
ИТЗ.Группировать("ИндМестоХранения: МестоХранения; ИндНоменклатура: &Номенклатура","КоличествоПродаж,Выручка");

если в результате добьюсь того чего хотел - отпишусь.

Мне нужно получить таблицу следующего вида

"Гр1Уровня Алкоголь"-"Маг№6" 1000
"Гр1Уровня Алкоголь"-"Маг№8" 500
"Гр1Уровня Алкоголь"-"Маг№10" 200

     "Гр2Уровня Вино"-"Маг№6" 200
     "Гр2Уровня Вино"-"Маг№8" 100
     "Гр2Уровня Вино"-"Маг№10" 300

       "элемент Вино"-"Маг№6" 5
       "элемент Вино"-"Маг№8" 3
       "элемент Вино"-"Маг№10" 6

     "Гр2Уровня Коньяк"-"Маг№6" 50
     "Гр2Уровня Коньяк"-"Маг№8" 30
     "Гр2Уровня Коньяк"-"Маг№10" 20

"Гр1Уровня Продукты"-"Маг№6" 1000
"Гр1Уровня Продукты"-"Маг№8" 500
"Гр1Уровня Продукты"-"Маг№10" 200

и т.д.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ИТЗ Суммы по группам справочников
Ответ #24 - 18. Ноября 2008 :: 13:19
Печать  
Тогда Группировать как раз то, что тебе нужно.
Он выдает как раз нужную структуру, проверено не один раз, автор, Алексей Диркс aka ADirks, кстати, для этой цели и делал подобную группировку.

Подумай, возможно, что твой код преобразовывает полученные таблицу неверно Печаль
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: ИТЗ Суммы по группам справочников
Ответ #25 - 18. Ноября 2008 :: 16:11
Печать  
artbear писал(а) 18. Ноября 2008 :: 13:19:
Тогда Группировать как раз то, что тебе нужно.
Он выдает как раз нужную структуру, проверено не один раз, автор, Алексей Диркс aka ADirks, кстати, для этой цели и делал подобную группировку.

Подумай, возможно, что твой код преобразовывает полученные таблицу неверно Печаль


Ага, только  где то ADirks  писал что лучше его не использовать  Смех
http://www.1cpp.ru/forum/YaBB.pl?num=1202201945/3
  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ИТЗ Суммы по группам справочников
Ответ #26 - 19. Ноября 2008 :: 04:30
Печать  
Если подробнее изучить предложенную ветку, видно, что нормального решения для получения итогов по всей иерархии справочника все равно нет Печаль
И ИТЗ.Группировать для этого вполне подходит.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: ИТЗ Суммы по группам справочников
Ответ #27 - 19. Ноября 2008 :: 05:24
Печать  
artbear писал(а) 19. Ноября 2008 :: 04:30:
Если подробнее изучить предложенную ветку, видно, что нормального решения для получения итогов по всей иерархии справочника все равно нет Печаль
И ИТЗ.Группировать для этого вполне подходит.

Да уж... Когда надо итоги по всей иерархии справочника, то мозг реально начинает плавиться.
Что касается скорости. Нарыл вот в закромах такой тестик
Код
Выбрать все
Процедура Скорость_Группировать()
	ИмяСправочника = "Контрагенты";
	ИТ = СоздатьОбъект("ИндексированнаяТаблица");
	РС = СоздатьОбъект("ODBCRecordSet");
	ТекстЗапроса = "
	|SELECT
	|	ID [Эл $Справочник.Номенклатура],
	|	ParentID [Эл_Родитель $Справочник.Номенклатура],
	|	2 Сумма
	|FROM
	|	$Справочник."+ИмяСправочника+"
	|WHERE IsFolder= 2
	|";
	РС.ВыполнитьИнструкцию(ТекстЗапроса, ИТ);

	КоличествоСтрок = ИТ.КоличествоСтрок();
	Старт = _GetPerformanceCounter();
	ИТ.Группировать("Эл: &Эл", "Сумма");
	Стоп = _GetPerformanceCounter();
	Сообщить(""+ КоличествоСтрок+" - "+ (Стоп-Старт));
	//РедакторТЗ(ИТ);
КонецПроцедуры

Процедура Скорость_Перебором()
	ИмяСправочника = "Контрагенты";

	РС = СоздатьОбъект("ODBCRecordSet");
	ТекстЗапроса = "
	|SELECT
	|	ID Эл,
	|	ParentID Родитель,
	|	1 Сумма
	|FROM
	|	$Справочник."+ИмяСправочника+"
	|WHERE IsFolder = 2
	|";
	итЭлементы = СоздатьОбъект("ИндексированнаяТаблица");
	РС.ВыполнитьИнструкцию(ТекстЗапроса, итЭлементы);


	КоличествоСтрок = итЭлементы.КоличествоСтрок();
	Старт = _GetPerformanceCounter();

	ТекстЗапроса = "
	|SELECT
	|	ID Группа,
	|	ParentID Родитель,
	|	0 Сумма
	|FROM
	|	$Справочник."+ИмяСправочника+"
	|WHERE IsFolder = 1
	|";
	итГруппы = СоздатьОбъект("ИндексированнаяТаблица");
	РС.ВыполнитьИнструкцию(ТекстЗапроса, итГруппы);
	итГруппы.ДобавитьИндекс("Группа", "Группа");

	итЭлементы.ВыбратьСтроки();
	Пока итЭлементы.ПолучитьСтроку() = 1 Цикл
		Сумма = итЭлементы.Сумма;
		Группа = итЭлементы.Родитель;
		Пока итГруппы.НайтиСтроку("Группа", Группа, 0, 1) > 0 Цикл
			итГруппы.Сумма = итГруппы.Сумма + Сумма;
			Группа = итГруппы.Родитель;
		КонецЦикла;
	КонецЦикла;
	Стоп = _GetPerformanceCounter();
	Сообщить(""+ КоличествоСтрок+" - "+ (Стоп-Старт));

	//РедакторТЗ(итГруппы);
КонецПроцедуры
 


Он конечно немножечко специфический, но результат уж больно показателен:
ИТ::Группировать: 8477 - 11560
вариант 2: 8477 - 373
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ИТЗ Суммы по группам справочников
Ответ #28 - 19. Ноября 2008 :: 09:43
Печать  
ADirks писал(а) 19. Ноября 2008 :: 05:24:
Что касается скорости. Нарыл вот в закромах такой тестик
Он конечно немножечко специфический, но результат уж больно показателен:
ИТ::Группировать: 8477 - 11560
вариант 2: 8477 - 373

Алексей, так вроде считаются разные суммы, или я неверно понял алгоритм?
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: ИТЗ Суммы по группам справочников
Ответ #29 - 19. Ноября 2008 :: 10:14
Печать  
О, а ещё вариантец для любознательных
Код
Выбрать все
Функция ПечатьСотрудников(Т, итСотрудники, идРуководитель, Уровень=0, МаксУровень=-1)
	ИмяИндекса = "Руководитель"+Уровень;
	Если Уровень > МаксУровень Тогда
		МаксУровень = Уровень;
		итСотрудники.ДобавитьИндекс(ИмяИндекса, "идРуководитель");
	КонецЕсли;

	стрПрефикс = ПовторитьСтроку("   ", Уровень);
	итСотрудники.УстановитьФильтр(идРуководитель, идРуководитель, ИмяИндекса);

	фЕстьПотомки = 0;

	итСотрудники.ВыбратьСтроки(ИмяИндекса);
	Пока итСотрудники.ПолучитьСтроку(ИмяИндекса) = 1 Цикл
		облСтрока_Показатель.Расшифровка(итСотрудники.расшСотрудник, 1);
		облСтрока_Показатель.Текст = стрПрефикс + итСотрудники.Сотрудник;
		облСтрока_Должность.Текст = итСотрудники.Должность;

		Т.ВывестиСекцию(секцияСтрока);
		нСтрока = Т.ВысотаТаблицы();

		_фЕстьПотомки = ПечатьСотрудников(Т, итСотрудники, итСотрудники.идСотрудник, Уровень+1, МаксУровень);

		ФорматСтроки(Т, нСтрока, Уровень, _фЕстьПотомки);
		фЕстьПотомки = 1;
	КонецЦикла;

	Возврат фЕстьПотомки;
КонецФункции
 


Иерархия строится вообще по произвольным полям
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 
ОтправитьПечать