Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с удалением строк  (Прочитано 11489 раз)
0 Пользователей и 6 Гостей смотрят эту тему.
Элексир
Помогающий

ru
Offline Offline
Пол: Мужской

« : 29-11-2009 16:10 » new

Добрый вечер. Помогите, пожалуйста, с такой проблемой: хочу удалить строки с нулевыми данными.
Код:
ИндексТекСтроки=ТабличнаяЧасть1.Индекс(ЭлементыФормы.ТабличноеПоле1.ТекущаяСтрока);
Для Каждого НовСтрок из ТабличнаяЧасть1 цикл
Если (число(НовСтрок.ВПоказания1)=0) и (число(НовСтрок.ВПоказания2)=0)
и (число(НовСтрок.ВПоказания3)=0) тогда
ТабличнаяЧасть1.Удалить(ИндексТекСтроки);
КонецЕсли;
Она же удаляет и непустые тоже.
В чем ошибка, никак не пойму  Здесь была моя ладья...
« Последнее редактирование: 29-11-2009 16:20 от Sel » Записан
Oleshek
Гость
« Ответ #1 : 30-11-2009 05:07 » 

А ИндексТекСтроки в цикле не меняется? Тогда удаляется все время строка и одним и тем же номером.
Попробуй перебор строк от последней к первой, т.е. в обратном порядке.
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 30-11-2009 08:48 » 

Во-первых у тебя в коде должно быть
Код:
ТабличнаяЧасть1.Удалить(НовСтрок);
поскольку индекс у тебя не меняется и удалиться пытается всегда строка с одним и тем же индексом.

По идее в циклах типа "для каждого" вариант удаления элемента выборки не должен влиять на цикл, но в 1С это правило не выполняется. Потому можно как верно предложил Oleshek проходить по строкам от конца к началу (кстати самый правильный вариант для 7.7) либо в 8 я сначала скидываю в массив строки (не индексы!) а потом удаляю по массиву:
Код:
Мас=Новый Массив;
Для каждого Стр из ТЗ Цикл
Если (Условие для строки выполняется) Тогда
Мас.Добавить(Стр);
КонецЕсли;
КонецЦикла;
Для каждого Стр из Мас Цикл
ТЗ.Удалить(Стр);
КонецЦикла;
Записан
Элексир
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 30-11-2009 10:01 » 

Kivals, попробовал как вы посоветовали, получилось почти.
Код:
ТабличнаяЧасть1=ТЗ.Скопировать();
пишет что поле объекта недоступно для записи
Записан
Элексир
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 30-11-2009 10:38 » 

О все заработало, оказывается надо было так
Код:
ТабличнаяЧасть1.Загрузить(ТЗ);
Kivals, а как делать перебор в обратном порядке?
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 30-11-2009 13:50 » 

Элексир, можно было перед циклом:
Код:
ТЗ = ТабличнаяЧасть1;
т.е. ассоциировать переменную ТЗ с табличной частью - рассмотренные выше методы есть и у табличной части, и у таблицы значений.
ну или полностью поменять код так:
Код:
Мас=Новый Массив;
Для каждого Стр из ТабличнаяЧасть1 Цикл
Если (Условие для строки выполняется) Тогда
Мас.Добавить(Стр);
КонецЕсли;
КонецЦикла;
Для каждого Стр из Мас Цикл
ТабличнаяЧасть1.Удалить(Стр);
КонецЦикла;
Записан
Элексир
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 30-11-2009 13:58 » 

Всем спасибо за помощь!
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines