Удаление пустых строк табличной части

1. Terebinator 14.05.19 11:02 Сейчас в теме
Добрый день. Подскажите юному начинающему программисту.
Как удалить пустые строки табличной части?
БП3.0
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
19. Vlan 36 16.05.19 09:18 Сейчас в теме
Еще со времен 7.7 я всегда удалял пустые строки перебором с конца. Тогда за один цикл все удаляются.
&НаКлиенте
Процедура УдалитьПустые(Команда)
	Сч = Объект.Контрагенты.Количество();
	Пока Сч > 0 Цикл
		Сч = Сч - 1;
		Строка = Объект.Контрагенты[сч];
		Если НЕ ЗначениеЗаполнено(Строка.Контрагент) Тогда
			Объект.Контрагенты.Удалить(Сч);
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры
Показать
Lllypuk; Ladoslav; SIrina9; VAAngelov; hellf; DoctorRoot; TVA_11; Terebinator; +8 Ответить
Остальные ответы
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. alex-l19041 8 14.05.19 11:07 Сейчас в теме
(1) код которым заполняются эти строки ?
4. Terebinator 14.05.19 11:12 Сейчас в теме
(2) НоваяСтрока = Объект.ДанныеТО.Добавить();
НоваяСтрока.Контрагент = Сред(ДанныеСтроки[0], Найти(ДанныеСтроки[0], "\")+1);
НоваяСтрока.Контрагент = Сред(НоваяСтрока.Контрагент, Найти(НоваяСтрока.Контрагент, "\")+1);
НоваяСтрока.Контрагент = Сред(НоваяСтрока.Контрагент, Найти(НоваяСтрока.Контрагент, "\")+1);
НоваяСтрока.Контрагент = Лев(НоваяСтрока.Контрагент, СтрНайти(НоваяСтрока.Контрагент, "\", НаправлениеПоиска.СКонца)-1);
НоваяСтрока.Сумма = ДанныеСтроки[0];
НоваяСтрока.Количество = Сред(ДанныеСтроки[0], Найти(ДанныеСтроки[0], " (")+2);
НоваяСтрока.Количество = Лев(НоваяСтрока.Количество, СтрНайти(НоваяСтрока.Количество, ")", НаправлениеПоиска.СКонца)-1);

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.IgnoreCase = Истина; //Игнорировать регистр
RegExp.Global = Истина; //Поиск всех вхождений шаблона
RegExp.MultiLine = Истина; //Многострочный режим

RegExp.Pattern = "[^0-9]"; // отбор только чисел
НоваяСтрока.Количество = RegExp.Replace(НоваяСтрока.Количество, "");
11. alex-l19041 8 14.05.19 11:22 Сейчас в теме
(4) НоваяСтрока = Объект.ДанныеТО.Добавить() надо делать после того как
Контрагент = Сред(ДанныеСтроки[0], Найти(ДанныеСтроки[0], "\")+1) вернет не пустое значение
12. catena 110 14.05.19 11:24 Сейчас в теме
+(11), я тоже за то, чтобы не добавлять что-нибудь ненужное, а не удалять
5. tusv 211 14.05.19 11:12 Сейчас в теме
(1)Шивт +Стрлка вниз по ненужным строкам и делите;)
А программно, На сервере Приблизительно так
Строки = ТЧ.НайтиСтроки(Новый Структура("Контрагент,Количество,Сумма", Справочники.Контрагенты.ПустаяСсылка,0,0));
Для каждого текстр из Строки Цикл
   Тч.Удалить(Текстр);
КонецЦикла

ТЧ это фамилия такая, моя. Подставьте свою
6. dchumak 42 14.05.19 11:13 Сейчас в теме
(5) неправильно.
при удалении строки сдвинутся и не все будут удалены.
Алгоритм такой:
1. Перебираете табличную часть, строки с незаполненным контрагентом пишете в массив
2. Перебираете массив и удаляете строку из табличной части по строке массива.
вот в этом случае будет удалено все.
9. tusv 211 14.05.19 11:20 Сейчас в теме
(6)Кофе в доме закончился. Ужос. А пока иду за допингом жду Вас Здесь.
Минус тоже результат. Не в обиде
VladimirElohov; +1 Ответить
8. catena 110 14.05.19 11:19 Сейчас в теме
(5)(7) Только судя по коду у него Контрагент - строка)) И Количество, похоже, тоже.
10. Terebinator 14.05.19 11:22 Сейчас в теме
(8)верно. все строка. иначе никак) работа со строкой.
3. catena 110 14.05.19 11:08 Сейчас в теме
Юный начинающий ждет готовый код или готов искать от подсказки?

Выгрузить в ТЗ, найти строки, удалить, загрузить в ТЧ.
7. dchumak 42 14.05.19 11:17 Сейчас в теме
МассивОтмененныхСтрок = ТЧ.НайтиСтроки(Новый Структура("Контрагент,Количество,Сумма", Справочники.Контрагенты.ПустаяСсылка,0,0));
Для Каждого СтрокаМассивОтмененныхСтрок Из МассивОтмененныхСтрок Цикл
ТЧ.Удалить(СтрокаМассивОтмененныхСтрок);
КонецЦикла;
13. tusv 211 14.05.19 11:25 Сейчас в теме
(7)Сами Вы минус;)
Вот правильно
Строки = ТЧ.НайтиСтроки(Новый Структура("Контрагент,Количество,Сумма", Справочники.Контрагенты.ПустаяСсылка,0,0));
Пока Строки.Количество() Цикл
   Тч.Удалить(Строки[0]);
КонецЦикла:

Это я еще за кофе не сгонял
Но (8) первым догадался, где косяк
14. catena 110 14.05.19 11:28 Сейчас в теме
(13)Кофе все-таки нужен)))
Terebinator; tusv; +2 Ответить
15. tusv 211 14.05.19 11:29 Сейчас в теме
(14)Не ну. Категоричный плюс;)
16. Terebinator 14.05.19 11:39 Сейчас в теме
(13)Контрагент не ссылка. а строка
17. tusv 211 14.05.19 12:03 Сейчас в теме
(16)Ну тады
Строки = ТЧ.НайтиСтроки(Новый Структура("Контрагент,Количество,Сумма","",0,0));
Пока Строки.Количество() Цикл
   Тч.Удалить(Строки[0]);
КонецЦикла:
18. Mar12 15.05.19 15:20 Сейчас в теме
CTRL+F
CTRL+A
DEL

Хороший программист = ленивый программист.
19. Vlan 36 16.05.19 09:18 Сейчас в теме
Еще со времен 7.7 я всегда удалял пустые строки перебором с конца. Тогда за один цикл все удаляются.
&НаКлиенте
Процедура УдалитьПустые(Команда)
	Сч = Объект.Контрагенты.Количество();
	Пока Сч > 0 Цикл
		Сч = Сч - 1;
		Строка = Объект.Контрагенты[сч];
		Если НЕ ЗначениеЗаполнено(Строка.Контрагент) Тогда
			Объект.Контрагенты.Удалить(Сч);
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры
Показать
Lllypuk; Ladoslav; SIrina9; VAAngelov; hellf; DoctorRoot; TVA_11; Terebinator; +8 Ответить
20. promogiantworm 17.04.20 17:12 Сейчас в теме
Создай подписку на событие "ПередЗаписью", добавь туда все доки с табличными частями, а в обработчик помести вот это:

Процедура ОчиститьПустыеСтрокиВТабличнойЧастиОбъекта(Источник) Экспорт
	
	Мета = Метаданные.НайтиПоТипу(ТипЗнч(Источник.Ссылка));
	Для Каждого СтрТаб Из Мета.ТабличныеЧасти Цикл
		Таб = Источник[СтрТаб.Имя];
		Если Таб.Количество() > 0 Тогда
			МасСтрок = Новый СписокЗначений;
			Для Индекс = 0 По Таб.Количество() - 1 Цикл
				Стр = Таб[Индекс];
				Эл = Стр[СтрТаб.Реквизиты[0].Имя];
				Если НЕ ЗначениеЗаполнено(Эл) Тогда
					МасСтрок.Добавить(Стр.НомерСтроки);
				КонецЕсли;
			КонецЦикла;
			МасСтрок.СортироватьПоЗначению(НаправлениеСортировки.Убыв);
			Для Каждого НомерСтр Из МасСтрок Цикл
				Для Каждого СтрТ Из Таб Цикл
					Если СтрТ.НомерСтроки = НомерСтр.Значение Тогда
						Таб.Удалить(СтрТ);
					КонецЕсли;
				КонецЦикла;
			КонецЦикла;
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры
Показать
21. yasar92 6 28.01.23 23:16 Сейчас в теме
(20) чего то тут не хватает)

Для Каждого СтрТаб Из Мета.ТабличныеЧасти Цикл
			Таб = Объект_Документ_Справочник[СтрТаб.Имя];
			Если Таб.Количество() > 0 Тогда
				МасСтрок = Новый СписокЗначений;
				Для Индекс = 0 По Таб.Количество() - 1 Цикл
					Стр = Таб[Индекс]; 
					
                                       //Например этого
					ЕстьРеквизитНезаполнен=Ложь;
					Для Каждого СтрРек из СтрТаб.Реквизиты Цикл 
						Эл = Стр[СтрРек.Имя];	
						Если Строка(СтрРек.ПроверкаЗаполнения)="Выдавать ошибку" тогда 
							Если Строка(СтрРек.Тип)<>"Номенклатура" тогда
								Если НЕ ЗначениеЗаполнено(Эл) Тогда
									 ЕстьРеквизитНезаполнен=Истина;
								КонецЕсли;    
							КонецЕсли;
						КонецЕсли;   
					КонецЦикла;
					
					Если ЕстьРеквизитНезаполнен тогда
						 МасСтрок.Добавить(Стр.НомерСтроки);
					КонецЕсли;
					 //Например этого
	
				КонецЦикла;
				МасСтрок.СортироватьПоЗначению(НаправлениеСортировки.Убыв);
				Для Каждого НомерСтр Из МасСтрок Цикл
					Для Каждого СтрТ Из Таб Цикл
						Если СтрТ.НомерСтроки = НомерСтр.Значение Тогда
							Таб.Удалить(СтрТ);
						КонецЕсли;
					КонецЦикла;
				КонецЦикла;
			КонецЕсли;
		КонецЦикла;
Показать
22. user1863362 29.01.23 00:32 Сейчас в теме
(21)Браво, некропостер. Три года ждал, чтобы своё прям при всех вывалить.
МасСтрок = Новый СписокЗначений;
По префиксу имени там массив, а по факту - список значений. Удивительно.
Оставьте свое сообщение

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