Добрый день. Подскажите юному начинающему программисту.
Как удалить пустые строки табличной части?
БП3.0
---
Еще со времен 7.7 я всегда удалял пустые строки перебором с конца. Тогда за один цикл все удаляются.

```1c
    &НаКлиенте
    Процедура УдалитьПустые(Команда)
    Сч = Объект.Контрагенты.Количество();
    Пока Сч > 0 Цикл
    Сч = Сч - 1;
    Строка = Объект.Контрагенты[сч];
    Если НЕ ЗначениеЗаполнено(Строка.Контрагент) Тогда
    Объект.Контрагенты.Удалить(Сч);
    КонецЕсли;
    КонецЦикла;
    КонецПроцедуры
```
---
код которым заполняются эти строки ?
---
НоваяСтрока = Объект.ДанныеТО.Добавить();
 НоваяСтрока.Контрагент = Сред(ДанныеСтроки[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(НоваяСтрока.Количество, "");
---
НоваяСтрока = Объект.ДанныеТО.Добавить() надо делать после того как
   Контрагент = Сред(ДанныеСтроки[0], Найти(ДанныеСтроки[0], "\")+1) вернет не пустое значение
---
+(11), я тоже за то, чтобы не добавлять что-нибудь ненужное, а не удалять
---
Шивт +Стрлка вниз по ненужным строкам и делите;)
А программно, На сервере Приблизительно так

```1c
    Строки = ТЧ.НайтиСтроки(Новый Структура("Контрагент,Количество,Сумма", Справочники.Контрагенты.ПустаяСсылка,0,0));
    Для каждого текстр из Строки Цикл
    Тч.Удалить(Текстр);
    КонецЦикла
```

ТЧ это фамилия такая, моя. Подставьте свою
---
неправильно.
при удалении строки сдвинутся и не все будут удалены.
Алгоритм такой:
1. Перебираете табличную часть, строки с незаполненным контрагентом пишете в массив
2. Перебираете массив и удаляете строку из табличной части по строке массива.
вот в этом случае будет удалено все.
---
Кофе в доме закончился. Ужос. А пока иду за допингом жду Вас Здесь.
Минус тоже результат. Не в обиде
---
(7) Только судя по коду у него Контрагент - строка)) И Количество, похоже, тоже.
---
верно. все строка. иначе никак) работа со строкой.
---
Юный начинающий ждет готовый код или готов искать от подсказки?

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

```1c
    Строки = ТЧ.НайтиСтроки(Новый Структура("Контрагент,Количество,Сумма", Справочники.Контрагенты.ПустаяСсылка,0,0));
    Пока Строки.Количество() Цикл
    Тч.Удалить(Строки[0]);
    КонецЦикла:
```

Это я еще за кофе не сгонял
Но (8) первым догадался, где косяк
---
Кофе все-таки нужен)))
---
Не ну. Категоричный плюс;)
---
Контрагент не ссылка. а строка
---
Ну тады

```1c
    Строки = ТЧ.НайтиСтроки(Новый Структура("Контрагент,Количество,Сумма",",0,0));
    Пока Строки.Количество() Цикл
    Тч.Удалить(Строки[0]);
    КонецЦикла:
```
---
CTRL+F
CTRL+A
DEL

Хороший программист = ленивый программист.
---
Еще со времен 7.7 я всегда удалял пустые строки перебором с конца. Тогда за один цикл все удаляются.

```1c
    &НаКлиенте
    Процедура УдалитьПустые(Команда)
    Сч = Объект.Контрагенты.Количество();
    Пока Сч > 0 Цикл
    Сч = Сч - 1;
    Строка = Объект.Контрагенты[сч];
    Если НЕ ЗначениеЗаполнено(Строка.Контрагент) Тогда
    Объект.Контрагенты.Удалить(Сч);
    КонецЕсли;
    КонецЦикла;
    КонецПроцедуры
```
---
Создай подписку на событие "ПередЗаписью", добавь туда все доки с табличными частями, а в обработчик помести вот это:

```1c
    Процедура ОчиститьПустыеСтрокиВТабличнойЧастиОбъекта(Источник) Экспорт

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

    КонецПроцедуры
```
---
чего то тут не хватает)

```1c
    Для Каждого СтрТаб Из Мета.ТабличныеЧасти Цикл
    Таб = Объект_Документ_Справочник[СтрТаб.Имя];
    Если Таб.Количество() > 0 Тогда
    МасСтрок = Новый СписокЗначений;
    Для Индекс = 0 По Таб.Количество() - 1 Цикл
    Стр = Таб[Индекс];

    //Например этого
    ЕстьРеквизитНезаполнен=Ложь;
    Для Каждого СтрРек из СтрТаб.Реквизиты Цикл
    Эл = Стр[СтрРек.Имя];
    Если Строка(СтрРек.ПроверкаЗаполнения)="Выдавать ошибку" тогда
    Если Строка(СтрРек.Тип)<>"Номенклатура" тогда
    Если НЕ ЗначениеЗаполнено(Эл) Тогда
    ЕстьРеквизитНезаполнен=Истина;
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;

    Если ЕстьРеквизитНезаполнен тогда
    МасСтрок.Добавить(Стр.НомерСтроки);
    КонецЕсли;
    //Например этого

    КонецЦикла;
    МасСтрок.СортироватьПоЗначению(НаправлениеСортировки.Убыв);
    Для Каждого НомерСтр Из МасСтрок Цикл
    Для Каждого СтрТ Из Таб Цикл
    Если СтрТ.НомерСтроки = НомерСтр.Значение Тогда
    Таб.Удалить(СтрТ);
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;
    КонецЕсли;
    КонецЦикла;
```
---
Браво, некропостер. Три года ждал, чтобы своё прям при всех вывалить.

```1c
    МасСтрок = Новый СписокЗначений;
```
По префиксу имени там массив, а по факту - список значений. Удивительно.