|
Как можно оптимизировать? | ☑ | ||
---|---|---|---|---|
0
rutony
12.09.11
✎
12:27
|
Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)
Для Каждого ТекущаяОформляемяСтрока Из ОформленияСтрок Цикл ДанныеСтроки = ТекущаяОформляемяСтрока.ДанныеСтроки; // чек Если ДанныеСтроки.Проведен = Ложь Тогда Продолжить; КонецЕсли; Договор = ДанныеСтроки.Ссылка.ДоговорКонтрагента; Если Договор.Пустая() Тогда Продолжить; КонецЕсли; Речь про строчку: Договор = ДанныеСтроки.Ссылка.ДоговорКонтрагента; Судя по замеру жрет 80% времени... Пробывал сделать Индексирование... скорость еще хуже... Пробывал вывести реквизит в ТЧ, стало 70%... |
|||
1
rutony
12.09.11
✎
12:28
|
Это форма списка у документа Реализация товаров и услуг,
задача раскрасить список |
|||
2
H A D G E H O G s
12.09.11
✎
12:29
|
||||
3
H A D G E H O G s
12.09.11
✎
12:29
|
<<Также выбор ПриПолученииДанных вызван тем, что в ней можно накопить массив элементов справочника и выполнить запрос 1 раз, вместо цикличного набора запросов для каждого элемента. >>
|
|||
4
DmitryPavlik
12.09.11
✎
12:31
|
Угу, у меня тоже был такой прикол: надо было подцепить пару левых столбцов и раскрасить строки при этом - запихал данные в доп. табличку, откуда потом брал и сравнивал - если уже выведена строка и обработана, то не трогать.
|
|||
5
rutony
12.09.11
✎
12:34
|
(2),(3) Да это понятно, но мне нужно анализировать данные из ДоговораКонтрагента
Остатки тут не причем... |
|||
6
Megas
12.09.11
✎
12:36
|
А через 1 запрос пробовал?
|
|||
7
dmpl
12.09.11
✎
12:36
|
(0) Запросом.
|
|||
8
H A D G E H O G s
12.09.11
✎
12:38
|
** facepalm
Ну перепиши запрос на "ВЫБРАТЬ | ЗаказПокупателя.Ссылка |ИЗ | Документ.ЗаказПокупателя КАК ЗаказПокупателя |ГДЕ | ЗаказПокупателя.ДоговорКонтрагента <> ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяСсылка)" |
|||
9
H A D G E H O G s
12.09.11
✎
12:39
|
(8) И ищи потом в выборке при 2 проходе в ПолученныхДанных свои заказы с заполненными договорами и расскрашивай их.
|
|||
10
MORRoz
12.09.11
✎
12:41
|
А просто "ДанныеСтроки.ДоговорКонтрагента" не работает?
И сравнить можно не Договор.Пустая() , а <> ПустойДоговор; Добавить переменную ПустойДоговор; и один раз заполнить в самом низу модуля , в безусловной части ПустойДоговор = Справочники.Договора.ПустаяСсылка(); И перенести в "при выводе строки". А если использовать "При получении данных" - тогда именно запросом надо за 1 раз получить данные и обходить уже результат запроса. |
|||
11
Megas
12.09.11
✎
12:49
|
(8) Эээ у него небось нету ссылки нормальной, надо наверное делать запрос к ТЗ.
|
|||
12
H A D G E H O G s
12.09.11
✎
12:50
|
(11)
Чем читал (0)? Договор = ДанныеСтроки.ССЫЛКА.ДоговорКонтрагента; |
|||
13
dezm00nd
12.09.11
✎
13:07
|
Можно сначала в цикле обойти ОформленияСтрок и добавить ссылки на документы в список значений и соответствие (соответствие: ссылка->оформление строки). Потом сделать запрос с необходимыми полями и условием "ГДЕ Ссылка В (&СписокЗначений)".
В цикле обойти результат выборки, по ссылке на док получая из соответствия оформление строки и делать с ним что угодно. |
|||
14
Megas
12.09.11
✎
13:09
|
(12) ЗаказПокупателя.Ссылка ... то его не сохранённый документ в котором надо обработать ТЧ.
|
|||
15
poligraf
12.09.11
✎
13:10
|
(0) в таких случаях делают кэш:)
|
|||
16
H A D G E H O G s
12.09.11
✎
13:12
|
(14) Ты чего седня куришь?
Речь идет про формуСписка скорее всего. |
|||
17
H A D G E H O G s
12.09.11
✎
13:12
|
(13) Все правильно сказал. Это реализовано в (2).
|
|||
18
Сергей Д
12.09.11
✎
13:20
|
1. Если ДанныеСтроки.Проведен = Ложь Тогда переписать: Если НЕ ДанныеСтроки.Проведен Тогда
2. ПриПолученииДанных обычно пишется в 3 блока: - формирование массива ссылок (цикл) - получение запросом нужных данных по сформирвоанному массиву ссылок - раскрашивание строк / заполнение полей по результату запроса (цикл) |
|||
19
H A D G E H O G s
12.09.11
✎
13:22
|
(18)
Если ДанныеСтроки.Проведен = Ложь Тогда переписать: Если НЕ ДанныеСтроки.Проведен Тогда Очень очень плохо. Бить плетьми. |
|||
20
H A D G E H O G s
12.09.11
✎
13:23
|
Если НЕ ДанныеСтроки.Проведен=Истина
Вот так правильно. Навсегда вбить в голову. |
|||
21
Эстет хренов
12.09.11
✎
13:36
|
(20) И что это даст? проверку на Неопределено?
|
|||
22
Jolly Roger
12.09.11
✎
13:46
|
(20) жесть...
|
|||
23
H A D G E H O G s
12.09.11
✎
13:48
|
(21) Если (а такое бывает) там будет не Булево - критической ошибки не возникнет.
Я про общие случаи. |
|||
24
Широкий
12.09.11
✎
13:54
|
(23) А что там может быть еще кроме булева?
|
|||
25
H A D G E H O G s
12.09.11
✎
13:56
|
(24) Я про общие случаи.
Просто как привычка должна быть. |
|||
26
asady
12.09.11
✎
13:57
|
Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)
СписокСсылок=Новый СписокЗначений; Для Каждого ТекущаяОформляемяСтрока Из ОформленияСтрок Цикл ДанныеСтроки = ТекущаяОформляемяСтрока.ДанныеСтроки; // чек Если ДанныеСтроки.Проведен = Ложь Тогда Продолжить; КонецЕсли; СписокСсылок.Добавить(ДанныеСтроки.Ссылка); КонецЦикла; затем запрос для получения ТЗ с двумя колонками:Ссылка и Договор теперь тупо: Для Каждого ТекущаяОформляемяСтрока Из ОформленияСтрок Цикл ДанныеСтроки = ТекущаяОформляемяСтрока.ДанныеСтроки; // чек Если ДанныеСтроки.Проведен = Ложь Тогда Продолжить; КонецЕсли; тСтрТЗ = ТЗ.Найти(ДанныеСтроки.Ссылка,"Ссылка"); Если тСтрТЗ=неопределено Тогда Продолжить; КонецЕсли; Договор = тСтрТЗ.Договор; СписокСсылок.Добавить(ДанныеСтроки.Ссылка); КонецЦикла; |
|||
27
asady
12.09.11
✎
13:58
|
(26)+ во втором цикле последняя строка лишняя.
|
|||
28
Широкий
12.09.11
✎
14:16
|
(26) Проведен тоже можно в запросе проверять
|
|||
29
Широкий
12.09.11
✎
14:17
|
И юзать массив.. зачем список значений то нужен?
|
|||
30
Леха Дум
12.09.11
✎
14:18
|
Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)
СоответствиеСтрок = Новый Соответствие; МассивЗаказов = Новый Массив; Для Каждого ТекущаяОформляемяСтрока Из ОформленияСтрок Цикл ДанныеСтроки = ТекущаяОформляемяСтрока.ДанныеСтроки; // чек СоответствиеСтрок.Вставить(ДанныеСтроки.Ссылка, ТекущаяОформляемяСтрока); МассивЗаказов.Добавить(ДанныеСтроки.Ссылка); КонецЦикла; Запрос = Новый Запрос; Запрос.УстановитьПараметр("МассивЗаказов", МассивЗаказов); Запрос.Текст = "ВЫБРАТЬ | ЗаказПокупателя.Ссылка, | ЗаказПокупателя.ДоговорКонтрагента.РеквизитДляАнализа1, | ЗаказПокупателя.ДоговорКонтрагента.РеквизитДляАнализа2 |ИЗ | Документ.ЗаказПокупателя КАК ЗаказПокупателя |ГДЕ | ЗаказПокупателя.Ссылка В (&МассивЗаказов) | ЗаказПокупателя.ДоговорКонтрагента <> ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяСсылка)"; Выборка = Запрос.ВыполнитьВыбрать(); Пока Выборка.Следующий() Цикл Оформление = СоответствиеСтрок[Выборка.Ссылка]; Если Не Оформление = Неопределено Тогда //получили офрмление и делаем что надо исходя из РеквизитДляАнализа1, РеквизитДляАнализа2 КонецЕсли; КонецЦикла; |
|||
31
Леха Дум
12.09.11
✎
14:20
|
+(30) Выборка = Запрос.ВыполнитьВыбрать();
заменить на Выборка = Запрос.Выполнить().Выбрать(); |
|||
32
Широкий
12.09.11
✎
14:21
|
(30) Замер производительности не делал? Соответствие vs ВыгрузкаВТаблицуЗначений+Поиск?
|
|||
33
Леха Дум
12.09.11
✎
14:21
|
вместо
|ГДЕ | ЗаказПокупателя.Ссылка В (&МассивЗаказов) | ЗаказПокупателя.ДоговорКонтрагента <> ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяСсылка)"; написать |ГДЕ | ЗаказПокупателя.Ссылка В (&МассивЗаказов) | И ЗаказПокупателя.Проведен | И ЗаказПокупателя.ДоговорКонтрагента <> ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяСсылка)"; |
|||
34
Леха Дум
12.09.11
✎
14:22
|
(32) не делал, но помнится соответствие в 8.0 использовали для индексирования :)
|
|||
35
Широкий
12.09.11
✎
14:23
|
(34) Это да.. но за счет индекса добавление медленнее.
|
|||
36
Леха Дум
12.09.11
✎
14:26
|
(35) пускай автор делает и выбирает лучшее :)
|
|||
37
Широкий
12.09.11
✎
14:44
|
(36) Сделал тесты.. через соответствие медленнее работает
|
|||
38
Широкий
12.09.11
✎
14:45
|
+37 Но не намного. Скорее всего из за небольшого количества строк
|
|||
39
H A D G E H O G s
12.09.11
✎
14:49
|
(37) Соответствие - если несколько раз по выборке ходить.
|
|||
40
Леха Дум
12.09.11
✎
15:01
|
(38) а считал в сумме добавление + извлечение?
|
|||
41
Широкий
12.09.11
✎
15:19
|
(40) Сделал две процедуры. Померил время выполнения.. Потом вызов процедур местами поменял
|
|||
42
Axel2009
12.09.11
✎
15:49
|
выбирать нужно 1 реквизит у документа. а вызов ссылка.договорконтрагента подтягивает все данные по этому документу, в том числе по каждой из ТЧ. а вдруг еще будет обращение?
|
|||
43
rutony
12.09.11
✎
15:54
|
(2),(3) Переделал, как в КЗ, скорость значительно возрасла,
Спасибо Я тут смотрю уже дебаты пошли)) Задача была правда совсем не про Заказы, ну да ладно)) Нужно было проверить наличие платежей, в договоре же хранится время отсрочки. Ну раскрасить, погашен, не погашен, просрочен, не просрочен. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |