Имя: Пароль:
1C
 
Фильтр на ТаблицуЗначений 2
0 АлисА
 
13.09.05
13:03
Извините, хотела в старую ветку добавить. Но почему-то не получается ((

Посидела на выходных. Подумала не много. Посмотрела различные варианты. Из предложенных не один не удовлетворял условиям задачи. Те, что выложил mszsuz в клубе
профессионалов пролетали мимо. Самым лучшим был Нефедова Сергея (опять таки, для моей задачи) но у него есть несколько но.
В принципе эти, но не существенны. Кроме одного. Все будет зависеть от количества отбираемых значений.
Если частота появления отбираемых строк меньше чем 1 из 35, то алгоритм Сергея побеждает. Если же больше чем 1 из 40, то мой начинает работать шустрее. В остальных случаях результат получается приблизительно одинаковый и им можно пренебречь.
У меня же частота строк равно 1 из 1000 если не реже. То есть из 15000-20000 элементов ТЗ нужно получить ТЗ размером не более 20-30. И тут я руль ;-Р


А вот вприципе и сам алгоритм

Функция Фильтр(Таблица, Колонка, Значение)
   ТабВрем1 = СоздатьОбъект("ТаблицаЗначений");
   ТабВрем2 = СоздатьОбъект("ТаблицаЗначений");
   Результат = СоздатьОбъект("ТаблицаЗначений");
   Таблица.Выгрузить(Результат, 1, 1);
   Результат.УдалитьСтроку(1);
   Таблица.Выгрузить(ТабВрем2);
   ПустоеЗн = ПолучитьПустоеЗначение(ТипЗначенияСтр(Значение));
   Позиция = 0;
   Пока ТабВрем2.НайтиЗначение(Значение, Позиция, Колонка) > 0 Цикл
       ТабВрем2.Выгрузить(ТабВрем1, Позиция, Позиция);
       Результат.НоваяСтрока();
       ПоследняяСтр = Результат.КоличествоСтрок();
       Результат.Заполнить(ТабВрем1, ПоследняяСтр);
       ТабВрем2.УстановитьЗначение(Позиция, Колонка, ПустоеЗн);
       Позиция = 0;
   КонецЦикла;
   Возврат Результат;
КонецФункции
1 NS
 
13.09.05
13:07
Тебе нужно оставить строки с нужным значением в данной колонке?
2 АлисА
 
13.09.05
13:10
В принципе да.
3 NS
 
13.09.05
13:16
нач="";
кон="";
ТЗ1=создатьобъект("ТаблицаЗначений");
ТЗ.Сортировать("ТвояКолонка+");
Если ТЗ.НайтиЗначение(ТвоеЗначение,нач,"ТвояКолонка")>0 Тогда
  ТЗ.Сортировать("ТвояКолонка-");
  ТЗ.НайтиЗначение(ТвоеЗначение,кон,"ТвояКолонка");
  ТЗ.Выгрузить(ТЗ1,кон,ТЗ.КоличествоСтрок()-нач+1);
  ТЗ=ТЗ1;
Иначе
 сообщить("не найдено ни одного значения");
КонецЕсли;
4 АлисА
 
13.09.05
13:21
Спасибочки. :))

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

Почему не работает служебное слово Знач(Val) в передаче параметров процедуре/функции, если тип передоваемого значения ТаблицаЗначений. То есть над строкой мы можем издеваться как хотим, а над ТЗ нет?
5 NS
 
13.09.05
13:24
(4) Занч работает только для простых типов. ТЗ непростой тип, и занимает много места. Поэтому передается только по ссылке.
И так же присваивание ТЗ=ТЗ1 - не присваивает таблицу, а присваивает ссылку.
То есть, после этого присваивания после изменения ТЗ1 - будет автоматом менятся ТЗ и наоборот.
6 АлисА
 
13.09.05
13:26
(5)Еще раз спасибочки. ;)

Приятно, когда все таки есть джентельмены. А не только...