Имя: Пароль:
1C
1C 7.7
v7: Фильтр в индексированной таблице "Итерирование после изменения индекса невозмож"
0 Zhuravlik
 
24.09.12
15:44
Добрый день. Есть таблица значений с колонкой типа "СписокЗначений", Хочу на ее основе сделать другую ТЗ, отфильтрованную по спискам в строках. Для этого использую ИндексированнуюТаблицу, но видимо что-то делаю не так, может недопонимаю, в общем вот код:
(тзХарактеристик - ТаблицаЗначений, тз_ХР_ост - ИТЗ)
   тзХарактеристик.ВыбратьСтроки();
   Пока тзХарактеристик.ПолучитьСтроку() = 1 Цикл

       Если тзХарактеристик.спОтбора.РазмерСписка() = 0 Тогда
           Продолжить;
       КонецЕсли;
       
       ИНД = тзХарактеристик.Характеристика;
       тз_ХР_ост.ДобавитьИндекс(ИНД, ИНД);
       Для сч=1 По тзХарактеристик.спОтбора.РазмерСписка() Цикл            
           зн = тзХарактеристик.спОтбора.ПолучитьЗначение(сч);
           тз_ХР_ост.УстановитьФильтр(зн, зн, ИНД, 0, 2 - тзХарактеристик.ВсеКроме);
       КонецЦикла;
       
       тз_ХР_ост.ВыбратьСтроки(ИНД);
       Пока тз_ХР_ост.ПолучитьСтроку(ИНД) = 1 Цикл
           тз_ХР_ост.УдалитьСтроку(тз_ХР_ост.НомерСтроки);
       КонецЦикла;
       
       тз_ХР_ост.ВыключитьФильтр(ИНД);
       
   КонецЦикла;
1 Zhuravlik
 
24.09.12
15:46
+ кроме того "тз_ХР_ост.УстановитьФильтр" - делаю в цикле, это я так понимаю неправильно, а можно в виде значений фильтра сам список значений указать?
2 Zhuravlik
 
24.09.12
15:48
+ Дико извиняюсь, переделал, но ошибка осталась:

   тзХарактеристик.ВыбратьСтроки();
   Пока тзХарактеристик.ПолучитьСтроку() = 1 Цикл

       Если тзХарактеристик.спОтбора.РазмерСписка() = 0 Тогда
           Продолжить;
       КонецЕсли;
       
       ИНД = тзХарактеристик.Характеристика;
       тз_ХР_ост.ДобавитьИндекс(ИНД, ИНД);

       тз_ХР_ост.УстановитьФильтр(тзХарактеристик.спОтбора, тзХарактеристик.спОтбора, ИНД, 0, 2 - тзХарактеристик.ВсеКроме);
       тз_ХР_ост.ВыбратьСтроки(ИНД);
       Пока тз_ХР_ост.ПолучитьСтроку(ИНД) = 1 Цикл
           тз_ХР_ост.УдалитьСтроку(тз_ХР_ост.НомерСтроки);
       КонецЦикла;
       
       тз_ХР_ост.ВыключитьФильтр(ИНД);
       
   КонецЦикла;
3 Zhuravlik
 
24.09.12
15:51
Решил)) тз_ХР_ост.УдалитьСтроки(ИНД);
1С++ рулит)))))
4 Zhuravlik
 
26.09.12
18:15
Извините, снова подниму вопрос. Как оказалось, при способе в (3) удаляет строки, фильтруя только по первому значению списка. А как сделать так, чтобы удалял, фильтруя по всему списку? Зачитался уже литературой, подумал может есть какой прием, до которого я все не допру никак?
Вот конечный код:


   тзХарактеристик.ВыбратьСтроки();
   Пока тзХарактеристик.ПолучитьСтроку() = 1 Цикл

       Если тзХарактеристик.спОтбора.РазмерСписка() = 0 Тогда
           Продолжить;
       КонецЕсли;
       
       ИНД = тзХарактеристик.Характеристика;
       тз_ХР_ост.ДобавитьИндекс(ИНД, ИНД);

       тз_ХР_ост.УстановитьФильтр(тзХарактеристик.спОтбора, тзХарактеристик.спОтбора, ИНД, 0, 2 - тзХарактеристик.ВсеКроме);

       тз_ХР_ост.УдалитьСтроки(ИНД);
       
       тз_ХР_ост.ВыключитьФильтр(ИНД);
       
   КонецЦикла;


КонецЦикла;
5 Mikeware
 
26.09.12
18:20
выводи табличку перед удалением, да смотри, что у тебя попадает под фильтр
6 Mikeware
 
26.09.12
18:23
а вообще, чушь какая-то...
7 Zhuravlik
 
26.09.12
18:29
(5) Ды уже час вывожу, не вкурю никак...
(6) тзХарактеристик.спОтбора - список значений
   тз_ХР_ост - таблица с остатками, с колонками характеристик авто.
   Необходимо исключить из таблицы с остатками значения по списку спОтбора, с  проверкой условия "ВсеКроме". Т.е. если ВсеКроме - 1 - удалить все значения из тз_ХР_ост, кроме тех, что есть в списке спОтбора. Иначе - просто удалить значения.
8 Mikeware
 
26.09.12
18:32
(7) если индекс у тебя по одной колонке - коего хера ты ему в фильтр список подсовываешь?
9 Zhuravlik
 
26.09.12
18:32
+(7) т.е. не значения, а строки таблицу тз_ХР_ост
10 Zhuravlik
 
26.09.12
18:33
(8) Сначала невнимательно прочитал доку, так заработало, и не стал вникать глубже. Потом глюкануло, стал разбираться, оказалось работает - но только по первому значению в списке. Теперь вот думаю как обойтись.
11 ADirks
 
27.09.12
06:35
А ты их откуда берёшь то, остатки эти? Зачем ты их с сервера на клиент тащил, чтоб удалять потом?
Массовое удаление строк в ИТ - плохая идея, ибо индексы каждый раз пересчитываются.
12 Zhuravlik
 
27.09.12
09:27
(11) Беру прямым запросом 1Sqlite, получаю мгновенно.
13 ADirks
 
27.09.12
09:39
(12) Вот, замечательно. Просто запрос перепиши так, чтобы этих лишних строк там не было. Это и проще и правильней.
14 Zhuravlik
 
27.09.12
10:11
(13) Вы не поняли, я пишу обработку для универсального подбора по регистру. При открытии я получаю остатки, потом фильтрую их из пользовательского диалога на форме, и передаю в контекст при закрытии то,что осталось. Сделать как вы говорите - это на каждый фильтр делать новый запрос? Нет, не пойдет)))
Я уже решил, использовал методы индексированной таблицы Разность() и Пересечение().
Спасибо всем за советы.
15 Mikeware
 
27.09.12
10:16
(14) не проще формировать запрос динамически?
16 Zhuravlik
 
27.09.12
11:18
(15) Я так и хотел сначала, потом понял, что опыта маловато, могу в срок не попасть. Сделал так, все равно все эти остатки получаю меньше чем за секунду.
17 Zhuravlik
 
27.09.12
11:21
+ И так даже лучше, потому что пользователь видит в диалоге остаток ресурса по измерениям.