Таблица Значений и цикл удаления

1. andadra 14.08.15 15:09 Сейчас в теме
Здравствуйте,у меня вопрос,как мне кажется очень банальный,но я не могу додуматься уже как 4 часа.У меня есть таблица значений,мне нужно удалить строку если в колонке есть 0,когда я решил что у меня все получилось и начал радоваться то пришла новая непонятная проблемка.
Сейчас выложу код а потом опишу проблему

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



Так вот здесь есть странная законномерность,если записей в таблице 1 или 2,то дублируется последняя запись и получается что записи не 1,а 2,и если 2 записи то выводит 3 строки,ДУБЛИРУЕТ ПОСЛЕДНЮЮ!!!
ЕСЛИ ЖЕ 3 ИЛИ БОЛЕЕ СТРОК,ТО ВЫВОДИТ ХОРОШО,КАК ДОЛЖЕН!!!
Голова уже не варит,а сдать охото сегодня обработку,помогите пожалуйста!!!
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Xershi 1488 14.08.15 15:15 Сейчас в теме
(1) andadra, твой косяк в том что ты обходишь таблицу не с конца! Только обход таблицы с последней строки по первую даст корректный результат при удалении строк.
uk09; wau8824ru; klinval; +3 Ответить
21. PhoenixAOD 62 21.06.22 04:46 Сейчас в теме
(1)А что мезает выгрузить эту тз в Запрос, там все строки где ТЗ.Количество > 0, очисть тз, и сделать Тз.Загрузить(Выборка)? будет быстрее
3. Serega-artem 16 14.08.15 15:33 Сейчас в теме
Я обычно так делаю:

		Сч = 0; 
		Пока Сч <   ТЗ.Количество() цикл 
			ТекСтр = ТЗ[Сч]; 
                   Если ТекСтр.ВашРеквизит = 0 тогда 
                           ТЗ.Удалить(Сч);
                   КонецЕсли; 
                 Сч = (Сч+1);

		КонецЦикла;
Показать
5. _HakerAlex_ 14.08.15 15:38 Сейчас в теме
(3) Serega-artem, забыли после удаления счетчик уменьшить на 1....
13. Serega-artem 16 14.08.15 19:48 Сейчас в теме
(5) _HakerAlex_, Упс, спасибо что подметили!

Можно во так вот:

        Сч = 0; 
        Пока Сч <   ТЗ.Количество() цикл 
            ТекСтр = ТЗ[Сч]; 
                   Если ТекСтр.ВашРеквизит = 0 тогда 
                           ТЗ.Удалить(Сч);
Иначе
                 Сч = (Сч+1);
                   КонецЕсли; 


        КонецЦикла;
Показать
4. _HakerAlex_ 14.08.15 15:37 Сейчас в теме
Это стандартная проблема обходить так таблицу значений нельзя. Потому что как при удалении строки счет сразу собъется

Стр=0;
		Пока Стр<ТаблицаЗначений.Количество() Цикл
			НашаСтрока=ТаблицаЗначений[Стр];
			Если НашаСтрока.Сумма=0 Тогда
                           ТаблицаЗначений.Удалить(НашаСтрока);
                           Стр=Стр-1;  
			КонецЕсли;
			Стр=Стр+1;
		КонецЦикла;
Показать
6. _HakerAlex_ 14.08.15 15:41 Сейчас в теме
Еще кстати можно поместить таблицу значений в запрос, отобрать необходимые строки и потом загрузить назад.
15. u_n_k_n_o_w_n 34 19.09.18 12:52 Сейчас в теме
(6) Если не структурированная ТЗ, то предложенный вами метод не работает.
7. andadra 14.08.15 15:53 Сейчас в теме
Вопрос РЕШЕН!!!!!!
Дело в том,что когда последняя строчка с количеством 0,то цикл идет дальше,и он выводит значение СЧ то какое было раньше!Решается все очень банально!Словом ПРОДОЛЖИТЬ!

НомСтроки = 0;

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

КонецЕсли;
НомСтроки = НомСтроки +1;
ОбластьСтроки.Параметры.Индекс = НомСтроки;
ТабличныйДокумент.Вывести(ОбластьСтроки);
КонецЦикла;
11. Dnki 4 14.08.15 17:25 Сейчас в теме
(7) andadra, Вроде верно. Я бы сделал замечания:
* Лучше сначала обработать таблицу, потом выводить. Так нагляднее.
* Ваш алгоритм верный, но сделает столько циклов по ТЗ, сколько нулевых строк. Если ТЗ большая, можно сэкономить так (циклов в несколько раз меньше):

ЕстьПустые = Истина;
Пока ЕстьПустые цикл
	ЕстьПустые = Ложь;
	Для Каждого Сч из ТаблицаЗапроса Цикл 
	Если Сч.Количество = 0 Тогда 
		ТаблицаЗапроса.Удалить(Сч); 
		ЕстьПустые = Истина;
	КонецЕсли;
	КонецЦикла; 
КонецЦикла; 
Показать
8. andadra 14.08.15 15:54 Сейчас в теме
как вы делаете надписи как в 1с?Подскажите пожалуйста,я тут новичок
10. ditp 91 14.08.15 15:57 Сейчас в теме
(8) andadra, выдели нужный фрагмент и нажми alt+p (или кнопочку над полем ввода)
9. ditp 91 14.08.15 15:56 Сейчас в теме
Ну или так:
м	= т.НайтиСтроки(новый Структура("ч", 0));
Для Каждого с Из м Цикл
	т.Удалить(с);
КонецЦикла;

12. CaptainMorgan 14.08.15 17:51 Сейчас в теме
Алгоритмы в один цикл:
1)
Перебор ТЗ0 в обратной последовательности. (уже предлагали)

2)
Создаешь новую ТЗ1
В цикле перебираешь ТЗ0 в любой последовательности и при выполнении условия копируешь строку в ТЗ1
За один проход создается требуетая таблица значений.
16. u_n_k_n_o_w_n 34 19.09.18 12:52 Сейчас в теме
(12) А не проще ли через НайтиСтроки выбрать необходимые строки и затем их просто удалить?
14. andadra 20.08.15 08:19 Сейчас в теме
17. wau8824ru 23 19.06.22 04:54 Сейчас в теме
Нужен был текст запроса в цикле, с переменными в параметрах запроса
Так работает, может пригодится
		Если ТЗ.Количество() > 0 Тогда
			Пока ТЗ.Количество() > 0 Цикл
				N = ТЗ.Количество()-1;//Индекс последней строки
				ВременнаяТЗ = Новый ТаблицаЗначений;
				ВременнаяТЗ = ТЗ.СкопироватьКолонки();
				МассивНоменклатураДатаЦеныПоДатаЦены = ТЗ.НайтиСтроки(Новый Структура("ДатаЦены", ТЗ[N].ДатаЦены));
				Для Каждого Элт Из МассивНоменклатураДатаЦеныПоДатаЦены Цикл
					НовСтр = ВременнаяТЗ.Добавить();
						НовСтр.Номенклатура = Элт.Номенклатура;
						НовСтр.ДатаЦены = Элт.ДатаЦены;
					ТЗ.Удалить(Элт);
				КонецЦикла;
				//	Копия Запрос.Текст, только:
				// в начало добавлено |ОБЪЕДИНИТЬ ВСЕ
				//&МассивНоменклатуры изменён на &МассивНоменклатуры"+N+"
				//&Дата изменён на &Дата"+N+"
				Запрос.УстановитьПараметр("МассивНоменклатуры"+N, ВременнаяТЗ.ВыгрузитьКолонку("Номенклатура"));
				Запрос.УстановитьПараметр("Дата"+N, ВременнаяТЗ[0].ДатаЦены);
				Запрос.Текст = Запрос.Текст + "
Показать
18. PlatonStepan 38 20.06.22 04:12 Сейчас в теме
19. wau8824ru 23 20.06.22 08:08 Сейчас в теме
(18) А чего страшного? Самый правильный подход в (2), только там примера нет, остальные варианты подходят только для перебора и удаления строки из ТЗ по 1шт, а в моём примере
НайтиСтроки(Новый Структура("ДатаЦены", ТЗ[N].ДатаЦены));
может выбрать все строки ТЗ за одну итерацию, после чего удалит все строки.
20. PlatonStepan 38 21.06.22 03:41 Сейчас в теме
(19)
Да просто фрагмент не причёсанный, разноязычный код, лишние условия и конструкции
22. wau8824ru 23 21.06.22 05:29 Сейчас в теме
(20)
Да просто фрагмент не причёсанный, разноязычный код, лишние условия и конструкции
Окей, вам виднее!
23. Alexponenta 21.06.22 16:30 Сейчас в теме
При удалении текущей строки, таблица смещается вверх, соответственно после удаления на место удаленной строки встает следующая, а проверяться будет уже следующая за той, которая встала на место удаленной
24. Xershi 1488 15.12.23 16:38 Сейчас в теме
КоличествоСтрок = НашаТаблица.Количество();
	
Для Счетчик = 1 По КоличествоСтрок Цикл
		
	Индекс = КоличествоСтрок - Счетчик;
		
	Строка = НашаТаблица.Получить(Индекс);		
		
	Если Строка.Удалить Тогда			
			
		НашаТаблица.Удалить(Строка);
				
	КонецЕсли;
		
КонецЦикла;	
Показать

Гугл спасет мир!
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот