|
v7: Удаление строк из Таблицы значений | ☑ | ||
---|---|---|---|---|
0
yliya_1C
14.07.16
✎
08:45
|
Доброе утро!
Ребята, подскажите, пожалуйста, туплю чего-то Хочу удалить строки из таблицы значений. Пишу: тз.ВыбратьСтроки(); Пока тз.ПолучитьСтроку()=1 Цикл тз.УдалитьСтроку(); КонецЦикла; Удаляет каждую вторую строку, начиная с первой. т.е. половину таблицы. А как удалить все строки? |
|||
1
Провинциальный 1сник
14.07.16
✎
08:46
|
Ты не поверишь.
УдалитьСтроки() |
|||
2
aka AMIGO
14.07.16
✎
08:47
|
(0) ТвояТЗ.УдалитьСтроки();
|
|||
3
aka AMIGO
14.07.16
✎
08:49
|
Для ы = -ТвояТЗ.КоличествоСтрок() по -1 Цикл
ТвояТЗ.УдалитьСтроку(-ы); КонецЦикла; (1) :) |
|||
4
yliya_1C
14.07.16
✎
08:53
|
А если мне нужно написать внутри цикла условие для удаления определенных строк? И при этом условие выполняется для последовательных строк
тз.ВыбратьСтроки(); Пока тз.ПолучитьСтроку()=1 Цикл Если тз.Значение = 1 Тогда тз.УдалитьСтроку(); КонецЕсли; КонецЦикла; Значение = 1 у 1, 2 и 3 -ей строки. Таки способом удаляться 1 и 3-ья строка. А 2-ая останется. |
|||
5
aka AMIGO
14.07.16
✎
08:56
|
(4) Правильно. Т.к. после удаления строки нумерация сбивается
|
|||
6
aka AMIGO
14.07.16
✎
08:57
|
+5 выход - в (3)
|
|||
7
yliya_1C
14.07.16
✎
08:57
|
(5) Поняла, что сбивается. Спрашиваю как можно сделать?
|
|||
8
VladZ
14.07.16
✎
08:57
|
(0) Ну давай рассмотрим, что делает программа:
тз.ВыбратьСтроки(); - говорим программе, что нужно организовать выборку строк в ТЗ Пока тз.ПолучитьСтроку()=1 Цикл - увеличиваем счетчик строк, устанавливая следущую строку в качестве текущей. И делаеть это нужно до тех пор, пока есть из чего выбирать. тз.УдалитьСтроку(); - удалить строку из ТЗ. При этом ТЕКУЩЕЙ СТРОКОЙ СТАНОВИТСЯ СЛЕДУЩАЯ СТРОКА!!!! Т.е. после тз.УдалитьСтроку() текущей строкой становится следующая. А потом программаа нам еще делает ПолучитьСтроку() - т.е. еще раз "сдвигает" текущую строку. |
|||
9
aka AMIGO
14.07.16
✎
08:58
|
(7) я тебе ответил "как" - в (6)
|
|||
10
VladZ
14.07.16
✎
08:58
|
Выход: либо удалять с конца, либо контролировать текущую строку самому.
|
|||
11
Остап Сулейманович
14.07.16
✎
08:59
|
(4) Коротко так :
поз = ТЗ.КоличествоСтрок(); Пока поз > 0 Цикл ТЗ.ПолучитьСтрокуПоНомеру(поз); Если Условие Тогда ТЗ.УдалитьСтроку(); КонецЕсли; поз = поз - 1; КонецЦикла; ЗЫ. Это уже конечно триразапорватыйбаян, но искать в гуголе еще дольше. |
|||
12
aka AMIGO
14.07.16
✎
08:59
|
(11) Вариант :)
|
|||
13
HawkEye
14.07.16
✎
09:00
|
(7) воспользоваться поиском... тема обмусолена вдоль и поперек...
|
|||
14
aka AMIGO
14.07.16
✎
09:02
|
(13) Видишь-ли, ей надо сразу код, а не методику решения :)
|
|||
15
yliya_1C
14.07.16
✎
09:07
|
Да, получилось! Спасибо мальчики
Удачного всем дня! |
|||
16
aka AMIGO
14.07.16
✎
09:07
|
ЗЫ. ОФФ.. Полезная вещь всё-таки: либо начальные курсы программистов, либо книга-самоучитель по программированию.. там обычно много приёмчиков с хитростями и мелких примеров программирования.. Незнание которых может вызвать крупные потери времени и сил.. и здоровья :)
|
|||
17
Масянька
14.07.16
✎
09:14
|
(16) Зачем? Есть миста, есть "мальчики", девочку все устраивает...
|
|||
18
HawkEye
14.07.16
✎
09:14
|
(17) правильнее писать "девочЕК" )))
|
|||
19
Злопчинский
14.07.16
✎
09:20
|
ТЗ.НоваяКолонка("НадоУдалить","Число",1,0);
Цикл По ТЗ Если Условие Тогда ТЗ.НадоУдалить = 1; КонецЕсли; КонецЦикла; глОчисткаТЗ(ТЗ,"ПорядокСортировкиИтога"); будет на порядок быстрее |
|||
20
aka AMIGO
14.07.16
✎
09:21
|
(19) Ну, тогда и глОчистку пости сюда :)
|
|||
21
oslokot
14.07.16
✎
09:25
|
строки вообще не придется удалять, если получать таблицу с нужными данными
|
|||
22
DrZombi
гуру
14.07.16
✎
09:28
|
(4) Только через (3) или через (19)
Не делай удаление строк через "Выбрать", ТЗ теряет ссылки на последующие строчки :) |
|||
23
Масянька
14.07.16
✎
09:38
|
(21) Не комсомолец :)
|
|||
24
hhhh
14.07.16
✎
09:46
|
(21) да, и 1с покупать не нужно. Без нее как-то спокойнее.
|
|||
25
vladmenleo
14.07.16
✎
09:48
|
А классическое ?
ТЗ.НоваяКолонка("_Уд"); КолСтр=0; ТЗ.ВыбратьСтроки(); Пока ТЗ.Получитьстроку()=1 Цикл Если УсловиеВыполняется(ТЗ.К)=1 Тогда ТЗ._Уд=1; колстр=колстр+1; КонецЕсли; КонецЦикла; ТЗ.Сортировать("-_Уд"); ТЗ.УдалитьКолонку("_Уд"); ТЗ.Выгрузить(ТЗ_СЛУЖ,1,1); ТЗ_СЛУЖ.КоличествоСтрок(колстр); ТЗ_СЛУЖ.Заполнить(ТЗ); ТЗ=ТЗ_Служ; |
|||
26
DrZombi
гуру
14.07.16
✎
09:50
|
(21) Только не в 7.7 :)
Там проще в цикле, чем через запрос |
|||
27
Это_mike
14.07.16
✎
09:51
|
(26) нормальные запросы лучше циклов.
|
|||
28
DrZombi
гуру
14.07.16
✎
09:51
|
(27) У 7.7 нет нормальных запросов :)
|
|||
29
DrZombi
гуру
14.07.16
✎
09:53
|
(25) И что мешало удалить строки в первом цикле?
В чем профит? |
|||
30
vladmenleo
14.07.16
✎
10:08
|
(29) да удали, не вопрос :)
|
|||
31
Garykom
гуру
14.07.16
✎
10:13
|
Ладно уж напомню в очередной раз ))
Самое быстрое и оптимальное "удаление строк" из ТЗ это создание новой ТЗ. Перенос/копирование в нее только нужных строк и возврат новой ТЗ вместо старой. ЗЫ И да это можно делать запросом )) |
|||
32
oslokot
14.07.16
✎
10:19
|
(28) есть - прямые. Из-за них долго тормозился мой переход на снеговик :)
|
|||
33
vladmenleo
14.07.16
✎
10:26
|
(31) Что я и показал собственно в (25). Перетирали-ж эту тему на мисте кучу раз, вроде и решили, что перенос в новую самое оптимальное
|
|||
34
opus70
14.07.16
✎
10:28
|
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитЬСтроку()=1 Цикл если ТЗ.Чегото = ЧемутоРавно Тогда ТЗ.удалитьСтроку(); ТЗ.ВыбратьСтроки(); Конецесли; Конеццикла; |
|||
35
opus70
14.07.16
✎
10:30
|
да на больших объемах долг зато простой и понятный алгоритм
ЛЮБЛЮ ПРОСТЫЕ ВЕЩИ |
|||
36
vladmenleo
14.07.16
✎
10:34
|
(34) Если приличных размеров Тз, да такое в цикле раз несколько... Ждать мягко говоря устанешь
|
|||
37
opus70
14.07.16
✎
11:03
|
НУ ТУТ МОЖНО ОТВЕТИТ ПО ДРУГОМУ БОЛЬШИЕ ТЗ СКОРЕЙ ВСЕГО НЕ ПРАВИЛЬНЫЙ ПОДХОД К ДЕЛУ
А НА МАЛЕНЬКИХ ДО 500 1000 СТРОК ДАННЫЙ АЛГОРИТМ ИДЕАЛЕН А ДЛЯ БОЛЬШИХ САМЫЙ УДОБНЫЙ ЭТО (31) КОПИРОВАНИЕ В ДРУГУЮ ТЗ |
|||
38
opus70
14.07.16
✎
11:05
|
к несчастью в 7.7 нет запросов
но варианты удалиня строк в 8.хх мне не нравятся больше слишком за мудреный алгоритм обычно |
|||
39
Garykom
гуру
14.07.16
✎
11:05
|
(37) размер ТЗ не причем, причем только % удаляемых строк к размеру ТЗ
|
|||
40
DrZombi
гуру
14.07.16
✎
11:08
|
(31) Докажи, что это делать можно запросов в 1С 7.7 без ВК в без 1С++ :)
|
|||
41
DrZombi
гуру
14.07.16
✎
11:10
|
(37) На больших, самый удобный это 1С++ с прямыми запросами.
С написанными функциями на языке SQL. И в итоге получающий сразу же необходимую ТЗ на выходе. Без доп удаления и других шаманств :) |
|||
42
Chameleon1980
14.07.16
✎
11:12
|
с...уко
обсосано 384 миллиона раз. гугл сломали. прошу пардона у публики - нервы. |
|||
43
Garykom
гуру
14.07.16
✎
11:16
|
(40) Данные из запроса в новую ТЗ можно, но как засунуть данные из ТЗ в запрос?
ммм ммм ммм Только с одной колонкой придумал как |
|||
44
DrZombi
гуру
14.07.16
✎
11:17
|
(42) Ветки по геополитики нет. Спорить об способах в 8.х не интересно.
А 7-ка как велосипед, не катаемся, но помним как :) |
|||
45
Garykom
гуру
14.07.16
✎
11:18
|
(43)+ И нужна служебная объекта специально заполненная в базе, условием на которую (ТЗ параметр) и получаем что нуна
|
|||
46
Chameleon1980
14.07.16
✎
11:23
|
было жеж типа служебного дока для запросов по тз
|
|||
47
Chameleon1980
14.07.16
✎
11:25
|
тока всё это нафейхоа?
1цпп не устраивает? там, вроде, всё есть |
|||
48
DrZombi
гуру
14.07.16
✎
11:31
|
(47) в 1цпп есть все для второй жизни :)
|
|||
49
Эльниньо
14.07.16
✎
15:06
|
// Алгоритм Эльниньо
тз.ВыбратьСтроки(); Пока тз.ПолучитьСтроку()=1 Цикл Пока тз.НадоУдалить = 1 Цикл тз.УдалитьСтроку(); Если тз.НомерСтроки = 0 Тогда Прервать; КонецЕсли; КонецЦикла; КонецЦикла; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |