Версия для печати темы (https://pro1c.org.ua/index.php?s=59646f451df8e48213dc1afaef63fb47&showtopic=6524)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование управляемых форм 1С 8.2 _ Удаление строк из таблицы значений

Автор: bodka 28.02.12, 19:47

Что-то я запутался...
Вот допустим: Создаем таблицу значений, состоящая из колонок Номер, Наименование


Номер Наименование
1 Товар 1
2 Товар 2


нужно написать алгоритм удаления товар1 из таблицы

Создал форму и кнопку на ней и в модуле формы создал таблицу значений

&НаСервере
Процедура сервер()

    таб = новый ТаблицаЗначений;
    таб.Колонки.Добавить("Номер");
    таб.Колонки.Добавить("Наименование");
    
    новаястрока = таб.Добавить();
    новаястрока.Номер = 1;
    новаястрока.наименование = "Товар1";
    
     новаястрока = таб.Добавить();
    новаястрока.Номер = 2;
    новаястрока.наименование = "Товар2";
    новаястрока = таб.Добавить();
    новаястрока.Номер = 3;
    новаястрока.наименование = "Товар3";
    новаястрока = таб.Добавить();
    новаястрока.Номер = 4;
    новаястрока.наименование = "Товар1";
    
     Для НомерСтроки = 0 По таб.Количество() - 1 Цикл
    Сообщить(таб[НомерСтроки].номер);
    Сообщить(таб[НомерСтроки].наименование);    
        
     КонецЦикла;

А как лучше поступить дальше я не знаю. Направте на путь истинный пожалуйста.

Автор: logist 28.02.12, 20:14

Для Каждого Строка Из Таб Цикл
Если Строка.Наименование = "Товар1" Тогда
Таб.Удалить(Строка);
КонецЕсли;
КонецЦикла;

Автор: MATEVI 28.02.12, 20:17

http://pro1c.org.ua/redirect.php?http://www.1c-h.ru/?p=190

стрОтбор = Новый Структура("Колока2",22);

МассивСтрок = ТЗ.НайтиСтроки(стрОтбор); // в этом массиве останутся строки 2 и 4,
// т.е. в результате получим массив строк таблицы значений, соответствующих условиям поиска.
// Важно! Такой массив хранит ссылки на строки таблицы значений, то есть при изменении строки в таблице, значение в массиве тоже будет измененным.

ВремТЗ = ТЗ.Скопировать(МассивСтрок); // копируем массив строк во временную таблицу значений

ТЗ.Очистить(); // удаляем все строки из ТЗ

ТЗ = ВремТЗ.Скопировать(); // копируем всю временную таблицу значений в нашу ТЗ

Автор: Домовик 28.02.12, 23:21

ух-ты. MATEVI, интересно. А если Очистить() не применять, не запишет в ТЗ поверх?


а по этому коду в итоге не будет работать дольше, чем стандартное решение - пробежаться по строкам?

Автор: Vofka 29.02.12, 9:11

logist, так неправильно. Если по условию удалится строка (1), то предыдущая (2) станет на её место и при следующей итерации она (строка 2) будет пропущена.

Цитата(Домовик @ 28.02.12, 23:21) *
А если Очистить() не применять, не запишет в ТЗ поверх?

Запишет. Но я бы всеравно лучше очищал, мало ли smile.gif

Автор: logist 29.02.12, 9:21

Цитата(Vofka @ 29.02.12, 9:11) *
logist, так неправильно. Если по условию удалится строка (1), то предыдущая (2) станет на её место и при следующей итерации она (строка 2) будет пропущена.

Хм.. странно это всё)) Но у меня вроде такого момента не было, но за заметку спасибо, возможно стоит кое-что проверить smile.gif))

Автор: Vofka 29.02.12, 9:53

ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("Колонка1");
    ТЗ.Колонки.Добавить("Колонка2");
    ТЗ.Колонки.Добавить("Колонка3");
    
    Для инд = 0 По 10 Цикл
        
        НоваяСтрока = ТЗ.Добавить();
        НоваяСтрока.Колонка1 = "Строка_"+Строка(инд)+"_Колонка_1";
        НоваяСтрока.Колонка2 = "Строка_"+Строка(инд)+"_Колонка_2";
        НоваяСтрока.Колонка3 = "Строка_"+Строка(инд)+"_Колонка_3";
        
    КонецЦикла;

    Для Каждого Строка ИЗ ТЗ Цикл
    
        Если Строка.Колонка1 = "Строка_1_Колонка_1"
            ИЛИ Строка.Колонка1 = "Строка_2_Колонка_1"
            ИЛИ Строка.Колонка1 = "Строка_3_Колонка_1"
            
            Тогда
            
                ТЗ.Удалить(Строка);
                
        КонецЕсли;
    
    КонецЦикла;


После выполнения этого кода в ТЗ останется строка с содержанием колонки 1 "Строка_2_Колонка_1"

Автор: bodka 02.03.12, 17:20

Для Каждого строка Из Таб Цикл
        Если строка.Наименование = "Товар1"               
            Тогда
            Таб.Удалить(строка);
        КонецЕсли;
    КонецЦикла;


Уважаемый, подскажите почему этот код не работает?

Автор: Vofka 02.03.12, 17:40

bodka, а ниже посты почитать не судьба?

Автор: alex040269 02.03.12, 17:59

Цитата(bodka @ 02.03.12, 17:20) *
Для Каждого строка Из Таб Цикл
        Если строка.Наименование = "Товар1"               
            Тогда
            Таб.Удалить(строка);
        КонецЕсли;
    КонецЦикла;


Уважаемый, подскажите почему этот код не работает?

Правильно так:
ш=0;
Пока ш < Таб.Количество() Цикл
            Строка = Таб[ш];
        Если строка.Наименование = "Товар1"               
            Тогда
            Таб.Удалить(ш);
                 Иначе
                     ш = ш + 1
        КонецЕсли;
    КонецЦикла;

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua