Имя: Пароль:
1C
1С v8
Как можно оптимизировать?
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) Переделал, как в КЗ, скорость значительно возрасла,
Спасибо

Я тут смотрю уже дебаты пошли)) Задача была правда совсем не про Заказы, ну да ладно))

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