Имя: Пароль:
1C
1С v8
Правильно удалить текущую строку в ТЗ
0 gorilla
 
26.02.16
21:41
добрый вечер,подскажите как правильно удалить строку в ТЗ?
    Для каждого СтрокаТЧ Из ТаблицаТоваров Цикл
Если  СтрокаТЧ.Склад=Перечисления.Склад.Основной Тогда
            ТаблицаТоваров.Удалить()    
            КонецЕсли;    
        КонецЦикла;
1 Попытка1С
 
26.02.16
21:45
Удалять надо с конца.
2 Lexey_
 
26.02.16
21:46
(0) правильно обратным циклом, гугли, на твой вопрос есть не один ответ
3 gorilla
 
26.02.16
21:47
(2)это как
4 gorilla
 
26.02.16
21:50
я циклом сначала иду.как с конца идти?
5 Злопчинский
 
26.02.16
22:06
(4)  программирование совсем непонятная для тебя вещь?
6 Garykom
 
гуру
26.02.16
22:08
в очередной раз повторю
правильное удаление строки из ТЗ, это:

Перенос в новую ТЗ только тех строк которые не нужно удалять
7 marvak
 
26.02.16
22:10
можно НайтиСтроки(<Отбор>) и потом удалить все из получившегося массива строк
8 Alex S D
 
26.02.16
22:15
правильнее не удалять а не помещать их туда
9 Garykom
 
гуру
26.02.16
22:18
(8) +5
10 MishaD
 
26.02.16
22:20
(8)Хотеть не вредно. Ну вот например Тз как результат запроса. Если добавить нужное условие, то не попадаешь в индекс.
11 Garykom
 
гуру
26.02.16
22:21
(10) сложно сделать второй запрос который вернет только нужное?
12 ДенисЧ
 
26.02.16
22:21
(10) Вот ты знаешь, что сейчас сказал?
Ты сказал "я вообще ни разу не умею писать запросы, зато знаю умное слово индекс"...
13 Garykom
 
гуру
26.02.16
22:25
(12) ха
может чтобы узнать "индекс" сначала нужно получить ТЗ из запроса и для каждой строчки индивидуально функциями обработать...
14 MishaD
 
26.02.16
22:26
(12)Самомнение штука хорошая
Ну или вариант 2 - загрузка из Excel
15 marvak
 
26.02.16
22:27
Да ладно, может он ТЗ пользователю показывает, а тот уже решает что там удалять.
16 Defender aka LINN
 
27.02.16
00:54
(2) Я удаляю выбрав строки в массив. Можно ссылку на то, что я это делаю неправильно?
17 kosts
 
27.02.16
01:17

Для каждого т Из ТаблицаТоваров.НайтиСтроки(новый Структура("Сумма", 0)) Цикл
    т.Удалить();    
КонецЦикла;
18 kosts
 
27.02.16
01:19
(17) чуть не так


Для каждого т Из ТаблицаТоваров.НайтиСтроки(новый Структура("Сумма", 0)) Цикл
    ТаблицаТоваров.Удалить(т);    
КонецЦикла;
19 youalex
 
27.02.16
01:22
Если обход строк по индексу - удалять с конца, если по ссылкам (Для Каждого Из) - без разницы.
Еще можно через ПостроительЗапроса/ИсточникДанных/Отбор )
20 zak555
 
27.02.16
07:01
(10) напиши запрос так, чтобы ничего не удалять
21 Лефмихалыч
 
27.02.16
07:54
Варианта два:
1. Удалять с конца
2. НайтиСтроки, которые не нужны, и сложить их в массив (или циклом собрать эти строки), потом удалить мороки в цикле для каждого по этому массиву

Вариант типа (18) - хрень, ибо производительность его будет уменьшаться экспоненциально с ростом размера таблицы
22 Мимохожий Однако
 
27.02.16
08:36
Отбор, НайтиСтроки() и обходи полученный массив. Удалять не обязательно
23 alle68
 
27.02.16
09:17
(21) Есть замеры, подтверждающие "хреновость" варианта?
24 Записьдампа
 
27.02.16
09:27
(21) Гм. А чем твой вариант №2 отличается от (18). Фатальный недостаток?
25 фобка
 
27.02.16
09:32
(24) фатальный недостаток в том что он ищет строки для каждой итерации
26 Лефмихалыч
 
27.02.16
09:34
(24) у меня поиск в таблице или перебор один раз происходит, в 18 каждую строку приходится искать заново.
Хотя, при учете, что при построчном удалении таблица скорее всего перстраивается целиком, все варианты с последовательным удалением одинаково хреновые и оптимальнее всего, как уже было отмечено выше, сформировать новую ТЗ из строк, которые должны остаться.
Лет пять назад вроде был тут целый холивар на тему, как правильнее всего удалять строки. Сотрясли кубометры воздуха, но универсального варианта на все времена не еашли
27 Лефмихалыч
 
27.02.16
09:37
а, в (18) найтиСтрокии(). Пардон - тогда он идентичен моему второму варианту. Если платформа не вызывает этот найтиСтроки на каждой итерации.
28 Serg_1960
 
27.02.16
09:46
- Удалять надо с конца.
- Это как?

Для Индекс = -Таблица.Количество()+1 По 0 Цикл
   Строка = Таблица.Получить(-Индекс);
   Если УсловиеУдаления Тогда
      Таблица.Удалить(Строка);
   КонецЕсли;
КонецЦикла;
29 Фрэнки
 
27.02.16
09:47
(27) не слишком вглядываясь в ранее написанное.
НайтиСтроки() возвращает массив. Его нужно задать в виде переменной перед циклом МассивДляУдаления. В условии цикла поставить Из МассивДляУдаления.

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

Так что все равно в каком направлении обходить массив, но не все равно в каком направлении использовать индексы. в значениях ссылок индексов нет.
30 MishaD
 
27.02.16
09:49
Хотел бы я посмотреть, как вы будете найтистроки использовать при удалении по сложному условию.
31 Фрэнки
 
27.02.16
09:53
(28)
Индекс = ТЗ.Количество();
Пока Индекс > 0 Цикл
    Индекс = Индекс - 1;
    // это если нужно для операций над строкой
    СтрокаТЗ = ТЗ.Получить(Индекс);
    // а здесь просто удаляем по индексу
    ТЗ.Удалить(Индекс);
КонецЦикла;
32 Фрэнки
 
27.02.16
09:53
(30) у кого посмотреть хочешь?
33 Serg_1960
 
27.02.16
09:58
(31) Автор в (0) обращается к строке для условия удаления - и потому (28)
34 Фрэнки
 
27.02.16
10:03
(33) условие можно вставить и в том виде, как в 31 сделано.
А я всего лишь дал упрощенную форму для условия цикла.
35 Фрэнки
 
27.02.16
10:04
(33) просто он отрицательного значения индекса глаза выворачиваются :) - для субботы это слишком тяжко
36 Serg_1960
 
27.02.16
10:11
Классика жанра (из типовых)

Отбор = Новый Структура();
Отбор.Вставить(...);
Строки = Таблица.НайтиСтроки(Отбор);
Для Каждой Строка Из Строки Цикл
...
37 Serg_1960
 
27.02.16
10:12
(35) Ты прав, что-то я не подумал про субботу :)
38 Записьдампа
 
27.02.16
10:24
(29) Можно и без отдельного массива. Читаться будет сложнее, работать точно также.
(31) В пока >= 0 надо проверять

Суббота - не твой день =)
39 Записьдампа
 
27.02.16
10:24
(38) Хе, и не мой =)
40 Фрэнки
 
27.02.16
10:34
(39) :)
41 Mort
 
27.02.16
10:43
Строки к удалению в отдельный массив неважно как, а дальше стандартно.
42 marvak
 
27.02.16
11:21
Для (0) подробно, что то он пропал куда то

МассивСтрокТЗ = ТаблицаТоваров.НайтиСтроки(Новый Структура("Склад", Перечисления.Склад.Основной));

Для каждого СтрокаТЗ Из МассивСтрок Цикл
    ТаблицаТоваров.Удалить(СтрокаТЗ);    
КонецЦикла;
43 marvak
 
27.02.16
11:21
поправил
МассивСтрокТЗ = ТаблицаТоваров.НайтиСтроки(Новый Структура("Склад", Перечисления.Склад.Основной));

Для каждого СтрокаТЗ Из МассивСтрокТЗ Цикл
    ТаблицаТоваров.Удалить(СтрокаТЗ);    
КонецЦикла;
44 Web00001
 
27.02.16
11:28
Ветку не читай комментарии пиши, я думаю мой способ будет самый правильный и никто еще не разу про него не написал. В общем так:
1. Сначала получаем массив строк с помощью "Найти строки" или еще каким либо путем, неважно
2. С помощью цикла "Для каждого Из" удаляем строки из ТЗ, те которые есть в этом массиве
3. Я гениален!
Наверняка из предыдущих 40 постов этого никто не предложил :)
45 marvak
 
27.02.16
11:34
(0)
Шутку поняли. Смешно.
Ты офигенный юморист!
46 marvak
 
27.02.16
11:34
(45) -> (44)
47 kosts
 
27.02.16
11:52
(44) Все конечно читать лень, но хотя бы пару последних постов прочитал бы...
48 kosts
 
27.02.16
11:56
(21) > Вариант типа (18) - хрень, ибо производительность его будет уменьшаться экспоненциально с ростом размера таблицы

Я возможно и не прав, но вот сколько раз будет вызвана функция?


Для каждого СтрокаТЗ Из Фун(ТаблицаТоваров.НайтиСтроки(Новый Структура("Склад", Перечисления.Склад.Основной))) Цикл
    ТаблицаТоваров.Удалить(СтрокаТЗ);    
КонецЦикла;

Функция Фун(МассивСтрокТЗ )
    Сообщить("Тест");
    Возврат МассивСтрокТЗ;
КонецФункции
49 Enterprise
 
27.02.16
11:58
(25) неправда, ищет один раз
Конструкция из (18) имеет право на существование и в скорости не уступает, есть замеры
50 EvgeniuXP
 
27.02.16
12:17
Так с конца идешь:

Для нс = -ТЗ.Количество() По -1 Цикл


КонецЦикла;


Можешь сначала в массив закинуть нужные строки, а потом разом их и грохнуть.
51 EvgeniuXP
 
27.02.16
12:18
если не умеешь, закинь ТЗ в запрос, отфильтруй и выгрузи ТЗ :)
52 EvgeniuXP
 
27.02.16
12:19
можешь отбором по строкам и грохнуть разом
53 kosts
 
27.02.16
12:20
Жаль, что в языке нету удаления массива строк, это был бы самый быстрый вариант
54 EvgeniuXP
 
27.02.16
12:25
(53) напиши свою удобную процедуру :)
55 фобка
 
27.02.16
13:33
(49) если в цикле добавить новую строку удовлетворяющую условиям отбора, она будет удалена?
56 Enterprise
 
27.02.16
13:43
(55) У цикла будет столько итераций, сколько было изначально элементов
57 kosts
 
27.02.16
15:06
(54) скорости это не прибавит
58 Lexey_
 
27.02.16
15:49
(16) а я разве сказал, что все остальные способы неправильные?
59 фобка
 
27.02.16
16:15
(56) как-то ты ушел от ответа. Строка будет удалена?
60 alle68
 
27.02.16
16:40
(59) Он же ответил неявно - нет.
61 Garykom
 
гуру
27.02.16
16:48
ТаблицаЗначений.Скопировать (ValueTable.Copy)
ТаблицаЗначений (ValueTable)
Скопировать (Copy)
Вариант синтаксиса: Скопировать строки

Синтаксис:

Скопировать(<Строки>, <Колонки>)
Параметры:

<Строки> (необязательный)

Тип: Массив.
Массив строк для копирования. Если не указан, копируются все строки таблицы значений.
<Колонки> (необязательный)

Тип: Строка.
Список колонок для копирования в формате: "Колонка1, Колонка2...".
Описание варианта метода:

Если указаны строки и колонки, то только они будут скопированы. Если не указаны, то будет создана полная копия таблицы значений.
Вариант синтаксиса: Скопировать по отбору

Синтаксис:

Скопировать(<ПараметрыОтбора>, <Колонки>)
Параметры:

<ПараметрыОтбора> (необязательный)

Тип: Структура.
Ключ структуры - идентификатор колонки, а значение структуры - значение отбора.
<Колонки> (необязательный)

Тип: Строка.
Список колонок для копирования в формате: "Колонка1, Колонка2...".
Описание варианта метода:

Если указан отбор, то только строки из отбора будут скопированы. Если отбор не указан, то будут скопированы все строки таблицы значений. Если указаны колонки, то только эти колонки будут скопированы. Иначе, будут скопированы все колонки таблицы значений.
Возвращаемое значение:

Тип: ТаблицаЗначений.

Описание:

Создает копию исходной таблицы значений.

Доступность:

Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
Пример:

НовТаблицаЦен = ТаблицаЦен.Скопировать();


--------------------------------------------------------------------------------

     Методическая информация
62 Garykom
 
гуру
27.02.16
16:50
(61) если нет четкого признака в отдельной колонке "для удаления" то простейше это добавляем новую колонку, в нужные "для удаления" строки пишем нечто
затем копируем только те строки через "ПараметрыОтбора" куда ничего не проставили
63 Записьдампа
 
27.02.16
17:09
(62) И в процессе "написания нечто" перебираем все строки? =)
64 Garykom
 
гуру
27.02.16
17:11
(63) 1 раз
и еще 1 раз они "переберутся" при копировании

а если удалять по одной строке, то каждое удаление вызывает "перебор" части строк
т.е. сколько строк удалили - столько раз и "перебрали"
65 Записьдампа
 
27.02.16
17:26
(64) Ну если тебя производительность выделения память так беспокоит и хочется именно копию таблицы получить, то делай наоборот - при проверке условия запоминай строки, которые надо оставить =)
66 Garykom
 
гуру
27.02.16
17:36
(65) очень рекомендую попробовать создать ТЗ в несколько сотен тысяч строк

а потом попробовать удалить из нее половину строк через ТЗ.Удалить(Строка|Индекс)
67 ДенисЧ
 
27.02.16
17:44
(66) Очень рекомендую сильно думать перед созданием "ТЗ в несколько сотен тысяч строк"
Говорят, иногда помогает быстрее работать программе...
68 Записьдампа
 
27.02.16
17:46
(66) Несколько сотен тысяч из которых половина не нужна? Герой!
69 Garykom
 
гуру
27.02.16
18:22
(67) так эту "ТЗ" не я создавал а другие "программисты"
предлагается лезти в их "код" и переписывать?

(68) ну да все как обычно: "Сначала создаем себе трудности, а потом героически их преодолеваем"
70 Enterprise
 
27.02.16
20:39
(59) В тз она останется
71 ice777
 
27.02.16
20:49
Просто собрать строки к удалению, например, в массив, а потом удалить.

Я в шоке от тупизма.
72 ice777
 
27.02.16
20:52
(71) + и читайте про коллекции.
А если впадлу- то просто работайте, слушайтесь и не выеж..)
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.