Оптимизация кода отчета
X

Привет дорогой друг

Наш сайт существует и развиваетется за счет рекламы. Пожалуйста, отключите блокировку рекламы AdBlock или подобное, для нашего сайта. Спасибо!
Показано с 1 по 9 из 9

Комбинированный просмотр

  1. #1
    Пришел за помощью

    Регистрация
    30.03.2009
    Сообщений
    9
    Сказал(а) спасибо
    5
    Поблагодарили 0 раз(а) в 0 сообщениях

    По умолчанию Оптимизация кода отчета

    По заданию, написал отчет, подскажите где, что можно было бы оптимизировать ? ;)))) Обоснованная критика - приветствуется )))))


    Процедура КнопкаСформироватьНажатие (Кнопка)
    МассивВР = Новый Массив;

    ТаблПоСотр = Новый("ТаблицаЗначений");
    ТаблПоСотрДоп = Новый("ТаблицаЗначений");
    ТаблПоВидамРасч = Новый("ТаблицаЗначений");

    ТабДок = Новый("ТабличныйДокумент");
    Макет = ПолучитьМакет("Макет");

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | ОсновныеНачисленияРаботни ковОрганизаций.Сотрудник КАК Сотрудник,
    | ПРЕДСТАВЛЕНИЕ(ОсновныеНач� �сленияРаботниковОрганиза� �ий.Сотрудник),
    | ОсновныеНачисленияРаботни ковОрганизаций.Сотрудник.Д олжность,
    | ПРЕДСТАВЛЕНИЕ(ОсновныеНач� �сленияРаботниковОрганиза� �ий.Сотрудник.Должность),
    | ОсновныеНачисленияРаботни ковОрганизаций.ВидРасчета,
    | ПРЕДСТАВЛЕНИЕ(ОсновныеНач� �сленияРаботниковОрганиза� �ий.ВидРасчета),
    | ОсновныеНачисленияРаботни ковОрганизаций.ПериодДейс� �вияНачало,
    | ОсновныеНачисленияРаботни ковОрганизаций.ПериодДейс� �вияКонец,
    | ОсновныеНачисленияРаботни ковОрганизаций.Активность,
    | ОсновныеНачисленияРаботни ковОрганизаций.Показатель1 ,
    | ОсновныеНачисленияРаботни ковОрганизаций.Сотрудник.К од
    |ИЗ
    | РегистрРасчета.ОсновныеНа� �исленияРаботниковОрганиз� �ций КАК ОсновныеНачисленияРаботни ковОрганизаций
    |ГДЕ
    | ОсновныеНачисленияРаботни ковОрганизаций.ПериодДейс� �вияНачало = &ДН
    | И ОсновныеНачисленияРаботни ковОрганизаций.ПериодДейс� �вияКонец = &ДК
    |
    |УПОРЯДОЧИТЬ ПО
    | Сотрудник
    |ИТОГИ ПО
    | Сотрудник";

    Запрос.УстановитьПараметр( "ДН",НачПериода);
    Запрос.УстановитьПараметр( "ДК",КонПериода);

    Результат = Запрос.Выполнить();

    ТаблПоСотр = Результат.Выгрузить();
    ТаблПоВидамРасч = Результат.Выгрузить();
    ТаблПоСотрДоп = Результат.Выгрузить();

    КолонкаСвертки = ТаблПоВидамРасч.Колонки.Ви дРасчета.Имя;
    КолонкаСверткиДоп = ТаблПоВидамРасч.Колонки.Со трудник.Имя;
    ТаблПоВидамРасч.Свернуть(К олонкаСвертки);
    ТаблПоСотрДоп.Свернуть(Кол онкаСверткиДоп);
    СтрокаСотрДляСорт = КолонкаСверткиДоп + " Возр";
    ТаблПоСотрДоп.Сортировать( СтрокаСотрДляСорт);

    ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("Под� �апкаГор|ПодШапкаВерт");
    ТабДок.Вывести(ОбластьШапк аТаблицы);
    Для Каждого Стр Из ТаблПоВидамРасч Цикл
    ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("Под� �апкаГор|ПодШапкаВертВР");
    Если НЕ Стр.ВидРасчета = NULL Тогда
    ОбластьШапкаТаблицы.Парам� �тры.ВидРасч = Стр.ВидРасчета;
    ТабДок.Присоединить(Област ьШапкаТаблицы);
    МассивВР.Добавить(Стр.ВидР� �счета);
    КонецЕсли;
    КонецЦикла;
    СотрДляПровер = "";
    Для Каждого СтрСотр Из ТаблПоСотрДоп Цикл
    Если СотрДляПровер <> СтрСотр.Сотрудник Тогда
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | РаботникиОрганизацийСрезП оследних.Сотрудник,
    | ПРЕДСТАВЛЕНИЕ(РаботникиОр� �анизацийСрезПоследних.Сот рудник),
    | РаботникиОрганизацийСрезП оследних.ПодразделениеОрг� �низации,
    | ПРЕДСТАВЛЕНИЕ(РаботникиОр� �анизацийСрезПоследних.Под разделениеОрганизации),
    | РаботникиОрганизацийСрезП оследних.Должность
    |ИЗ
    | РегистрСведений.Работники� �рганизаций.СрезПоследних КАК РаботникиОрганизацийСрезП оследних
    |ГДЕ
    | РаботникиОрганизацийСрезП оследних.Сотрудник = &Сотрудник";
    Запрос.УстановитьПараметр( "Сотрудник", СтрСотр.Сотрудник);

    Результат = Запрос.Выполнить();
    ВыборкаДетальныеЗаписи = Результат.Выбрать();
    ОбластьТаблица = Макет.ПолучитьОбласть("Стр� �каГор|ПодШапкаВерт");
    Пока ВыборкаДетальныеЗаписи.Сл� �дующий() Цикл
    ОбластьТаблица.Параметры.Д олж = ВыборкаДетальныеЗаписи.До� �жность;
    ОбластьТаблица.Параметры.П одр = ВыборкаДетальныеЗаписи.По� �разделениеОрганизации;
    КонецЦикла;
    СотрДляПровер = СтрСотр.Сотрудник;
    ОбластьТаблица.Параметры.С отр = СтрСотр.Сотрудник;
    ТабДок.Вывести(ОбластьТабл ица);
    КонецЕсли;
    Для Каждого Поиск Из МассивВР Цикл
    ОбластьТаблица = Макет.ПолучитьОбласть("Стр� �каГор|ПодШапкаВертВР");
    Отбор = Новый Структура();
    Отбор.Вставить("Сотрудник",� �трСотр.Сотрудник);
    Отбор.Вставить("ВидРасчета" ,Поиск);
    Итого = ТаблПоСотр.НайтиСтроки(Отб ор);
    Если Итого.Количество() > 0 Тогда
    ОбластьТаблица.Параметры.В Р = Итого[0].Показатель1;
    Иначе
    ОбластьТаблица.Параметры.В Р = 0;
    КонецЕсли;
    ТабДок.Присоединить(Област ьТаблица);
    КонецЦикла;
    КонецЦикла;
    ТабДок.Показать();
    КонецПроцедуры
    Процедура ВыбПериодНажатие(Элемент)
    НастройкаПериода = Новый НастройкаПериода;
    НастройкаПериода.Редактир� �ватьКакИнтервал = Истина;
    НастройкаПериода.Редактир� �ватьКакПериод = Истина;
    НастройкаПериода.ВариантН� �стройки = ВариантНастройкиПериода.П� �риод;
    НастройкаПериода.Установи� �ьПериод(НачПериода, ?(КонПериода='0001-01-01', КонПериода, КонецДня(КонПериода)));
    Если НастройкаПериода.Редактир� �вать() Тогда
    НачПериода = НастройкаПериода.Получить� �атуНачала();
    КонПериода = НастройкаПериода.Получить� �атуОкончания();
    КонецЕсли;
    КонецПроцедуры

  2. #2
    Гость форума

    Регистрация
    28.04.2009
    Сообщений
    1
    Сказал(а) спасибо
    3
    Поблагодарили 0 раз(а) в 0 сообщениях

    По умолчанию

    Сложновато читать неформатированный код. Но самое первое, что бросается в глаза - это запрос в цикле. Считается очень грубой ошибкой.

  3. #3
    Пришел за помощью

    Регистрация
    15.12.2010
    Сообщений
    29
    Сказал(а) спасибо
    1
    Поблагодарили 1 раз в 1 сообщении

    По умолчанию

    Написано очень коряво, такое надо не править и оптимизировать, а писать заново.

    Грубые ошибки и неточности:
    1) Запрос в цикле это неправильно, некрасиво и медленно, есть неточности и ошибки

    2) Параметры к запросу к основным начислениям заданы таким образом, что мы можем получить данные только за конкретный месяц и то, если будем пользоваться кнопкой (...) для выбора периода, данные за произвольный период мы не получим в принципе. Надо было написать что-то Вроде:
    ГДЕ ПериодДействия МЕЖДУ НАЧАЛОПЕРИОДА(День,&ДН) и КОНЕЦПЕРИОДА(День,&ДК), т.к. часто дата в 8.2 это Дата и время а не просто дата

    3) Отчет формируется за период, а срез последних без параметра даты, стало быть выведутся самые последние значения, если сейчас май, а данные смотрели, скажем, за январь, то данные по должностям будут неправильные.

    4) Условие на виртуальные таблицы типа СрезПоследних нужно задавать в параметрах таблицы, а не в секции ГДЕ.

    5) за каким-то чертом три раза выгружаются данные из первого запроса, да еще и сворачиваются и сортируются, а кроме того не используется индекс, я так подозреваю это попытка сгруппировать данные по видам рассчетов и по сотрудникам.

    6) Циклы, Циклы внутри циклов. Новый("ТаблицаЗначений"), столетняя привычка к 77, это надо искоренять, 8.2 может и быстрее и лучше и проще. И запросы ускоряют, а не замедляют работу.

    7) Такой отчет делается одним запросом с группировкой по итогам. А еще лучше и правильнее делать такие простые отчеты в СКД, тогда будет возможность в режиме Предприятие вносить изменения в группировки отчета. Если нет возможности использовать СКД(бывает и такое, но редко), надо готовить отчет к тому, что он может быть конвертирован в управляемое приложение. Для этого в модуле отчета должна быть экспортная функция, в которую передается структура с параметрами, которая возвращает результат отчета в виде готового табличного документа.

    8) ТабДок.Показать(), это довольно аляпистое решение, должна быть таблица на форме, куда будет выгружаться результат отчета, т.о. форма отчета и результат будут в одном окне, это вызовет меньше непоняток у пользователей.

  4. #4
    Пришел за помощью

    Регистрация
    30.03.2009
    Сообщений
    9
    Сказал(а) спасибо
    5
    Поблагодарили 0 раз(а) в 0 сообщениях

    По умолчанию

    Добрый день.
    А по 3,4 пунктам, можно пример в коде ?:)

  5. #5
    Пришел за помощью

    Регистрация
    15.12.2010
    Сообщений
    29
    Сказал(а) спасибо
    1
    Поблагодарили 1 раз в 1 сообщении

    По умолчанию

    Типа того. кнопка работает для многих подобных таблиц, не только регистра сведений
    Регистры1.jpg

  6. #6
    Пришел за помощью

    Регистрация
    30.03.2009
    Сообщений
    9
    Сказал(а) спасибо
    5
    Поблагодарили 0 раз(а) в 0 сообщениях

    По умолчанию

    Если честно, вообще ничего на приложенном скрине - не видно(

  7. #7
    Пришел за помощью

    Регистрация
    15.12.2010
    Сообщений
    29
    Сказал(а) спасибо
    1
    Поблагодарили 1 раз в 1 сообщении

    По умолчанию

    Цитата Сообщение от datalist Посмотреть сообщение
    Если честно, вообще ничего на приложенном скрине - не видно(
    опишу словами тогда. сделаем новый запрос к регистру работники организаций срез последних конструктором.

    1) в конструкторе в окне "База данных" найдем РаботникиОрганизаций.Срез� �оследних, развернем, выберем поля Сотрудник, Должность, ПодразделениеОрганизации
    2) в окне "Таблица", сверху ищем кнопку "Параметры виртуальной таблицы", на которой нарисована таблица и шестеренка. в поле период тупо пишем дату(скажем КОНЕЦПЕРИОДА(День,&КонПери� �да)) в условиях всё пишем примерно так же как в секции ГДЕ
    для условий в виртуальных таблицах рекомендую пользовать именно конструктор и эту волшебную кнопку

  8. #8
    Пришел за помощью

    Регистрация
    30.03.2009
    Сообщений
    9
    Сказал(а) спасибо
    5
    Поблагодарили 0 раз(а) в 0 сообщениях

    По умолчанию

    Спасибо, сейчас попробую, если что ваш мозг еще можно будет поэксплуатировать ?;)

  9. #9
    Пришел за помощью

    Регистрация
    15.12.2010
    Сообщений
    29
    Сказал(а) спасибо
    1
    Поблагодарили 1 раз в 1 сообщении

    По умолчанию

    Цитата Сообщение от datalist Посмотреть сообщение
    Спасибо, сейчас попробую, если что ваш мозг еще можно будет поэксплуатировать ?;)
    Советую найти две книги "Простые примеры разработки" и "Разработка Сложных отчетов СКД", так же советую изучить статьи для новичков на дисках ИТС.
    А потом, милости просим за вопросами))

Похожие темы

  1. Ответов: 0
    Последнее сообщение: 21.12.2010, 01:10

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •