8.х удаление строк из таблицы значений

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Muggsy, 4 дек 2009.

  1. TopicStarter Overlay
    Muggsy
    Offline

    Muggsy одно ЭС

    Регистрация:
    10 сен 2008
    Сообщения:
    243
    Симпатии:
    0
    Баллы:
    26
    пишу так:
    Код:
    для каждого стр из тзданных цикл
    сообщить(типзнч(стр.СуммаОборотПолуч));
    если не строка(типЗнч(стр.СуммаОборотПолуч)) = "Число" или  стр.СуммаОборотПолуч = 0 тогда
    тзданных.Удалить(стр);	
    конецесли;
    
    конецЦикла;
    
    
    на выходе получаю таблицу, где удалены некоторые строки а другие остались
    не понимаю почему так происходит и как правильно?
  2. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    попробуй так:

    Код:
    индексстроки = 0;
    пока индексстроки<= ТЗ.количество() цикл
    строкатз = тз[индексстроки];
    Если НУЖНОЕ_УСЛОВИЕ тогда
    ТЗ.Удалить(строкаТз);
    продолжить;
    КонецЕсли;
    ИндексСтроки = ИндексСтроки + 1;
    КонецЦикла;
    
    
    
    Помнится мне, есть какой-то косяк с удалением строк в таблице, при обходе таблицы циклом Для каждого .... ИЗ ....
  3. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Это не косяк :)))))

    Просто сдвигаются индексы.
    Нарисуйте таблицу на листке и пройдитесь по циклу, последовательно вычеркивая. Получите перескок через строку.

    Т.е. надо идти с конца таблицы.
  4. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    ...т.е. циклом Для каждого .... ИЗ ... это не сделать корректно - что и требовалось доказать :)

    ...как-то мельком разбирался с этим - помню, что что-то со сдвигом строк было....
  5. TopicStarter Overlay
    Muggsy
    Offline

    Muggsy одно ЭС

    Регистрация:
    10 сен 2008
    Сообщения:
    243
    Симпатии:
    0
    Баллы:
    26
    написала так:
    Код:
    Для Индекс=ТЗДанных.Количество()-1 По 0 Цикл
    если типЗнч(ТЗДанных[Индекс].СуммаОборотПолуч) = неопределено или ТЗДанных[Индекс].СуммаОборотПолуч = 0 тогда
    тзданных.Удалить(ТЗДанных[Индекс]);
    конецесли;
    // индекс = индекс-1;
    конеццикла;	
    
    
    он даже туда не заходит!
  6. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    И не зайдет, т.к. значение "индекс" не изменяется, т.е. по одной строке топчемся.
    // индекс = индекс-1; таки раскоментировать надо и добавить "продолжить;" после удаления строки
  7. TopicStarter Overlay
    Muggsy
    Offline

    Muggsy одно ЭС

    Регистрация:
    10 сен 2008
    Сообщения:
    243
    Симпатии:
    0
    Баллы:
    26
    расскоментарила, добавила, один фиг не заходит.......
    может как-нибудь по-другому попробовать удалить ненужные строки?
  8. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    можно через найти, потом обрабатывать массив, но это в принципе тоже самое, что делается этим кодом.

    Код:
    Отбор = Новый Структура ("СуммаОборотПолуч", 0);
    МассивСтрокДляУдаления = ТЗ.НайтиСтроки(Отбор);
    Для Каждого Строка Из МассивСтрокДляУдаления Цикл
    ТЗ.Удалить(Строка);
    КонецЦикла;
    
    
    .....но не получится ли тот же самый прикол со сдвигом индексов в этом случае - не знаю, не проверял, но думается мне, что получится :) и массив строк все равно нужно обходить с конца в начало, поэтому смысла в этом способе абсолютно никакого - просто как вариант :)

    у тебя не выполняется условие. глянь, что выдает условие

    типЗнч(ТЗДанных[Индекс].СуммаОборотПолуч) = неопределено

    и какой тип значения у ТЗДанных[Индекс].СуммаОборотПолуч
  9. TopicStarter Overlay
    Muggsy
    Offline

    Muggsy одно ЭС

    Регистрация:
    10 сен 2008
    Сообщения:
    243
    Симпатии:
    0
    Баллы:
    26
    так я поставила точку остановки на условии - не останавливается!
  10. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    значит условие не выполняется, проверяй составляющие условия
  11. Stack_G
    Offline

    Stack_G Опытный в 1С

    Регистрация:
    10 дек 2007
    Сообщения:
    786
    Симпатии:
    2
    Баллы:
    26
    Товарищи! Загляните в типовые и все увидите :)
    Код:
    // Списание резерва
    ТаблицаПоСписанияРезерва = ТаблицаПоТоварам.Скопировать();
    Сч = 0;
    Пока Сч < ТаблицаПоСписанияРезерва.Количество() Цикл
    СтрокаТаблицы = ТаблицаПоСписанияРезерва.Получить(Сч);
    Если ЗначениеНеЗаполнено(СтрокаТаблицы.ДокументРезерва) 
    ИЛИ (ТипЗнч(СтрокаТаблицы.ДокументРезерва) <> Тип("ДокументСсылка.ЗаказПокупателя")
    И ТипЗнч(СтрокаТаблицы.ДокументРезерва) <> Тип("ДокументСсылка.ПриходныйОрдерНаТовары"))Тогда
    ТаблицаПоСписанияРезерва.Удалить(СтрокаТаблицы);
    Иначе
    Сч = Сч + 1;
    КонецЕсли;
    КонецЦикла;
    
  12. TopicStarter Overlay
    Muggsy
    Offline

    Muggsy одно ЭС

    Регистрация:
    10 сен 2008
    Сообщения:
    243
    Симпатии:
    0
    Баллы:
    26
    урра получилось! спасибо :unsure:

Поделиться этой страницей