Вход | Регистрация
 

как в табличной части удалить строки?

как в табличной части удалить строки?
Я
   baglandir111
 
28.08.20 - 21:05
В табличной части:
- удалить строки с совпадающим значением в определенной колонке текущей строки
- оставить только строки с совпадающим значением в определенной колонке текущей строки

Как это можно сделать?

Какой вариант самый быстрый ?
   H A D G E H O G s
 
1 - 28.08.20 - 21:16
ТаблицаСвертки=Товары.Выгрузить(,"Номенклатура");

ТаблицаСвертки.Колонки.Добавить("Количество");
ТаблицаСвертки.ЗаполнитьЗначения(1,"Количество");
ТаблицаСвертки.Свернуть("Номенклатура","Количество");

Для Каждого СтрокаТаблицы Из ТаблицаСвертки Цикл
Если СтрокаТаблицы.Количество=1 Тогда
Продолжить;
КонецЕсли;
СтруктураПоиска=Новый Структура;
СтруктураПоиска.Вставить("Номенклатура",СтрокаТаблицы.Номенклатура);
МассивСтрок=Товары.НайтиСтроки(СтруктураПоиска);
ЭтоПерваяСтрока=Истина;
Для Каждого НайденнаяСтрока Из МассивСтрок Цикл
Если не ЭтоПерваяСтрока Тогда
Товары.Удалить(НайденнаяСтрока);
КонецЕсли;
ЭтоПерваяСтрока=Ложь;
КонецЕсли;
КонецЦикла;


Вот эта херня уберет дубли.
   baglandir111
 
2 - 28.08.20 - 21:46
(1) Благодарю но вангую медленную работу херни )
   H A D G E H O G s
 
3 - 28.08.20 - 22:09
(2) Все будет быстро
   Garykom
 
4 - 28.08.20 - 22:20
(1) Ты написал самый почти самый тормозной код
   Ёпрст
 
5 - 28.08.20 - 22:21
(0)

тупо

массив = ТабЧасть.НайтиСтроки(Новый Структура("Твояколонка",значениеколонки);
Для каждого элементмассива из массив
  ТабЧасть.Удалить(элементмассива )
   baglandir111
 
6 - 29.08.20 - 13:56
интересно можно ли это сделать через временные таблицы или соответсвие ?  
участок очень узкий , очень не хочеться использовать двойные циклы ...
   baglandir111
 
7 - 29.08.20 - 14:28
Удаление дублей Сделал так 

    "ВЫБРАТЬ ВременнаяТаблица.Номенклатура КАК Номенклатура,ВременнаяТаблица.Количество КАК Количество,ВременнаяТаблица.Цена КАК Цена,ВременнаяТаблица.Сумма КАК Сумма ПОМЕСТИТЬ ВременнаяТаблица ИЗ &Таблица КАК ВременнаяТаблица ; ВЫБРАТЬ РАЗЛИЧНЫЕ * ИЗ ВременнаяТаблица"
    );
    
    Запрос.УстановитьПараметр("Таблица",Товары);
    Результат = Запрос.Выполнить().Выгрузить();
    Товары.Загрузить(Результат);
   baglandir111
 
8 - 29.08.20 - 14:38
как можно это сделать быстрее и оптимальней ?
    //Вариант 1 удаление совпадающих элементов 

    Текстрока = ЭлементыФормы.Товары.ТекущаяСтрока;
    массив = Товары.НайтиСтроки(Новый Структура("Номенклатура",Текстрока.Номенклатура));
    Для каждого элементмассива из массив цикл
        Если не  элементмассива.НомерСтроки  = Текстрока.НомерСтроки Тогда
            Товары.Удалить(элементмассива );
        КонецЕсли;
    КонецЦикла;
   acht
 
9 - 29.08.20 - 15:09
(2) > вангую медленную работу херни
...
(7) > Сделал так "ВЫБРАТЬ ... ПОМЕСТИТЬ ВременнаяТаблица"

Чой-то ржу.
   etc
 
10 - 29.08.20 - 15:10
(7) ты реально думаешь таскать таблицу на SQL сервер быстрее? Или замерял?
   H A D G E H O G s
 
11 - 29.08.20 - 15:23
(8) Это самое быстрое
   baglandir111
 
12 - 29.08.20 - 15:23
(10) Пока это гипотеза, нужно проверять
   H A D G E H O G s
 
13 - 29.08.20 - 15:24
(8) Если конечно, это делается на сервере.
   baglandir111
 
14 - 29.08.20 - 15:25
как на ваш взгляд что будет работать быстрее и почему ?

    //Вариант 2  удаление совпадающих элементов через запр

    Текстрока = ЭлементыФормы.Товары.ТекущаяСтрока;
    Запрос = новый запрос (
    "ВЫБРАТЬ
    |    ВременнаяТаблица.НомерСтроки КАК НомерСтроки
    |ПОМЕСТИТЬ ВременнаяТаблица
    |ИЗ
    |    &Таблица КАК ВременнаяТаблица
    |ГДЕ
    |    ВременнаяТаблица.Номенклатура = &Номенклатура
    |;
    |
    ////////////////////////////////////////////////////////////////////////////////

    |ВЫБРАТЬ
    |    ВременнаяТаблица.НомерСтроки КАК НомерСтроки
    |ИЗ
    |    ВременнаяТаблица КАК ВременнаяТаблица
    |
    |УПОРЯДОЧИТЬ ПО
    |    НомерСтроки УБЫВ"
    );
    Запрос.УстановитьПараметр("Таблица",Товары);
    Запрос.УстановитьПараметр("Номенклатура",Текстрока.Номенклатура);
    Результат = Запрос.Выполнить().Выбрать();
    Пока Результат.Следующий() цикл
        Если не  Результат.НомерСтроки  = Текстрока.НомерСтроки Тогда
            Товары.Удалить(Результат.НомерСтроки-1);
        КонецЕсли;
    КонецЦикла;


        //Вариант 1 удаление совпадающих элементов через цикл

    Текстрока = ЭлементыФормы.Товары.ТекущаяСтрока;
    массив = Товары.НайтиСтроки(Новый Структура("Номенклатура",Текстрока.Номенклатура));
    Для каждого элементмассива из массив цикл
        Если не  элементмассива.НомерСтроки  = Текстрока.НомерСтроки Тогда
            Товары.Удалить(элементмассива );
        КонецЕсли;
    КонецЦикла;
   acht
 
15 - 29.08.20 - 15:33
(14) Ненене, давай-ка сам. Даннsе-то у кого?
Засучивай рукава, запускай замер производительности. Потом с цифрами придешь нам нос утирвать
   baglandir111
 
16 - 29.08.20 - 15:51
(15) а как же гипотезы и теоретические умозаключения ? )
   baglandir111
 
17 - 29.08.20 - 15:51
На мальньких обьемах без запроса работает быстрее.
   Ёпрст
 
18 - 29.08.20 - 15:58
(17) ты не поверишь, но на больших тоже
   Garykom
 
19 - 29.08.20 - 16:42
(0) Фактически у тебя одна задача:
Разделить исходную таблицу на две, одна с совпадающими значениями и вторая без них.

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

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.