Имя: Пароль:
1C
 
как в табличной части удалить строки?
,
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) Фактически у тебя одна задача:
Разделить исходную таблицу на две, одна с совпадающими значениями и вторая без них.

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