Имя: Пароль:
1C
1С v8
удаление строк из таблицызначений
,
0 lucifer
 
02.07.12
10:59
На форме лежит таблицазначений (реквизит формы)
в нее добавляются несколько строк, например 3.
Обработчик при удалении:

строки = Элементы.ТЗ.ВыделенныеСтроки;
 Для каждого к из строки Цикл
   текданные = ТЗ[к].ключ;
       Если текданные <> ПустаяСсылка Тогда  
         Строка = ТЗ2.Добавить();
         Строка.СсылкаКлюч= текданные;
         ЭтаФорма.Модифицированность = Истина;
     КонецЕсли;  
 КонецЦикла;

т.е. мне нужно значение из удаляемых строк записывать в другую таблицу.
Проблема в следующем, если у нас на форме в ТЗ добавлено 3 строки, я сначала удаляю вторую, потом остальные две, и 1с орет что индекс находится на приделами значений, понятное дело почему, т.к. мы сначала удалили строку с индексом 1 потом идет обращение к строке с индексом 2, а ее уже нет, т.к. 1с где-то в кишках у себя перестроила индексы, однако Элементы.ТЗ.ВыделенныеСтроки все равно возвращает массив такого вида

индекс массива значение
--------------+---------
0                0  
--------------+---------
1                2
1 Maxus43
 
02.07.12
11:01
с конца удаляют в ТЗ строки, а не сначала
2 Tymoha
 
02.07.12
11:04
делай найтистроки по отбору, получишь массив строк, дальше от него и пляшешь ...
3 ZanderZ
 
02.07.12
11:04
(1) можно и с начала..
4 qeos
 
02.07.12
11:06
(3) как? двумя циклами?
5 lucifer
 
02.07.12
11:11
(2) мне нужно выделеные строки удалять
6 lucifer
 
02.07.12
11:12
(1) что значит с конца, какая разница откуда, если я обращаюсь к индексу 2, а его нет, там индексы 0 и 1
7 ale-sarin
 
02.07.12
11:12
(5) В (2) все правильно сказали.
8 Eugene_life
 
02.07.12
11:13
(5) Отбором найди выделенные строки, скопируй в другую таблицу. Если нужно - эти строки удали.
9 lucifer
 
02.07.12
11:13
(7) я массив строк и так
Элементы.ТЗ.ВыделенныеСтроки;

получаю
10 lucifer
 
02.07.12
11:14
(8) ок, покажите мне пример отбора который вытащит только выделенные строки
11 Eugene_life
 
02.07.12
11:20
строки = Элементы.ТЗ.ВыделенныеСтроки;
КолвоСтрок = строки.Количество()-1;
 Пока КолвоСтрок <= 0 Цикл
   текданные = ТЗ[КолвоСтрок].ключ;
       Если текданные <> ПустаяСсылка Тогда  
         Строка = ТЗ2.Добавить();
         Строка.СсылкаКлюч= текданные;
         ЭтаФорма.Модифицированность = Истина;
     КонецЕсли;
 КолвоСтрок = КолвоСтрок -1;
 КонецЦикла;
12 lucifer
 
02.07.12
11:27
(11) а если я хочу удалить только вторую или третью строку (одну) удалится первая
13 lucifer
 
02.07.12
11:42
tcnm tot vsckb e rjuj ybnm&
14 lucifer
 
02.07.12
11:42
ой
15 lucifer
 
02.07.12
11:45
мысли есть еще?
16 Serg_1960
 
02.07.12
11:48
Отбор. В отборе - ссылки - их и удаляй. Хоть с начала, хоть с конца - по барабану.
17 anddro
 
02.07.12
11:55
отбор это правильно, но не всегда подходит (в нем только условия на равенство)

Для Сч = 1 - ТаблицаЗначений.Количество() По 0 Цикл
   СсылкаНаСтроку = ТаблицаЗначений[-Сч];
   Если ФункцияПроверки(СсылкаНаСтроку) Тогда
       ТаблицаЗначений.Удалить(СсылкаНаСтроку);
   КонецЕсли;
КонецЦикла;
18 Eugene_life
 
02.07.12
12:08
(12) Если ты хочешь удалить одну строку - то удаляй ее по индексу
ТЗ.Удалить(ТекСтрока);
19 lucifer
 
02.07.12
12:56
(17) ФункцияПроверки() - как я проверю строку на то что она выделена (выбрана)
(18) даже если не одну а две пятую и шестую, в твоем примере удалятся 2 первые строки
20 lucifer
 
02.07.12
15:28
вот почему
Элементы.ТЗ.ВыделенныеСтроки
не меняет индексы? т.е. остаются старые, если сохранить и закрыть, и опять это же проделать. тогда все нормально
21 lucifer
 
02.07.12
15:54
нашел решение, может кому пригодится

в цикл (0) добавить
текданные = ТЗ.найтипоидентификатору(к)