|
как в табличной части удалить строки? | ☑ | ||
---|---|---|---|---|
0
baglandir111
28.08.20
✎
21:05
|
В табличной части:
- удалить строки с совпадающим значением в определенной колонке текущей строки - оставить только строки с совпадающим значением в определенной колонке текущей строки Как это можно сделать? Какой вариант самый быстрый ? |
|||
1
H A D G E H O G s
28.08.20
✎
21:16
|
ТаблицаСвертки=Товары.Выгрузить(,"Номенклатура");
ТаблицаСвертки.Колонки.Добавить("Количество"); ТаблицаСвертки.ЗаполнитьЗначения(1,"Количество"); ТаблицаСвертки.Свернуть("Номенклатура","Количество"); Для Каждого СтрокаТаблицы Из ТаблицаСвертки Цикл Если СтрокаТаблицы.Количество=1 Тогда Продолжить; КонецЕсли; СтруктураПоиска=Новый Структура; СтруктураПоиска.Вставить("Номенклатура",СтрокаТаблицы.Номенклатура); МассивСтрок=Товары.НайтиСтроки(СтруктураПоиска); ЭтоПерваяСтрока=Истина; Для Каждого НайденнаяСтрока Из МассивСтрок Цикл Если не ЭтоПерваяСтрока Тогда Товары.Удалить(НайденнаяСтрока); КонецЕсли; ЭтоПерваяСтрока=Ложь; КонецЕсли; КонецЦикла; Вот эта херня уберет дубли. |
|||
2
baglandir111
28.08.20
✎
21:46
|
(1) Благодарю но вангую медленную работу херни )
|
|||
3
H A D G E H O G s
28.08.20
✎
22:09
|
(2) Все будет быстро
|
|||
4
Garykom
гуру
28.08.20
✎
22:20
|
(1) Ты написал самый почти самый тормозной код
|
|||
5
Ёпрст
28.08.20
✎
22:21
|
(0)
тупо массив = ТабЧасть.НайтиСтроки(Новый Структура("Твояколонка",значениеколонки); Для каждого элементмассива из массив ТабЧасть.Удалить(элементмассива ) |
|||
6
baglandir111
29.08.20
✎
13:56
|
интересно можно ли это сделать через временные таблицы или соответсвие ?
участок очень узкий , очень не хочеться использовать двойные циклы ... |
|||
7
baglandir111
29.08.20
✎
14:28
|
Удаление дублей Сделал так
"ВЫБРАТЬ ВременнаяТаблица.Номенклатура КАК Номенклатура,ВременнаяТаблица.Количество КАК Количество,ВременнаяТаблица.Цена КАК Цена,ВременнаяТаблица.Сумма КАК Сумма ПОМЕСТИТЬ ВременнаяТаблица ИЗ &Таблица КАК ВременнаяТаблица ; ВЫБРАТЬ РАЗЛИЧНЫЕ * ИЗ ВременнаяТаблица" ); Запрос.УстановитьПараметр("Таблица",Товары); Результат = Запрос.Выполнить().Выгрузить(); Товары.Загрузить(Результат); |
|||
8
baglandir111
29.08.20
✎
14:38
|
как можно это сделать быстрее и оптимальней ?
//Вариант 1 удаление совпадающих элементов Текстрока = ЭлементыФормы.Товары.ТекущаяСтрока; массив = Товары.НайтиСтроки(Новый Структура("Номенклатура",Текстрока.Номенклатура)); Для каждого элементмассива из массив цикл Если не элементмассива.НомерСтроки = Текстрока.НомерСтроки Тогда Товары.Удалить(элементмассива ); КонецЕсли; КонецЦикла; |
|||
9
acht
29.08.20
✎
15:09
|
(2) > вангую медленную работу херни
... (7) > Сделал так "ВЫБРАТЬ ... ПОМЕСТИТЬ ВременнаяТаблица" Чой-то ржу. |
|||
10
etc
29.08.20
✎
15:10
|
(7) ты реально думаешь таскать таблицу на SQL сервер быстрее? Или замерял?
|
|||
11
H A D G E H O G s
29.08.20
✎
15:23
|
(8) Это самое быстрое
|
|||
12
baglandir111
29.08.20
✎
15:23
|
(10) Пока это гипотеза, нужно проверять
|
|||
13
H A D G E H O G s
29.08.20
✎
15:24
|
(8) Если конечно, это делается на сервере.
|
|||
14
baglandir111
29.08.20
✎
15:25
|
как на ваш взгляд что будет работать быстрее и почему ?
//Вариант 2 удаление совпадающих элементов через запр Текстрока = ЭлементыФормы.Товары.ТекущаяСтрока; Запрос = новый запрос ( "ВЫБРАТЬ | ВременнаяТаблица.НомерСтроки КАК НомерСтроки |ПОМЕСТИТЬ ВременнаяТаблица |ИЗ | &Таблица КАК ВременнаяТаблица |ГДЕ | ВременнаяТаблица.Номенклатура = &Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВременнаяТаблица.НомерСтроки КАК НомерСтроки |ИЗ | ВременнаяТаблица КАК ВременнаяТаблица | |УПОРЯДОЧИТЬ ПО | НомерСтроки УБЫВ" ); Запрос.УстановитьПараметр("Таблица",Товары); Запрос.УстановитьПараметр("Номенклатура",Текстрока.Номенклатура); Результат = Запрос.Выполнить().Выбрать(); Пока Результат.Следующий() цикл Если не Результат.НомерСтроки = Текстрока.НомерСтроки Тогда Товары.Удалить(Результат.НомерСтроки-1); КонецЕсли; КонецЦикла; //Вариант 1 удаление совпадающих элементов через цикл Текстрока = ЭлементыФормы.Товары.ТекущаяСтрока; массив = Товары.НайтиСтроки(Новый Структура("Номенклатура",Текстрока.Номенклатура)); Для каждого элементмассива из массив цикл Если не элементмассива.НомерСтроки = Текстрока.НомерСтроки Тогда Товары.Удалить(элементмассива ); КонецЕсли; КонецЦикла; |
|||
15
acht
29.08.20
✎
15:33
|
(14) Ненене, давай-ка сам. Даннsе-то у кого?
Засучивай рукава, запускай замер производительности. Потом с цифрами придешь нам нос утирвать |
|||
16
baglandir111
29.08.20
✎
15:51
|
(15) а как же гипотезы и теоретические умозаключения ? )
|
|||
17
baglandir111
29.08.20
✎
15:51
|
На мальньких обьемах без запроса работает быстрее.
|
|||
18
Ёпрст
29.08.20
✎
15:58
|
(17) ты не поверишь, но на больших тоже
|
|||
19
Garykom
гуру
29.08.20
✎
16:42
|
(0) Фактически у тебя одна задача:
Разделить исходную таблицу на две, одна с совпадающими значениями и вторая без них. Вот и копируй строки в две новые таблицы из исходной. В какую копировать определяй через дополнительное Соответствие, куда значения заносишь. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |