Имя: Пароль:
1C
1C 7.7
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 Тогда
             Прервать;
         КонецЕсли;
    КонецЦикла;
КонецЦикла;