Имя: Пароль:
1C
1С v8
Как ускорить перемещение строки вверх/вниз в табличной части
,
0 crisalis
 
18.09.15
15:52
Доброе время суток , подскажите пожалуйста как ускорить перемещение строки вверх/вниз в табличной части вот код Процедура КоманднаяПанельТоварыВверх(Кнопка)
Если ЭлементыФормы.Товары.ТекущаяСтрока <> Неопределено Тогда
Если ЭлементыФормы.Товары.ТекущаяСтрока.НомерСтроки <> 1 Тогда
Товары.Сдвинуть(ЭлементыФормы.Товары.ТекущаяСтрока,-1);
РасчитатьСуммуРазделителяТабЧасти();
КонецЕсли;    
КонецЕсли;
КонецПроцедуры

Процедура РасчитатьСуммуРазделителяТабЧасти(ТабЧасть = Неопределено)
    
// Виктор по запросу Марины 16092015
ТекТабЧасть = ?(ТабЧасть = Неопределено, Товары, ТабЧасть);
// Виктор по запросу Марины 16092015
    СуммаРазделитель = 0;
    КоличествоРазделитель = 0;
    СуммаНДС = 0;
    СуммаПередачи = 0;
    СуммаНДСПередачи = 0;
    СуммаВознаграждения = 0;
    СуммаНДСВознаграждения = 0;
    СтрокаРазделитель = неопределено;

// Виктор по запросу Марины 16092015
// Для Каждого СтрокаТов Из Товары Цикл
Для Каждого СтрокаТов Из ТекТабЧасть Цикл
// Виктор по запросу Марины 16092015
Если ТипЗнч(СтрокаТов.Номенклатура) = Тип("СправочникСсылка.CRM_Разделители") Тогда
Если СтрокаРазделитель <> Неопределено Тогда
СтрокаРазделитель.Сумма = СуммаРазделитель;
СтрокаРазделитель.Количество = КоличествоРазделитель;
КонецЕсли;
            
СтрокаРазделитель = СтрокаТов;
СуммаРазделитель = 0;
КоличествоРазделитель = 0;
СуммаНДС = 0;
СуммаПередачи = 0;
СуммаНДСПередачи = 0;
СуммаВознаграждения = 0;
СуммаНДСВознаграждения = 0;
Продолжить;
КонецЕсли;
        
СуммаРазделитель = СуммаРазделитель + СтрокаТов.Сумма;
КоличествоРазделитель = КоличествоРазделитель + СтрокаТов.Количество;
СуммаНДС = СуммаНДС + СтрокаТов.СуммаНДС;
СуммаПередачи = СуммаПередачи + СтрокаТов.СуммаПередачи;
СуммаНДСПередачи = СуммаНДСПередачи + СтрокаТов.СуммаНДСПередачи;
СуммаВознаграждения = СуммаВознаграждения + СтрокаТов.СуммаВознаграждения;
СуммаНДСВознаграждения = СуммаНДСВознаграждения + СтрокаТов.СуммаНДСВознаграждения;
КонецЦикла;
    
Если СтрокаРазделитель <> Неопределено Тогда
        
СтрокаРазделитель.Сумма = СуммаРазделитель;
СтрокаРазделитель.Количество = КоличествоРазделитель;
СтрокаРазделитель.СуммаНДС = СуммаНДС;
СтрокаРазделитель.СуммаПередачи = СуммаПередачи;
СтрокаРазделитель.СуммаНДСПередачи = СуммаНДСПередачи;
СтрокаРазделитель.СуммаВознаграждения = СуммаВознаграждения;
СтрокаРазделитель.СуммаНДСВознаграждения = СуммаНДСВознаграждения;
        
КонецЕсли;        
    
КонецПроцедуры



Для ТЧ Товары работает нормально , а вот для ТЧ Анализ_Товары работает но притормаживает.
1 vicof
 
18.09.15
15:58
Включить замер производительности и посмотреть, что тормозит
2 Живой Ископаемый
 
18.09.15
15:59
ты что издеваешься?
А замерить замером - вдруг это при получении данных или при выводе строки?
3 vicof
 
18.09.15
16:03
90%, что так и есть. Особенно, если посмотреть на двойные циклы.
4 Живой Ископаемый
 
18.09.15
16:04
этоужас...
5 ВедущийП
 
18.09.15
16:04
(3) Цикл нормальный, там // стоит. Но (2) прав, нечему тут тормозить, если там не 100500 строк в ТЧ.
6 crisalis
 
18.09.15
16:06
(3) там не двойной цикл , там коммент
7 Fragster
 
гуру
18.09.15
16:06
заменить

РасчитатьСуммуРазделителяТабЧасти();
на
подключитьОбработчикОжидания("РасчитатьСуммуРазделителяТабЧасти", 0.3, Истина);
8 vicof
 
18.09.15
16:07
(5)(6) Ладно-ладно, набросились...Не выделен зеленым был
9 Fragster
 
гуру
18.09.15
16:11
&НаКлиенте <-------------- ГДЕ?????
Процедура РасчитатьСуммуРазделителяТабЧасти(ТабЧасть = Неопределено)
10 crisalis
 
18.09.15
16:12
нашел где причина , замер дал свои результаты :
Процедура Анализ_ТоварыПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
// ... вот тут задержка
Для Каждого ТекКолонка Из ЭлементыФормы.Анализ_Товары.Колонки Цикл
        Если ТекКолонка = ЭлементыФормы.Анализ_Товары.Колонки.НомерСтроки или ТекКолонка = ЭлементыФормы.Анализ_Товары.Колонки.Код или ТекКолонка = ЭлементыФормы.Анализ_Товары.Колонки.Артикул или ТекКолонка = ЭлементыФормы.Анализ_Товары.Колонки.СтранаПроисхождения или ТекКолонка = ЭлементыФормы.Анализ_Товары.Колонки.Всего или ТекКолонка = ЭлементыФормы.Анализ_Товары.Колонки.ЦенаА или ТекКолонка = ЭлементыФормы.Анализ_Товары.Колонки.СуммаА  
            или ТекКолонка = ЭлементыФормы.Анализ_Товары.Колонки.Цена или ТекКолонка = ЭлементыФормы.Анализ_Товары.Колонки.Количество или ТекКолонка = ЭлементыФормы.Анализ_Товары.Колонки.Сумма или ТекКолонка = ЭлементыФормы.Анализ_Товары.Колонки.СуммаНДС или ТекКолонка = ЭлементыФормы.Анализ_Товары.Колонки.СуммаНДСПередачи или ТекКолонка = ЭлементыФормы.Анализ_Товары.Колонки.СуммаПередачи тогда
            Продолжить;
        КонецЕсли;
        попытка
            СтруктураДляОтбораПоиска.Вставить(ТекКолонка.Имя,ДанныеСтроки[ТекКолонка.Имя]);
        Исключение
            Сообщить(ТекКолонка.Имя);
        КонецПопытки
    КонецЦикла;    
// ... вот тут задержка
11 crisalis
 
18.09.15
16:12
(9) обычные формы
12 Fragster
 
гуру
18.09.15
16:12
это обычные формы, чтоли?
13 Fragster
 
гуру
18.09.15
16:13
ЭлементыФормы.Анализ_Товары.Колонки в отдельную переменную вынеси
14 Fragster
 
гуру
18.09.15
16:14
опять же, зачем при выводи строки это делать? если состав колонок меняется - то достаточно один раз при получении данных, а еще лучше - в функции, изменяющей состав колонок.
15 crisalis
 
18.09.15
16:15
(14) не я писал код , расхлебываю ...
16 Fragster
 
гуру
18.09.15
16:15
пропустил, что используются данные строки...

смысла в этом:
СтруктураДляОтбораПоиска.Вставить(ТекКолонка.Имя,ДанныеСтроки[ТекКолонка.Имя]);

вооще не вижу
17 ВедущийП
 
18.09.15
16:16
(10) Ты можешь строку где тормоза возникают выделить? Замер показывает строку и время выполнения в %%.
18 ВедущийП
 
18.09.15
16:17
(16) Судя по куску кода, пробегаются ВИДИМЫЕ строки и проверяется каждая колонка. Все в памяти, все должно моментально срабатывать если у тебя не 100500 колонок.
19 ВедущийП
 
18.09.15
16:18
(16) в структуру пихается имя колонки и ее значение, но т.к. в структуре не может быть нескольких значений под одним ключем, запоминается только последнее вхождение...
20 Fragster
 
гуру
18.09.15
16:19
(16) в том то и дело - в СтруктураДляОтбораПоиска обновляется последняя выведенная строка...
21 Fragster
 
гуру
18.09.15
16:19
(19) вот вот. и нафига?
22 Живой Ископаемый
 
18.09.15
16:19
замер покажет сколько каждая строчка выполнялась раз
23 ВедущийП
 
18.09.15
16:20
Если б я знал :) (21)
24 ВедущийП
 
18.09.15
16:20
(0) Нормальный замер сделай и скриншот куда нибудь выложи
25 crisalis
 
18.09.15
16:22
(17)
//вот тут --> 1044: 000:18% Для Каждого ТекКолонка Из ЭлементыФормы.Анализ_Товары.Колонки Цикл
//вот тут --> 1008: 030:48% Если ТекКолонка = ЭлементыФормы.Анализ_Товары.Колонки.НомерСтроки или ТекКолонка = ЭлементыФормы.Анализ_Товары.Колонки.Код или  
26 Fragster
 
гуру
18.09.15
16:30
(25) -> (13).
(21)!
27 ВедущийП
 
18.09.15
16:30
(25) Если не вдаваться в причины такой странной логики, попробуй ПриОткрытии() поместить ЭлементыФормы.Анализ_Товары.Колонки.НомерСтроки, ТекКолонка = ЭлементыФормы.Анализ_Товары.Колонки.Код и все остальные в Соответствие, и проверять вхождение текущей колонки в него.

Соотв = Новый Соответствие();
Соотв.Добавить(ЭлементыФормы.Анализ_Товары.Колонки.НомерСтроки,0);
и так все.

Потом Вместо того длинного условия:
Соотв.Получить(ТекКолонка) <> Неопределено;
28 ВедущийП
 
18.09.15
16:31
Соотв должно быть переменной модуля.
29 crisalis
 
18.09.15
16:32
Ура работает !!! Вот это помогло (13)
30 Ненавижу 1С
 
гуру
18.09.15
16:35
Виктор по запросу Марины 16092015

что у Вас, Виктор, с Мариной?
31 crisalis
 
18.09.15
16:35
чесно мужики , не использовал замер при отладке никогда.
МНЕ СТЫДНО !!! (((

СПАСИБО ВСЕМ ЧТО ВПРАВИЛИ МОЗГИ !!!
32 Fragster
 
гуру
18.09.15
16:36
(31) -> (21)
33 crisalis
 
18.09.15
16:37
(32) щя оптимизацией займусь =)))
34 Живой Ископаемый
 
18.09.15
16:38
2(31) стыдно должно быть также отттого, что ты всего лишь замаскировал дебилизм решения. Но да, он теперь не будет спотыкаться как ДЦП, а будет носиться быстро.
35 ВедущийП
 
18.09.15
16:40
(29) сделай (27), и будет еще сильно быстрее. Если осталось необходимость.
36 crisalis
 
18.09.15
16:42
(34) (15)
(35) спасибо