Имя: Пароль:
1C
1C 7.7
v7: Варианты для глФильтрПоТаблицеЗначений
0 Спорт
 
23.07.11
07:41
Сделал элементарную обработку фильтрации, но на больших таблицах работает не достаточно быстро. Как ускорить?

Функция глФильтрПоТаблицеЗначений(ТаблицаЗначений, Колонка, Значение) Экспорт
   
   ТекКол = ТаблицаЗначений.ПолучитьПараметрыКолонки(Колонка);
   Если ПустоеЗначение(ТекКол) = 1 Тогда
       Возврат ТаблицаЗначений;
   КонецЕсли;
   
   тзФильтр = СоздатьОбъект("ТаблицаЗначений");
   ТаблицаЗначений.Выгрузить(тзФильтр);
   
   Всего = тзФильтр.КоличествоСтрок();
   Для Сч = 1 По Всего Цикл
       ТекНом = Всего - Сч + 1;
       ТекЗнач = тзФильтр.ПолучитьЗначение(ТекНом, ТекКол);
       
       Удовлетворяет = 0;
       Если ТипЗначенияСтр(Значение) = "СписокЗначений" Тогда
           Удовлетворяет = Значение.Принадлежит(ТекЗнач);
       Иначе
           Удовлетворяет = ?(Значение = ТекЗнач, 1, 0);
       КонецЕсли;
       
       Если Удовлетворяет = 0 Тогда
           тзФильтр.УдалитьСтроку(ТекНом);
       КонецЕсли;
       
   КонецЦикла;
   
   Возврат тзФильтр;
   
КонецФункции // глФильтрПоТаблицеЗначений


1 zak555
 
23.07.11
08:00
много в ТЗ СписокЗначений ?
2 Chum
 
23.07.11
08:01
Метод рупора чем не устроил?
3 Chum
 
23.07.11
08:06
А, дошел смысл функции. Если надо быстро, то индексированная таблица тут рулит во всех отношениях: включитьфильтр, пересечение, разность
4 МихаилМ
 
23.07.11
08:12
принадлежит() очень тормозной.


отсортировать и методом вилки.

если вызовов много отсортировать перед

если нужно сохранить порядок строк то

перед сортировкой заполнить 1..N


если тз больше 300 строк
быстрее заполнить СЗ   и загрузить в колонку.
5 skunk
 
23.07.11
08:27
6 Спорт
 
23.07.11
09:12
(1) 40 тыщ
(3) Ага гляну, пасиб.
(5) Да, с сортировкой интересно, не надо перебирать всё подряд.
7 Спорт
 
23.07.11
09:13
А может кто пользовался 1sqlite - УложитьТЗ и потом SELECT выбрать, какие впечатления?
8 Спорт
 
23.07.11
10:22
Сделал на индексированных таблицах, по замерам работает почти в 6 раз быстрее - 6110 (перебор в ТаблицеЗначений) 1231 (Фильтрация и объединение индексированных таблиц).

Функция глФильтрПоТаблицеЗначений(ТаблицаЗначений, Колонка, Значение) Экспорт
   
   ТекКол = ТаблицаЗначений.ПолучитьПараметрыКолонки(Колонка);
   Если ПустоеЗначение(ТекКол) = 1 Тогда
       Возврат ТаблицаЗначений;
   КонецЕсли;
   
   тзФильтр = СоздатьОбъект("ИндексированнаяТаблица");
   тзФильтр.Загрузить(ТаблицаЗначений);
   
   Если ТипЗначенияСтр(Значение) = "СписокЗначений" Тогда
       СписокФильтров = Значение;
   Иначе
       СписокФильтров = СоздатьОбъект("СписокЗначений");    
       СписокФильтров.ДобавитьЗначение(Значение);
   КонецЕсли;
   
   Если ТипЗначения(Колонка) = 2 Тогда
       НаименованиеКолонки = Колонка;
   Иначе
       НаименованиеКолонки = ТекКол;
   КонецЕсли;
   
   тзФильтр.ДобавитьИндекс("ФильтрОтбора", "*" + НаименованиеКолонки);
   тзРезультат = СоздатьОбъект("ИндексированнаяТаблица");
   тзИтоговая = СоздатьОбъект("ИндексированнаяТаблица");
   Для Сч = 1 По СписокФильтров.РазмерСписка() Цикл
       ТекЗнач = СписокФильтров.ПолучитьЗначение(Сч);
       тзФильтр.УстановитьФильтр(ТекЗнач, ТекЗнач, "ФильтрОтбора");
       
       Если тзИтоговая.КоличествоСтрок() = 0 Тогда
           тзФильтр.Выгрузить(тзИтоговая, "ФильтрОтбора");
       Иначе
           тзИтоговая.Объединить(тзФильтр, "ФильтрОтбора");
       КонецЕсли;
       
       тзФильтр.ВыключитьФильтр("ФильтрОтбора");
       
   КонецЦикла;
   
   тзФильтр = СоздатьОбъект("ТаблицаЗначений");
   тзИтоговая.Выгрузить(тзФильтр);
   
   Возврат тзФильтр;
   
КонецФункции // глФильтрПоТаблицеЗначений
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший