Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Удаление строк из таблицы значений
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование управляемых форм 1С 8.2
bodka
Что-то я запутался...
Вот допустим: Создаем таблицу значений, состоящая из колонок Номер, Наименование


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


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

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

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

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

А как лучше поступить дальше я не знаю. Направте на путь истинный пожалуйста.
logist
Для Каждого Строка Из Таб Цикл
Если Строка.Наименование = "Товар1" Тогда
Таб.Удалить(Строка);
КонецЕсли;
КонецЦикла;
MATEVI
необходимо зарегистрироваться для просмотра ссылки
стрОтбор = Новый Структура("Колока2",22);

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

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

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

ТЗ = ВремТЗ.Скопировать(); // копируем всю временную таблицу значений в нашу ТЗ
Домовик
ух-ты. MATEVI, интересно. А если Очистить() не применять, не запишет в ТЗ поверх?


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

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

Запишет. Но я бы всеравно лучше очищал, мало ли smile.gif
logist
Цитата(Vofka @ 29.02.12, 9:11) необходимо зарегистрироваться для просмотра ссылки
logist, так неправильно. Если по условию удалится строка (1), то предыдущая (2) станет на её место и при следующей итерации она (строка 2) будет пропущена.

Хм.. странно это всё)) Но у меня вроде такого момента не было, но за заметку спасибо, возможно стоит кое-что проверить smile.gif))
Vofka
ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("Колонка1");
    ТЗ.Колонки.Добавить("Колонка2");
    ТЗ.Колонки.Добавить("Колонка3");
    
    Для инд = 0 По 10 Цикл
        
        НоваяСтрока = ТЗ.Добавить();
        НоваяСтрока.Колонка1 = "Строка_"+Строка(инд)+"_Колонка_1";
        НоваяСтрока.Колонка2 = "Строка_"+Строка(инд)+"_Колонка_2";
        НоваяСтрока.Колонка3 = "Строка_"+Строка(инд)+"_Колонка_3";
        
    КонецЦикла;

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


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


Уважаемый, подскажите почему этот код не работает?
Vofka
bodka, а ниже посты почитать не судьба?
alex040269
Цитата(bodka @ 02.03.12, 17:20) необходимо зарегистрироваться для просмотра ссылки
Для Каждого строка Из Таб Цикл
        Если строка.Наименование = "Товар1"               
            Тогда
            Таб.Удалить(строка);
        КонецЕсли;
    КонецЦикла;


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

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