Внимание! Тема закрыта. Добавлять сообщения в закрытую тему запрещено.
Доброго дня всем!
Есть отчет, который, надо сказать, вполне корректно работает: формирует информацию о торг.агентах в разрезе клиентов за переданный период времени. Но! ко мне обратились с просьбой ускорить его работу, т.к. время формирования в зависимости от периода доходит до 10 ч.
90% времени уходит на обработку вот этого цикла: выкладываю как есть
Терпеть не могу переделывать чужие отчеты, но писать всё заново нет времени.
Здесь много отличных профессионалов, подскажите, плиз, идеи как можно сократить время его формирования, не прибегая к глобальному переписыванию отчета.
Заранее спасибо всем ответившим.
Есть отчет, который, надо сказать, вполне корректно работает: формирует информацию о торг.агентах в разрезе клиентов за переданный период времени. Но! ко мне обратились с просьбой ускорить его работу, т.к. время формирования в зависимости от периода доходит до 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;
Таб.ПрисоединитьСекцию("Строка|День");
КонецЕсли;
КонецЦикла;
Таб.ПрисоединитьСекцию("Строка|ИтогВ");
КонецЦикла;
ПоказатьТерпеть не могу переделывать чужие отчеты, но писать всё заново нет времени.
Здесь много отличных профессионалов, подскажите, плиз, идеи как можно сократить время его формирования, не прибегая к глобальному переписыванию отчета.
Заранее спасибо всем ответившим.
По теме из базы знаний
- От стажера до эксперта: развиваем команду разработчиков
- Пара советов по поиску работы
- Мобильное приложение на 1С?
- Дорогие и дешевые способы оценки. Что, когда и зачем?
- Проектный офис без офиса. ИТ-инструменты, техники и другие секреты крупной ИТ-компании, работающей со сложными проектами и заказчиками
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(4) нам отсюда не видно, как ты его открыла для себя, + не видно макета формы и что в нём.
Видно только неэффективный механизм перебора ТЗ, выгрузку в промежуточные ТЗ, неэффективную фильтрацию этих ТЗ и сворачивание этих ТЗ..
Неудивительно, что 10 часов отчет формируется.
Видно только неэффективный механизм перебора ТЗ, выгрузку в промежуточные ТЗ, неэффективную фильтрацию этих ТЗ и сворачивание этих ТЗ..
Неудивительно, что 10 часов отчет формируется.
(15) Ёпрст, ни чего личного, но с классами я на "вы". Если сможешь объяснить как ты видишь использование этого класса для конкретного (этого) случая - супер! если нет, то копать примеры и сам класс на http://www.1cpp.ru/forum я пойду в последнюю очередь.
За идею всё равно спасибо!
За идею всё равно спасибо!
ТЗБуф у Вас создается многократно и в разных позах фильтрацией по условиям некоей общей ТЗ. Я бы попробовал сделать несколько таблиц перед началом обхода общей ТЗ отсортировав их по нужным показателям, затем просто находите позицию вхождения нужного показателя в нужную таблицу и обходите пока он не изменится. Можно еще и по дате отсортировать, тогда цикл можно начать с нужной даты и прервать когда она сменится.
Ну например так перед циклом создаем таблицу для торговых агентов
И используем ее в цикле так:
Ну например так перед циклом создаем таблицу для торговых агентов
ТЗАгенты.Загрузить(ТЗсорт);
ТЗАгенты.Свернуть("НачОтд, Менеджер, ТорговыйАгент,День","ВизКг,КолВизит,ОбзвонКг,КолОбзвон,ПланВиз,ПланОбзвон,КолПланОбзвон,КолПланВиз");
ТЗАгенты.Сортировать("ТорговыйАгент,НачОтд, Менеджер,Дата+");
И используем ее в цикле так:
Нстр = 0;
ТЗАгенты.НайтиЗначение(Аг,Нстр,"ТорговыйАгент");
Пока НСтр>0 Цикл
ТЗАгенты.ПолучитьСтрокуПоНомеру(Нстр);
Если ТЗАгенты.ТорговыйАгент<>Аг Тогда Прервать КонецЕсли;
//Нужные операции в цикле
Нстр = Нстр+1;
КонецЦикла;
Ну тогда в догонку еще одна мысль. Вы можете проиндексировать ТЗСорт самостоятельно для каждого случая еще и по дате. Тогда ускорится перебор цикла с датами. Это перед циклом:
А это в цикле:
То есть в этом случае внутренний цикл станет еще короче за счет отсутствия перебора дат не равных Д для нужного агента.
ТЗАгенты.Загрузить(ТЗСорт);
ТЗАгенты.Свернуть("НачОтд, Менеджер,ТорговыйАгент,День","ВизКг,КолВизит,ОбзвонКг,КолОбзвон,ПланВиз,ПланОбзвон,КолПланОбзвон,КолПланВиз");
ТЗАгенты.НоваяКолонка("ИндексАгДень");
ТЗАгенты.ВыбратьСтроки();
Пока ТЗАгенты.ПолучитьСтроку() = 1 Цикл
ТЗАгенты.ИндексАгДень = Строка(ТЗАгенты.ТорговыйАгент)+Формат(ТЗАгенты.День,"ДГГГГММДД");
КонецЦикла;
ТЗАгенты.Сортировать("ИндексАгДень,НачОтд, Менеджер");
А это в цикле:
Нстр = 0;
ИндексАгД = Строка(Аг)+Формат(Д,"ДГГГГММДД")
ТЗАгенты.НайтиЗначение(ИндексАгД,Нстр,"ИндексАгДень");
Пока НСтр>0 Цикл
ТЗАгенты.ПолучитьСтрокуПоНомеру(Нстр);
Если ТЗАгенты.ИндексАгДень<>ИндексАгД Тогда Прервать КонецЕсли;
//Нужные операции в цикле
Нстр = Нстр+1;
КонецЦикла;
ПоказатьТо есть в этом случае внутренний цикл станет еще короче за счет отсутствия перебора дат не равных Д для нужного агента.
Весь код читать лениво и глупо.
С первых строк видно что писал какой-то очень мутный неуч.
Наверняка ТЗ получилась выгрузкой запроса - любимое занятие невежд (либо каким-то перебором чего-то).
Чтобы ускорить работу отчета надо не костыли вставлять, а написать нормальный запрос, пусть сложный, который при обходе будет давать сразу то, что выводится в печатную форму ...
Тогда будет толк.
сократить время формирования отчета с 10 часов до 9-45 - глупая затея. Не стоит тратить на нее и 15 минут ...
С первых строк видно что писал какой-то очень мутный неуч.
Наверняка ТЗ получилась выгрузкой запроса - любимое занятие невежд (либо каким-то перебором чего-то).
Чтобы ускорить работу отчета надо не костыли вставлять, а написать нормальный запрос, пусть сложный, который при обходе будет давать сразу то, что выводится в печатную форму ...
Тогда будет толк.
сократить время формирования отчета с 10 часов до 9-45 - глупая затея. Не стоит тратить на нее и 15 минут ...
У тебя несколько раз встречается
должно немного ускорить работу замена на
и дальше по тексту...
(Это в случае если "ТЗБуф" большая таблица значений)
Пока ТЗБуф.ПолучитьСтроку()=1 Цикл
Если ТЗБуф.день=Д Тогда
должно немного ускорить работу замена на
нашлиВнужнойСтроке="";
ТЗБуф.найтиЗначение(д,нашлиВнужнойСтроке,"день");
ТЗБуф.ПолучитьСтрокуПоНомеру(нашлиВнужнойСтроке);
и дальше по тексту...
(Это в случае если "ТЗБуф" большая таблица значений)
В общем "костыли" не помогли, экономия во времени минимальная: при формировании за 01:40 стало- 01:20
Ёпрст и Кошки рулят предлагают конструктивно переписать код, чего хотелось бы избежать. Ну что на таком популярном форуме больше ни у кого ни каких идей нет!?
Ёпрст и Кошки рулят предлагают конструктивно переписать код, чего хотелось бы избежать. Ну что на таком популярном форуме больше ни у кого ни каких идей нет!?
(28)dusha0020,
так сообщила ж вроде: (24)
вариант с "костылями" )))
только всё равно его никто не будет читать...
Видимо Скользящий прав
какие теперь расклады по замеру производительности сообщить
так сообщила ж вроде: (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;
Таб.ПрисоединитьСекцию("Нач|День");
КонецЕсли;
КонецЦикла;
Таб.ПрисоединитьСекцию("Нач|ИтогВ");
КонецЕсли;
КонецЦикла;
Показатьтолько всё равно его никто не будет читать...
Видимо Скользящий прав
(29) А клиентосов когда выводишь ?
У тебя такая табличка на выходе ?
......................|День1|Действие|........|ДеньN|Действие|
агент.................|.....|........|........|.....|........|
.....менеджер.........|.....|........|........|.....|........|
.........начОтдела....|.....|........|........|.....|........|
У тебя такая табличка на выходе ?
......................|День1|Действие|........|ДеньN|Действие|
агент.................|.....|........|........|.....|........|
.....менеджер.........|.....|........|........|.....|........|
.........начОтдела....|.....|........|........|.....|........|
(29) я имел ввиду на что уходит большая часть времени по замеру. А "костыли" то правильные. Странно что всего на 20% быстродействие повысилось.
А может быть КошкиРулят прав. Нужен вообще другой алгоритм, начиная с запроса, резервы оптимизации кода уже исчерпаны, но на моей практике они исчерпываются минимум при 40-50% приросте производительности.
А может быть КошкиРулят прав. Нужен вообще другой алгоритм, начиная с запроса, резервы оптимизации кода уже исчерпаны, но на моей практике они исчерпываются минимум при 40-50% приросте производительности.
(40) Pari, (38) Ёпрст, (39) dusha0020, я модифицировала только тот кусок, который выложила, сделала замеры такого же(по смыслу) фрагмента стар.версии и новой - (24) разница во времени не значительная. Вываливать весь код не имеет смыла, т.к. цикл формирования самой тз занимает в 10 раз меньше её обработки.
Сщас поробую с TurboBL и нАглухо избавлюсь от ТЗБуф. Замеры выложу позже, может хотя бы к 50% приближусь
Сщас поробую с TurboBL и нАглухо избавлюсь от ТЗБуф. Замеры выложу позже, может хотя бы к 50% приближусь
Для sql
Как вариант можно использовать toysql Шемякина Павла. Библиотека потдерживает работу с временными объектами, соответсвенно выгрузив таблицу в sql можно к ней строить запросы.
Для dbf
1. Вся таже toysql. Если есть доступ по сети к перефериным sql серверам - можно таки опять все запросы развернуть через них.
2. У фиксина были процедуры свертки таблицы значений. Сейчас уже лениво вникать в процедуру, но если ее сразу по нормальному свернуть - будет все быстрее и легче. Завтра на досуге могу глянуть, но при существующей заполненой базе.
Как вариант можно использовать toysql Шемякина Павла. Библиотека потдерживает работу с временными объектами, соответсвенно выгрузив таблицу в sql можно к ней строить запросы.
Для dbf
1. Вся таже toysql. Если есть доступ по сети к перефериным sql серверам - можно таки опять все запросы развернуть через них.
2. У фиксина были процедуры свертки таблицы значений. Сейчас уже лениво вникать в процедуру, но если ее сразу по нормальному свернуть - будет все быстрее и легче. Завтра на досуге могу глянуть, но при существующей заполненой базе.
Загрузить 1cpp.dll и включить TurboBL
в ПриНачалеРаботыСистемы()
ЗагрузитьВнешнююКомпоненту("1cpp.dll");
УН=СоздатьОбъект("УправлениеНастройками");
УН.Включить("TurboBL");
УН.Включить("ТаблицаИсходнаяТаблица");
УН.Включить("Оптимизация");
УН.Сбросить("Проверка типов");
Количество телодвижений минимально.
Назначение TurboBL - ускорение вызова ВСЕХ методов 1с.
Ради эксперимента стОит сделать. (И написать здесь о результатах)
в ПриНачалеРаботыСистемы()
ЗагрузитьВнешнююКомпоненту("1cpp.dll");
УН=СоздатьОбъект("УправлениеНастройками");
УН.Включить("TurboBL");
УН.Включить("ТаблицаИсходнаяТаблица");
УН.Включить("Оптимизация");
УН.Сбросить("Проверка типов");
Количество телодвижений минимально.
Назначение TurboBL - ускорение вызова ВСЕХ методов 1с.
Ради эксперимента стОит сделать. (И написать здесь о результатах)
(47) По умолчанию, это и так всё уже настроено при загрузке 1cpp.
turbobl да, дает небольшой выигрыш в скорости создания объектов (но ты этого не заметишь)
+ исправляет некоторые косяки платформы, дает обращаться через контекст открытой формы к процедурам , например.
turbobl да, дает небольшой выигрыш в скорости создания объектов (но ты этого не заметишь)
+ исправляет некоторые косяки платформы, дает обращаться через контекст открытой формы к процедурам , например.
Коллеги, я нас поздравляю !!!
Кол.строк ТЗ -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
СПАСИБО ВСЕМ ЗА ДЕЛЬНЫЕ СОВЕТЫ!
Кол.строк ТЗ -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
СПАСИБО ВСЕМ ЗА ДЕЛЬНЫЕ СОВЕТЫ!
А инструкция ЗначениеВСтроку(Какой_то_Справочник) еще используется?
Эта инструкция лезет в базу за кодом.
Ее лучше заменить на что-то типа:
метаДата = СоздатьОбъект("MetaDataWork");
...
ИДОбъекта = метаДата.ЗначениеВСтрокуБД(Какой_то_Справочник);
Эта инструкция лезет в базу за кодом.
Ее лучше заменить на что-то типа:
метаДата = СоздатьОбъект("MetaDataWork");
...
ИДОбъекта = метаДата.ЗначениеВСтрокуБД(Какой_то_Справочник);
А насчет ИндексированнойТаблицы вы не правы.
На таких детских размерах таблиц индексированная таблица рулит.
Индексированная таблица становится малоэффективной на очень больших таблицах.
Не могу сказать в строках но у меня были случаи когда приходилось переходить на ТаблицуЗначений просто потому что 1с вылазила за виндовый лимит памяти для процесса :)
Минусы Индексированной таблицы в том, что жрет память безбожно и на больших таблицах начинает медленно обращаться к значениям колонок через точку.
На таких детских размерах таблиц индексированная таблица рулит.
Индексированная таблица становится малоэффективной на очень больших таблицах.
Не могу сказать в строках но у меня были случаи когда приходилось переходить на ТаблицуЗначений просто потому что 1с вылазила за виндовый лимит памяти для процесса :)
Минусы Индексированной таблицы в том, что жрет память безбожно и на больших таблицах начинает медленно обращаться к значениям колонок через точку.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот