Коллеги, нужно ваше мнение!

Внимание! Тема закрыта. Добавлять сообщения в закрытую тему запрещено.
1. Gal_B 19.06.13 11:22 Сейчас в теме
Доброго дня всем!
Есть отчет, который, надо сказать, вполне корректно работает: формирует информацию о торг.агентах в разрезе клиентов за переданный период времени. Но! ко мне обратились с просьбой ускорить его работу, т.к. время формирования в зависимости от периода доходит до 10 ч.
90% времени уходит на обработку вот этого цикла: выкладываю как есть
Попытка
	ТЗ.ПолучитьСтрокуПоНомеру(1);
	Аг = ТЗ.ТорговыйАгент;
	Мен = ТЗ.Менеджер;
	Нач = ТЗ.НачОтд;
	Клиент = ТЗ.Клиент;
Исключение
КонецПопытки;
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку() = 1 Цикл
	Если  ТЗ.ТорговыйАгент<>Аг Тогда
		НомерСтроки=0;
		Таб.ВывестиСекцию("Агент|ШапкаВ");
		Таб.ПрисоединитьСекцию("Агент|Действие");
		ТЗБуф=СоздатьОбъект("ТаблицаЗначений");
		ТЗБуф=глТаблицаФильтроватьПоУсловию(ТЗсорт,"ТорговыйАгент","=",Аг);
		ТЗБуф.Свернуть("НачОтд, Менеджер, ТорговыйАгент,День","ВизКг,КолВизит,ОбзвонКг,КолОбзвон,ПланВиз,ПланОбзвон,КолПланОбзвон,КолПланВиз");
		ТЗБуф.Сортировать("НачОтд, Менеджер, ТорговыйАгент,День+");

		ИтПланВиз = 0;		КолИтПланВиз = 0;
		ИтПланОбзвон = 0;	КолИтПланОбзвон = 0;
		ИтВизКг = 0;		КолИтВизКг = 0;
		ИтОбзвонКг = 0;		КолИтОбзвонКг = 0;
		
		
		Для Д=Дата1 По Дата2 Цикл
			Зап=0;
			ПланВиз = 0;		КолПланВиз = 0;
			ПланОбзвон = 0;		КолПланОбзвон = 0;
			ВизКг = 0;			КолВизит = 0;
			ОбзвонКг = 0;		КолОбзвон = 0;
			
			ТЗБуф.ВыбратьСтроки();
			Пока ТЗБуф.ПолучитьСтроку()=1 Цикл
				Если ТЗБуф.день=Д Тогда
					ПланВиз = ТЗБуф.ПланВиз;
					ПланОбзвон = ТЗБуф.ПланОбзвон;
					ВизКг = ТЗБуф.ВизКг;
					ОбзвонКг = ТЗБуф.ОбзвонКг;
					
					КолПланВиз = ТЗБуф.КолПланВиз;
					КолПланОбзвон = ТЗБуф.КолПланОбзвон;
					КолВизит = ТЗБуф.КолВизит;
					КолОбзвон = ТЗБуф.КолОбзвон;
					
					Таб.ПрисоединитьСекцию("Агент|День");	
					зап=1;
					
					ИтПланВиз = ИтПланВиз+ПланВиз;
					ИтПланОбзвон = ИтПланОбзвон+ПланОбзвон;
					ИтВизКг = ИтВизКг+ВизКг;
					ИтОбзвонКг = ИтОбзвонКг+ОбзвонКг;
					
					КолИтПланВиз = КолИтПланВиз+КолПланВиз;
					КолИтПланОбзвон = КолИтПланОбзвон+КолПланОбзвон;
					КолИтВизКг = КолИтВизКг+КолВизит;
					КолИтОбзвонКг = КолИтОбзвонКг+КолОбзвон;
				КонецЕсли;
			КонецЦикла;
			Если Зап=0 Тогда
				ПланВиз = 0;
				ПланОбзвон = 0;
				ВизКг = 0;
				ОбзвонКг = 0;
				
				КолПланВиз = 0;
				КолПланОбзвон = 0;
				КолВизит = 0;
				КолОбзвон = 0;
				Таб.ПрисоединитьСекцию("Агент|День");
			КонецЕсли;
		КонецЦикла;
		Таб.ПрисоединитьСекцию("Агент|ИтогВ");
	КонецЕсли;
	
	Если  ТЗ.Менеджер<>Мен Тогда
		Таб.ВывестиСекцию("Менеджер|ШапкаВ");
		Таб.ПрисоединитьСекцию("Менеджер|Действие");
		ТЗБуф=СоздатьОбъект("ТаблицаЗначений");
		ТЗБуф=глТаблицаФильтроватьПоУсловию(ТЗсорт,"Менеджер","=",Мен);
		ТЗБуф.Свернуть("НачОтд, Менеджер,День","ВизКг,КолВизит,ОбзвонКг,КолОбзвон,ПланВиз,ПланОбзвон,КолПланОбзвон,КолПланВиз");
		ТЗБуф.Сортировать("НачОтд, Менеджер,День+");

		ИтПланВиз = 0;		КолИтПланВиз = 0;
		ИтПланОбзвон = 0;	КолИтПланОбзвон = 0;
		ИтВизКг = 0;		КолИтВизКг = 0;
		ИтОбзвонКг = 0;		КолИтОбзвонКг = 0;
		Для Д=Дата1 По Дата2 Цикл
			Зап=0;
			ПланВиз = 0;		КолПланВиз = 0;
			ПланОбзвон = 0;		КолПланОбзвон = 0;
			ВизКг = 0;			КолВизит = 0;
			ОбзвонКг = 0;		КолОбзвон = 0;
			ТЗБуф.ВыбратьСтроки();
			Пока ТЗБуф.ПолучитьСтроку()=1 Цикл
				Если ТЗБуф.день=Д Тогда
					ПланВиз = ТЗБуф.ПланВиз;
					ПланОбзвон = ТЗБуф.ПланОбзвон;
					ВизКг = ТЗБуф.ВизКг;
					ОбзвонКг = ТЗБуф.ОбзвонКг;
					
					КолПланВиз = ТЗБуф.КолПланВиз;
					КолПланОбзвон = ТЗБуф.КолПланОбзвон;
					КолВизит = ТЗБуф.КолВизит;
					КолОбзвон = ТЗБуф.КолОбзвон;
					
					Таб.ПрисоединитьСекцию("Менеджер|День");	
					зап=1;
					
					ИтПланВиз = ИтПланВиз+ПланВиз;
					ИтПланОбзвон = ИтПланОбзвон+ПланОбзвон;
					ИтВизКг = ИтВизКг+ВизКг;
					ИтОбзвонКг = ИтОбзвонКг+ОбзвонКг;
					
					КолИтПланВиз = КолИтПланВиз+КолПланВиз;
					КолИтПланОбзвон = КолИтПланОбзвон+КолПланОбзвон;
					КолИтВизКг = КолИтВизКг+КолВизит;
					КолИтОбзвонКг = КолИтОбзвонКг+КолОбзвон;
				КонецЕсли;
			КонецЦикла;
			Если Зап=0 Тогда
				ПланВиз = 0;
				ПланОбзвон = 0;
				ВизКг = 0;
				ОбзвонКг = 0;
				
				КолПланВиз = 0;
				КолПланОбзвон = 0;
				КолВизит = 0;
				КолОбзвон = 0;
				Таб.ПрисоединитьСекцию("Менеджер|День");
			КонецЕсли;
		КонецЦикла;
		Таб.ПрисоединитьСекцию("Менеджер|ИтогВ");
	КонецЕсли;
	
	Если  ТЗ.НачОтд<>Нач Тогда
		Таб.ВывестиСекцию("Нач|ШапкаВ");
		Таб.ПрисоединитьСекцию("Нач|Действие");
		ТЗБуф=СоздатьОбъект("ТаблицаЗначений");
		ТЗБуф=глТаблицаФильтроватьПоУсловию(ТЗсорт,"НачОтд","=",Нач);
		ТЗБуф.Свернуть("НачОтд,День","ВизКг,КолВизит,ОбзвонКг,КолОбзвон,ПланВиз,ПланОбзвон,КолПланОбзвон,КолПланВиз");
		ТЗБуф.Сортировать("НачОтд,День+");

		ИтПланВиз = 0;		КолИтПланВиз = 0;
		ИтПланОбзвон = 0;	КолИтПланОбзвон = 0;
		ИтВизКг = 0;		КолИтВизКг = 0;
		ИтОбзвонКг = 0;		КолИтОбзвонКг = 0;
		Для Д=Дата1 По Дата2 Цикл
			Зап=0;
			ПланВиз = 0;		КолПланВиз = 0;
			ПланОбзвон = 0;		КолПланОбзвон = 0;
			ВизКг = 0;			КолВизит = 0;
			ОбзвонКг = 0;		КолОбзвон = 0;
			ТЗБуф.ВыбратьСтроки();
			Пока ТЗБуф.ПолучитьСтроку()=1 Цикл
				Если ТЗБуф.день=Д Тогда
					ПланВиз = ТЗБуф.ПланВиз;
					ПланОбзвон = ТЗБуф.ПланОбзвон;
					ВизКг = ТЗБуф.ВизКг;
					ОбзвонКг = ТЗБуф.ОбзвонКг;
					
					КолПланВиз = ТЗБуф.КолПланВиз;
					КолПланОбзвон = ТЗБуф.КолПланОбзвон;
					КолВизит = ТЗБуф.КолВизит;
					КолОбзвон = ТЗБуф.КолОбзвон;
					
					Таб.ПрисоединитьСекцию("Нач|День");	
					зап=1;
					
					ИтПланВиз = ИтПланВиз+ПланВиз;
					ИтПланОбзвон = ИтПланОбзвон+ПланОбзвон;
					ИтВизКг = ИтВизКг+ВизКг;
					ИтОбзвонКг = ИтОбзвонКг+ОбзвонКг;
					
					КолИтПланВиз = КолИтПланВиз+КолПланВиз;
					КолИтПланОбзвон = КолИтПланОбзвон+КолПланОбзвон;
					КолИтВизКг = КолИтВизКг+КолВизит;
					КолИтОбзвонКг = КолИтОбзвонКг+КолОбзвон;
				КонецЕсли;
			КонецЦикла;
			Если Зап=0 Тогда
				ПланВиз = 0;
				ПланОбзвон = 0;
				ВизКг = 0;
				ОбзвонКг = 0;
				
				КолПланВиз = 0;
				КолПланОбзвон = 0;
				КолВизит = 0;
				КолОбзвон = 0;
				Таб.ПрисоединитьСекцию("Нач|День");
			КонецЕсли;
		КонецЦикла;
		Таб.ПрисоединитьСекцию("Нач|ИтогВ");
	КонецЕсли;
	
	Аг = ТЗ.ТорговыйАгент;
	Мен = ТЗ.Менеджер;
	Нач = ТЗ.НачОтд;
	Клиент = ТЗ.Клиент;
	
	НомерСтроки=НомерСтроки+1;
	
	ТЗБуф=СоздатьОбъект("ТаблицаЗначений");
	ТЗБуф=глТаблицаФильтроватьПоУсловию(ТЗсорт,"ПР","=",ТЗ.ПР);
	
	ТЗБуф.Свернуть("НачОтд, Менеджер, ТорговыйАгент, Клиент, ПР,День","ВизКг,КолВизит,ОбзвонКг,КолОбзвон,ПланВиз,ПланОбзвон,КолПланОбзвон,КолПланВиз");
	ТЗБуф.Сортировать("НачОтд, Менеджер, ТорговыйАгент, Клиент, ПР,День+");
	
	
	Таб.ВывестиСекцию("Строка|ШапкаВ");
	Таб.ПрисоединитьСекцию("Строка|Действие");
	ИтПланВиз = 0;		КолИтПланВиз = 0;
	ИтПланОбзвон = 0;	КолИтПланОбзвон = 0;
	ИтВизКг = 0;		КолИтВизКг = 0;
	ИтОбзвонКг = 0;		КолИтОбзвонКг = 0;
	Для Д=Дата1 По Дата2 Цикл
		Зап=0;
		ПланВиз = 0;		КолПланВиз = 0;
		ПланОбзвон = 0;		КолПланОбзвон = 0;
		ВизКг = 0;			КолВизит = 0;
		ОбзвонКг = 0;		КолОбзвон = 0;
		ТЗБуф.ВыбратьСтроки();
		Пока ТЗБуф.ПолучитьСтроку() = 1 Цикл
			Если ТЗБуф.ТорговыйАгент=Аг Тогда
				
				Если ТЗБуф.День=Д Тогда
					ПланВиз = ТЗБуф.ПланВиз;
					ПланОбзвон = ТЗБуф.ПланОбзвон;
					ВизКг = ТЗБуф.ВизКг;
					ОбзвонКг = ТЗБуф.ОбзвонКг;
					
					КолПланВиз = ТЗБуф.КолПланВиз;
					КолПланОбзвон = ТЗБуф.КолПланОбзвон;
					КолВизит = ТЗБуф.КолВизит;
					КолОбзвон = ТЗБуф.КолОбзвон;
					
					Таб.ПрисоединитьСекцию("Строка|День");	
					зап=1;
					
					ИтПланВиз = ИтПланВиз+ПланВиз;
					ИтПланОбзвон = ИтПланОбзвон+ПланОбзвон;
					ИтВизКг = ИтВизКг+ВизКг;
					ИтОбзвонКг = ИтОбзвонКг+ОбзвонКг;
					
					КолИтПланВиз = КолИтПланВиз+КолПланВиз;
					КолИтПланОбзвон = КолИтПланОбзвон+КолПланОбзвон;
					КолИтВизКг = КолИтВизКг+КолВизит;
					КолИтОбзвонКг = КолИтОбзвонКг+КолОбзвон;
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;
		Если Зап=0 Тогда
			ПланВиз = 0;
			ПланОбзвон = 0;
			ВизКг = 0;
			ОбзвонКг = 0;
			
			КолПланВиз = 0;
			КолПланОбзвон = 0;
			КолВизит = 0;
			КолОбзвон = 0;
			Таб.ПрисоединитьСекцию("Строка|День");
		КонецЕсли;
	КонецЦикла;
	Таб.ПрисоединитьСекцию("Строка|ИтогВ");
	
КонецЦикла;
Показать

Терпеть не могу переделывать чужие отчеты, но писать всё заново нет времени.
Здесь много отличных профессионалов, подскажите, плиз, идеи как можно сократить время его формирования, не прибегая к глобальному переписыванию отчета.
Заранее спасибо всем ответившим.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Ёпрст 1063 19.06.13 11:28 Сейчас в теме
Открыть для себя ИТЗ и метод группировать
4. Gal_B 19.06.13 11:34 Сейчас в теме
(2) Ёпрст, ИТЗ уже открыла и закрыла)
Хотя итз и преподносят как ускоряющую процесс обработки, но у меня с ней ка-то не сложилось - время не изменилось.
9. Ёпрст 1063 19.06.13 12:05 Сейчас в теме
(4) нам отсюда не видно, как ты его открыла для себя, + не видно макета формы и что в нём.
Видно только неэффективный механизм перебора ТЗ, выгрузку в промежуточные ТЗ, неэффективную фильтрацию этих ТЗ и сворачивание этих ТЗ..
Неудивительно, что 10 часов отчет формируется.
3. Kalam 105 19.06.13 11:34 Сейчас в теме
Запихнуть запрос в СКД, настроить , бинго!
5. Gal_B 19.06.13 11:36 Сейчас в теме
(3) Kalam, вы имеете в виду на скул перевести?
7. tolyan_ekb 105 19.06.13 11:51 Сейчас в теме
(5) Gal_B, наверно (3) имел ввиду переход на 8.х с последующей настройкой данного отчета ))
6. Kalam 105 19.06.13 11:47 Сейчас в теме
"скул" тоже хорошо, а вообще переходите на 8ку
8. Gal_B 19.06.13 11:53 Сейчас в теме
Ребят, 8-ка в далекой перспективе, так что... У кого ещё какие идеи?
10. Ёпрст 1063 19.06.13 12:07 Сейчас в теме
Да , перебирать каждый раз многократно в цикле всё ТЗ целиком.. чтоб сравнить с днём/показателем.. это тоже.. полный ПЭ.
11. Gal_B 19.06.13 12:13 Сейчас в теме
неэффективный механизм перебора ТЗ

А какой механизм ты считаешь эффективным (кроме итз)?
выгрузку в промежуточные ТЗ

Да, но как обойти (кроме итз)?
15. Ёпрст 1063 19.06.13 12:31 Сейчас в теме
(11) использовать класс Итоги по группировкам для вывода, если лень итз использовать
16. Gal_B 19.06.13 12:40 Сейчас в теме
(15) Ёпрст, ни чего личного, но с классами я на "вы". Если сможешь объяснить как ты видишь использование этого класса для конкретного (этого) случая - супер! если нет, то копать примеры и сам класс на http://www.1cpp.ru/forum я пойду в последнюю очередь.
За идею всё равно спасибо!
18. Ёпрст 1063 19.06.13 12:53 Сейчас в теме
(16) получить плоскую таблицу и поставить в измерения и ресурсы нужные показатели.
В демо-конфе есть примеры..
12. dusha0020 1107 19.06.13 12:13 Сейчас в теме
ТЗБуф у Вас создается многократно и в разных позах фильтрацией по условиям некоей общей ТЗ. Я бы попробовал сделать несколько таблиц перед началом обхода общей ТЗ отсортировав их по нужным показателям, затем просто находите позицию вхождения нужного показателя в нужную таблицу и обходите пока он не изменится. Можно еще и по дате отсортировать, тогда цикл можно начать с нужной даты и прервать когда она сменится.
Ну например так перед циклом создаем таблицу для торговых агентов
ТЗАгенты.Загрузить(ТЗсорт);
      ТЗАгенты.Свернуть("НачОтд, Менеджер, ТорговыйАгент,День","ВизКг,КолВизит,ОбзвонКг,КолОбзвон,ПланВиз,ПланОбзвон,КолПланОбзвон,КолПланВиз");
      ТЗАгенты.Сортировать("ТорговыйАгент,НачОтд, Менеджер,Дата+");

И используем ее в цикле так:
Нстр = 0;
ТЗАгенты.НайтиЗначение(Аг,Нстр,"ТорговыйАгент");
Пока НСтр>0 Цикл
ТЗАгенты.ПолучитьСтрокуПоНомеру(Нстр);
Если ТЗАгенты.ТорговыйАгент<>Аг Тогда Прервать КонецЕсли;
//Нужные операции в цикле
Нстр = Нстр+1;
КонецЦикла;
13. Gal_B 19.06.13 12:21 Сейчас в теме
(12) dusha0020, Спасибо, уже в процессе.
14. Gal_B 19.06.13 12:25 Сейчас в теме
Коллеги, продолжаем делиться идеями...)) Ценю каждое мнение!
17. dusha0020 1107 19.06.13 12:47 Сейчас в теме
Ну тогда в догонку еще одна мысль. Вы можете проиндексировать ТЗСорт самостоятельно для каждого случая еще и по дате. Тогда ускорится перебор цикла с датами. Это перед циклом:
ТЗАгенты.Загрузить(ТЗСорт);
ТЗАгенты.Свернуть("НачОтд, Менеджер,ТорговыйАгент,День","ВизКг,КолВизит,ОбзвонКг,КолОбзвон,ПланВиз,ПланОбзвон,КолПланОбзвон,КолПланВиз");
ТЗАгенты.НоваяКолонка("ИндексАгДень");
ТЗАгенты.ВыбратьСтроки();
Пока ТЗАгенты.ПолучитьСтроку() = 1 Цикл
ТЗАгенты.ИндексАгДень = Строка(ТЗАгенты.ТорговыйАгент)+Формат(ТЗАгенты.День,"ДГГГГММДД");
КонецЦикла;
ТЗАгенты.Сортировать("ИндексАгДень,НачОтд, Менеджер");

А это в цикле:
Нстр = 0;
ИндексАгД = Строка(Аг)+Формат(Д,"ДГГГГММДД")
ТЗАгенты.НайтиЗначение(ИндексАгД,Нстр,"ИндексАгДень");
Пока НСтр>0 Цикл
ТЗАгенты.ПолучитьСтрокуПоНомеру(Нстр);
Если ТЗАгенты.ИндексАгДень<>ИндексАгД Тогда Прервать КонецЕсли;
//Нужные операции в цикле
Нстр = Нстр+1;
КонецЦикла;
Показать

То есть в этом случае внутренний цикл станет еще короче за счет отсутствия перебора дат не равных Д для нужного агента.
19. Ёпрст 1063 19.06.13 12:53 Сейчас в теме
вплоть до разворота вправо для создания кросс таблицы.
20. Gal_B 19.06.13 13:18 Сейчас в теме
В демо-конфе есть примеры..

А можешь скинуть демо-конфу? а то какие у нас тут в РБ демо...
22. Кошки рулят 19.06.13 14:09 Сейчас в теме
Весь код читать лениво и глупо.
С первых строк видно что писал какой-то очень мутный неуч.
Наверняка ТЗ получилась выгрузкой запроса - любимое занятие невежд (либо каким-то перебором чего-то).
Чтобы ускорить работу отчета надо не костыли вставлять, а написать нормальный запрос, пусть сложный, который при обходе будет давать сразу то, что выводится в печатную форму ...
Тогда будет толк.
сократить время формирования отчета с 10 часов до 9-45 - глупая затея. Не стоит тратить на нее и 15 минут ...
DenisKin; Gal_B; +2 Ответить
23. volodya1122 8 19.06.13 14:42 Сейчас в теме
У тебя несколько раз встречается
         Пока ТЗБуф.ПолучитьСтроку()=1 Цикл
            Если ТЗБуф.день=Д Тогда

должно немного ускорить работу замена на
нашлиВнужнойСтроке="";
ТЗБуф.найтиЗначение(д,нашлиВнужнойСтроке,"день");
ТЗБуф.ПолучитьСтрокуПоНомеру(нашлиВнужнойСтроке);

и дальше по тексту...
(Это в случае если "ТЗБуф" большая таблица значений)
24. Gal_B 20.06.13 09:59 Сейчас в теме
В общем "костыли" не помогли, экономия во времени минимальная: при формировании за 01:40 стало- 01:20
Ёпрст и Кошки рулят предлагают конструктивно переписать код, чего хотелось бы избежать. Ну что на таком популярном форуме больше ни у кого ни каких идей нет!?
25. Ёпрст 1063 20.06.13 10:10 Сейчас в теме
(24) нам отсюда не видно, что ты переписала и как
26. Gal_B 20.06.13 10:22 Сейчас в теме
(25) Ёпрст, зато мне видны все ваши комментарии)) сщас как раз занимаюсь (18) способом, но он слишком абстрактный...
28. dusha0020 1107 20.06.13 12:42 Сейчас в теме
(24) Gal_B,
больше ни у кого ни каких идей нет!?
Ну, а вариант с "костылями" выложить и какие теперь расклады по замеру производительности сообщить не нужно? Или раз это такой популярный форум то мы здесь все телепатами должны быть?:)
29. Gal_B 20.06.13 16:29 Сейчас в теме
(28)dusha0020,
какие теперь расклады по замеру производительности сообщить

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

ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку() = 1 Цикл
	Если  ТЗ.ТорговыйАгент<>Аг Тогда
		НомерСтроки=0;
		Таб.ВывестиСекцию("Агент|ШапкаВ");
		Таб.ПрисоединитьСекцию("Агент|Действие");

		ИтПланВиз = 0;		КолИтПланВиз = 0;
		ИтПланОбзвон = 0;	КолИтПланОбзвон = 0;
		ИтВизКг = 0;		КолИтВизКг = 0;
		ИтОбзвонКг = 0;		КолИтОбзвонКг = 0;
		
		ИндексАгД="";
		Для Д=Дата1 По Дата2 Цикл
			Зап=0;
			ПланВиз = 0;		КолПланВиз = 0;
			ПланОбзвон = 0;		КолПланОбзвон = 0;
			ВизКг = 0;			КолВизит = 0;
			ОбзвонКг = 0;		КолОбзвон = 0;
			
			Нстр = 0;
			ИндексАгД = ЗначениеВСтроку(Аг)+"@"+Формат(Д,"ДГГГГММДД");
			Если ТЗАг.НайтиЗначение(ИндексАгД,Нстр,"ИндексАгДень")=1 Тогда
				
				ПланВиз = ТЗАг.ПолучитьЗначение(Нстр,"ПланВиз");
				ПланОбзвон = ТЗАг.ПолучитьЗначение(Нстр,"ПланОбзвон");
				ВизКг = ТЗАг.ПолучитьЗначение(Нстр,"ВизКг");
				ОбзвонКг = ТЗАг.ПолучитьЗначение(Нстр,"ОбзвонКг");
				
				КолПланВиз = ТЗАг.ПолучитьЗначение(Нстр,"КолПланВиз");
				КолПланОбзвон = ТЗАг.ПолучитьЗначение(Нстр,"КолПланОбзвон");
				КолВизит = ТЗАг.ПолучитьЗначение(Нстр,"КолВизит");
				КолОбзвон = ТЗАг.ПолучитьЗначение(Нстр,"КолОбзвон");
				
				Таб.ПрисоединитьСекцию("Агент|День");	
				зап=1;
				
				ИтПланВиз = ИтПланВиз+ПланВиз;
				ИтПланОбзвон = ИтПланОбзвон+ПланОбзвон;
				ИтВизКг = ИтВизКг+ВизКг;
				ИтОбзвонКг = ИтОбзвонКг+ОбзвонКг;
				
				КолИтПланВиз = КолИтПланВиз+КолПланВиз;
				КолИтПланОбзвон = КолИтПланОбзвон+КолПланОбзвон;
				КолИтВизКг = КолИтВизКг+КолВизит;
				КолИтОбзвонКг = КолИтОбзвонКг+КолОбзвон;
			КонецЕсли;
			Если Зап=0 Тогда
				ПланВиз = 0;
				ПланОбзвон = 0;
				ВизКг = 0;
				ОбзвонКг = 0;
				
				КолПланВиз = 0;
				КолПланОбзвон = 0;
				КолВизит = 0;
				КолОбзвон = 0;
				Таб.ПрисоединитьСекцию("Агент|День");
			КонецЕсли;
		КонецЦикла;
		Таб.ПрисоединитьСекцию("Агент|ИтогВ");
	КонецЕсли;
	ИндексМенД="";
	Если  ТЗ.Менеджер<>Мен Тогда
		Таб.ВывестиСекцию("Менеджер|ШапкаВ");
		Таб.ПрисоединитьСекцию("Менеджер|Действие");
		ИтПланВиз = 0;		КолИтПланВиз = 0;
		ИтПланОбзвон = 0;	КолИтПланОбзвон = 0;
		ИтВизКг = 0;		КолИтВизКг = 0;
		ИтОбзвонКг = 0;		КолИтОбзвонКг = 0;
		Для Д=Дата1 По Дата2 Цикл
			Зап=0;
			ПланВиз = 0;		КолПланВиз = 0;
			ПланОбзвон = 0;		КолПланОбзвон = 0;
			ВизКг = 0;			КолВизит = 0;
			ОбзвонКг = 0;		КолОбзвон = 0;
			Нстр = 0;
			ИндексМенД = ЗначениеВСтроку(Мен)+"@"+Формат(Д,"ДГГГГММДД");
			Если ТЗмен.НайтиЗначение(ИндексМенД,Нстр,"ИндексМенДень")=1 Тогда
				
				ПланВиз = ТЗмен.ПолучитьЗначение(Нстр,"ПланВиз");
				ПланОбзвон = ТЗмен.ПолучитьЗначение(Нстр,"ПланОбзвон");
				ВизКг = ТЗмен.ПолучитьЗначение(Нстр,"ВизКг");
				ОбзвонКг = ТЗмен.ПолучитьЗначение(Нстр,"ОбзвонКг");
				
				КолПланВиз = ТЗмен.ПолучитьЗначение(Нстр,"КолПланВиз");
				КолПланОбзвон = ТЗмен.ПолучитьЗначение(Нстр,"КолПланОбзвон");
				КолВизит = ТЗмен.ПолучитьЗначение(Нстр,"КолВизит");
				КолОбзвон = ТЗмен.ПолучитьЗначение(Нстр,"КолОбзвон");
				Таб.ПрисоединитьСекцию("Менеджер|День");	
				зап=1;
				
				ИтПланВиз = ИтПланВиз+ПланВиз;
				ИтПланОбзвон = ИтПланОбзвон+ПланОбзвон;
				ИтВизКг = ИтВизКг+ВизКг;
				ИтОбзвонКг = ИтОбзвонКг+ОбзвонКг;
				
				КолИтПланВиз = КолИтПланВиз+КолПланВиз;
				КолИтПланОбзвон = КолИтПланОбзвон+КолПланОбзвон;
				КолИтВизКг = КолИтВизКг+КолВизит;
				КолИтОбзвонКг = КолИтОбзвонКг+КолОбзвон;
			КонецЕсли;
			Если Зап=0 Тогда
				ПланВиз = 0;
				ПланОбзвон = 0;
				ВизКг = 0;
				ОбзвонКг = 0;
				
				КолПланВиз = 0;
				КолПланОбзвон = 0;
				КолВизит = 0;
				КолОбзвон = 0;
				Таб.ПрисоединитьСекцию("Менеджер|День");
			КонецЕсли;
		КонецЦикла;
		Таб.ПрисоединитьСекцию("Менеджер|ИтогВ");
	КонецЕсли;
	Если  ТЗ.НачОтд<>Нач Тогда
		Таб.ВывестиСекцию("Нач|ШапкаВ");
		Таб.ПрисоединитьСекцию("Нач|Действие");
		ИтПланВиз = 0;		КолИтПланВиз = 0;
		ИтПланОбзвон = 0;	КолИтПланОбзвон = 0;
		ИтВизКг = 0;		КолИтВизКг = 0;
		ИтОбзвонКг = 0;		КолИтОбзвонКг = 0;
		ИндексНачД="";
		Для Д=Дата1 По Дата2 Цикл
			Зап=0;
			ПланВиз = 0;		КолПланВиз = 0;
			ПланОбзвон = 0;		КолПланОбзвон = 0;
			ВизКг = 0;			КолВизит = 0;
			ОбзвонКг = 0;		КолОбзвон = 0;
			
			Нстр = 0;
			ИндексНачД = ЗначениеВСтроку(Нач)+"@"+Формат(Д,"ДГГГГММДД");
			Если ТЗнач.НайтиЗначение(ИндексНачД,Нстр,"ИндексНачДень")=1 Тогда
					
				ПланВиз = ТЗнач.ПолучитьЗначение(Нстр,"ПланВиз");
				ПланОбзвон = ТЗнач.ПолучитьЗначение(Нстр,"ПланОбзвон");
				ВизКг = ТЗнач.ПолучитьЗначение(Нстр,"ВизКг");
				ОбзвонКг = ТЗнач.ПолучитьЗначение(Нстр,"ОбзвонКг");
				
				КолПланВиз = ТЗнач.ПолучитьЗначение(Нстр,"КолПланВиз");
				КолПланОбзвон = ТЗнач.ПолучитьЗначение(Нстр,"КолПланОбзвон");
				КолВизит = ТЗнач.ПолучитьЗначение(Нстр,"КолВизит");
				КолОбзвон = ТЗнач.ПолучитьЗначение(Нстр,"КолОбзвон");
				Таб.ПрисоединитьСекцию("Нач|День");	
				зап=1;
				
				ИтПланВиз = ИтПланВиз+ПланВиз;
				ИтПланОбзвон = ИтПланОбзвон+ПланОбзвон;
				ИтВизКг = ИтВизКг+ВизКг;
				ИтОбзвонКг = ИтОбзвонКг+ОбзвонКг;
				
				КолИтПланВиз = КолИтПланВиз+КолПланВиз;
				КолИтПланОбзвон = КолИтПланОбзвон+КолПланОбзвон;
				КолИтВизКг = КолИтВизКг+КолВизит;
				КолИтОбзвонКг = КолИтОбзвонКг+КолОбзвон;
			КонецЕсли;
			Если Зап=0 Тогда
				ПланВиз = 0;
				ПланОбзвон = 0;
				ВизКг = 0;
				ОбзвонКг = 0;
				
				КолПланВиз = 0;
				КолПланОбзвон = 0;
				КолВизит = 0;
				КолОбзвон = 0;
				Таб.ПрисоединитьСекцию("Нач|День");
			КонецЕсли;
		КонецЦикла;
		Таб.ПрисоединитьСекцию("Нач|ИтогВ");
	КонецЕсли;
КонецЦикла;
Показать

только всё равно его никто не будет читать...
Видимо Скользящий прав
36. Ёпрст 1063 20.06.13 18:35 Сейчас в теме
(29) А клиентосов когда выводишь ?

У тебя такая табличка на выходе ?

......................|День1|Действие|........|ДеньN|Действие|
агент.................|.....|........|........|.....|........|
.....менеджер.........|.....|........|........|.....|........|
.........начОтдела....|.....|........|........|.....|........|
37. Pari 20.06.13 19:51 Сейчас в теме
(36) Ёпрст, а клиенты, видимо, в верхней группировке. Похоже, задача показать по каждому клиенту в отчете, как его окучивают агенты, менеджеры и нач.отдела. По дням.
Типа ЦРМ, с фиксацией истории взаимоотношений
38. Ёпрст 1063 20.06.13 20:04 Сейчас в теме
39. dusha0020 1107 20.06.13 20:27 Сейчас в теме
(29) я имел ввиду на что уходит большая часть времени по замеру. А "костыли" то правильные. Странно что всего на 20% быстродействие повысилось.
А может быть КошкиРулят прав. Нужен вообще другой алгоритм, начиная с запроса, резервы оптимизации кода уже исчерпаны, но на моей практике они исчерпываются минимум при 40-50% приросте производительности.
40. Pari 20.06.13 21:14 Сейчас в теме
(39)КошкиРулят наверняка прав. И вообще нелишне было бы задачу расписать человеческим языком. Или хотя бы картинку нарисовать как у Ёпрст'а в (36) с описанием, откуда первоначально данные беруться (до того, как они попадают в исходную для фрагмента таблицу)
44. Gal_B 21.06.13 10:25 Сейчас в теме
(40) Pari, (38) Ёпрст, (39) dusha0020, я модифицировала только тот кусок, который выложила, сделала замеры такого же(по смыслу) фрагмента стар.версии и новой - (24) разница во времени не значительная. Вываливать весь код не имеет смыла, т.к. цикл формирования самой тз занимает в 10 раз меньше её обработки.
Сщас поробую с TurboBL и нАглухо избавлюсь от ТЗБуф. Замеры выложу позже, может хотя бы к 50% приближусь
27. Скользящий 20.06.13 11:09 Сейчас в теме
Практика показывает что такие отчеты проще плюнуть и с нуля переписать самому.
CheBurator; nicotin; +2 Ответить
30. Gal_B 20.06.13 16:32 Сейчас в теме
Важно чтоб этот отчет и в sql, и в dbf работал одинаково быстро!
31. sutygin 36 20.06.13 16:57 Сейчас в теме
32. Gal_B 20.06.13 16:59 Сейчас в теме
(31), основная - dbf, переферийные - sql
33. sutygin 36 20.06.13 17:08 Сейчас в теме
Для sql

Как вариант можно использовать toysql Шемякина Павла. Библиотека потдерживает работу с временными объектами, соответсвенно выгрузив таблицу в sql можно к ней строить запросы.

Для dbf
1. Вся таже toysql. Если есть доступ по сети к перефериным sql серверам - можно таки опять все запросы развернуть через них.
2. У фиксина были процедуры свертки таблицы значений. Сейчас уже лениво вникать в процедуру, но если ее сразу по нормальному свернуть - будет все быстрее и легче. Завтра на досуге могу глянуть, но при существующей заполненой базе.
34. an_2 19 20.06.13 18:13 Сейчас в теме
Загрузить 1cpp.dll и включить TurboBL

в ПриНачалеРаботыСистемы()

ЗагрузитьВнешнююКомпоненту("1cpp.dll");
УН=СоздатьОбъект("УправлениеНастройками");
УН.Включить("TurboBL");
УН.Включить("ТаблицаИсходнаяТаблица");
УН.Включить("Оптимизация");
УН.Сбросить("Проверка типов");

Количество телодвижений минимально.
Назначение TurboBL - ускорение вызова ВСЕХ методов 1с.
Ради эксперимента стОит сделать. (И написать здесь о результатах)
35. Gal_B 20.06.13 18:15 Сейчас в теме
(34) an_2, спасибо, попробую - отпишусь
41. sutygin 36 21.06.13 08:58 Сейчас в теме
ссылку на: 1. результатирующую таблицу в mxl 2. исходную Тз в mxl в студию :)
42. Gal_B 21.06.13 09:54 Сейчас в теме
чуть отойду от темы: при ЗагрузитьВнешнююКомпоненту("1cpp.dll")=1 в меню Сервис-Параметры должна дополнительная вкладка появица (как FormEx) или нет ?
43. Ёпрст 1063 21.06.13 10:15 Сейчас в теме
(42) Нет.

Дай свой отчет целиком поглядеть
54. an_2 19 21.06.13 12:55 Сейчас в теме
(42) Gal_B,
Это было раньше.
Теперь вкладка появляется в Помощ / О программе.
45. Ёпрст 1063 21.06.13 10:28 Сейчас в теме
выложи свой отчет на поглядеть
46. Ёпрст 1063 21.06.13 10:57 Сейчас в теме
Сщас поробую с TurboBL


если че, turbobl входит в состав 1cpp, и это тебе не поможет.
47. Gal_B 21.06.13 11:04 Сейчас в теме
(46) мда?.. и зачем тогда
УН=СоздатьОбъект("УправлениеНастройками");
УН.Включить("TurboBL");
УН.Включить("ТаблицаИсходнаяТаблица");
УН.Включить("Оптимизация");
УН.Сбросить("Проверка типов");

это вообще влияет на что-нибудь?
48. Ёпрст 1063 21.06.13 11:18 Сейчас в теме
(47) По умолчанию, это и так всё уже настроено при загрузке 1cpp.
turbobl да, дает небольшой выигрыш в скорости создания объектов (но ты этого не заметишь)
+ исправляет некоторые косяки платформы, дает обращаться через контекст открытой формы к процедурам , например.
49. Ёпрст 1063 21.06.13 11:18 Сейчас в теме
И еще раз - дай отчет поглядеть
50. Gal_B 21.06.13 11:25 Сейчас в теме
Коллеги, я нас поздравляю !!!
Кол.строк ТЗ -1757
Время формирования ТЗ 00:00:04
Время формирования отчета 00:00:16
Кол.строк ТЗ -5316
Время формирования ТЗ 00:00:35
Время формирования отчета 00:02:15

в "старой" версии ещё формируются, но ранее сделанные замеры с теми же периодами были:
Кол.строк ТЗ -1757
Время формирования ТЗ 00:53:38
Время формирования отчета 01:04:57
Кол.строк ТЗ -5316
Время формирования ТЗ - не замеряла
Время формирования отчета 14:34:41


СПАСИБО ВСЕМ ЗА ДЕЛЬНЫЕ СОВЕТЫ!
52. an_2 19 21.06.13 12:17 Сейчас в теме
(50) Gal_B,
Я вижу космическое ускорение.
Очень интересно вклад TurboBL тут какой-то есть?
53. Gal_B 21.06.13 12:20 Сейчас в теме
в SQL-базе:
Кол.строк ТЗ -5237
Время формирования ТЗ 00:01:01
Время формирования отчета 00:02:11

Блин, не могу успокоеца! ))
(52) an_2, будем думать, что ДА ;)
51. Gal_B 21.06.13 11:46 Сейчас в теме
в SQL-базе:
Кол.строк ТЗ -1757
Время формирования ТЗ 00:00:07
Время формирования отчета 00:00:35

тоже вполне прилично, думала будет хуже :))
55. an_2 19 21.06.13 13:11 Сейчас в теме
А инструкция ЗначениеВСтроку(Какой_то_Справочник) еще используется?
Эта инструкция лезет в базу за кодом.
Ее лучше заменить на что-то типа:
метаДата = СоздатьОбъект("MetaDataWork");
...
ИДОбъекта = метаДата.ЗначениеВСтрокуБД(Какой_то_Справочник);
56. an_2 19 21.06.13 13:18 Сейчас в теме
Раз уж подключен 1cpp - используйте его функционал.
57. an_2 19 21.06.13 13:19 Сейчас в теме
Извиняюсь что после драки так сказать.
Вчера было некогда.
58. an_2 19 21.06.13 13:32 Сейчас в теме
А насчет ИндексированнойТаблицы вы не правы.
На таких детских размерах таблиц индексированная таблица рулит.
Индексированная таблица становится малоэффективной на очень больших таблицах.
Не могу сказать в строках но у меня были случаи когда приходилось переходить на ТаблицуЗначений просто потому что 1с вылазила за виндовый лимит памяти для процесса :)
Минусы Индексированной таблицы в том, что жрет память безбожно и на больших таблицах начинает медленно обращаться к значениям колонок через точку.
59. Gal_B 21.06.13 15:55 Сейчас в теме
(58) an_2, спасибо за инфу, учту в дальнейшем)
60. Кошки рулят 22.06.13 04:11 Сейчас в теме
Фуфло какое-то гонит ТС.
TurboBL не может дать такой прирост производительности.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот