Удаление пустых строк табличной части
По теме из базы знаний
- "Расширяемые" регистры и табличные части
- Коллекция Заполнялок табличных частей и Печатных форм (для УТ 10.3 и т.п.)
- Доработка функции ОбщегоНазначения.ЗаменитьСсылки для автоматической чистки или свёртки табличных частей
- Дополнительные реквизиты табличной части документов без изменения хранения данных
- Неограниченное количество строк в табличной части документа
Найденные решения
Еще со времен 7.7 я всегда удалял пустые строки перебором с конца. Тогда за один цикл все удаляются.
&НаКлиенте
Процедура УдалитьПустые(Команда)
Сч = Объект.Контрагенты.Количество();
Пока Сч > 0 Цикл
Сч = Сч - 1;
Строка = Объект.Контрагенты[сч];
Если НЕ ЗначениеЗаполнено(Строка.Контрагент) Тогда
Объект.Контрагенты.Удалить(Сч);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
ПоказатьОстальные ответы
В избранное
Подписаться на ответы
Сортировка:
Древо развёрнутое
Свернуть все
(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(НоваяСтрока.Количество, "");
НоваяСтрока.Контрагент = Сред(ДанныеСтроки[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(НоваяСтрока.Количество, "");
(1)Шивт +Стрлка вниз по ненужным строкам и делите;)
А программно, На сервере Приблизительно так
ТЧ это фамилия такая, моя. Подставьте свою
А программно, На сервере Приблизительно так
Строки = ТЧ.НайтиСтроки(Новый Структура("Контрагент,Количество,Сумма", Справочники.Контрагенты.ПустаяСсылка,0,0));
Для каждого текстр из Строки Цикл
Тч.Удалить(Текстр);
КонецЦикла
ТЧ это фамилия такая, моя. Подставьте свою
(5) неправильно.
при удалении строки сдвинутся и не все будут удалены.
Алгоритм такой:
1. Перебираете табличную часть, строки с незаполненным контрагентом пишете в массив
2. Перебираете массив и удаляете строку из табличной части по строке массива.
вот в этом случае будет удалено все.
при удалении строки сдвинутся и не все будут удалены.
Алгоритм такой:
1. Перебираете табличную часть, строки с незаполненным контрагентом пишете в массив
2. Перебираете массив и удаляете строку из табличной части по строке массива.
вот в этом случае будет удалено все.
МассивОтмененныхСтрок = ТЧ.НайтиСтроки(Новый Структура("Контрагент,Количество,Сумма", Справочники.Контрагенты.ПустаяСсылка,0,0));
Для Каждого СтрокаМассивОтмененныхСтрок Из МассивОтмененныхСтрок Цикл
ТЧ.Удалить(СтрокаМассивОтмененныхСтрок);
КонецЦикла;
Для Каждого СтрокаМассивОтмененныхСтрок Из МассивОтмененныхСтрок Цикл
ТЧ.Удалить(СтрокаМассивОтмененныхСтрок);
КонецЦикла;
(7)Сами Вы минус;)
Вот правильно
Это я еще за кофе не сгонял
Но (8) первым догадался, где косяк
Вот правильно
Строки = ТЧ.НайтиСтроки(Новый Структура("Контрагент,Количество,Сумма", Справочники.Контрагенты.ПустаяСсылка,0,0));
Пока Строки.Количество() Цикл
Тч.Удалить(Строки[0]);
КонецЦикла:
Это я еще за кофе не сгонял
Но (8) первым догадался, где косяк
Еще со времен 7.7 я всегда удалял пустые строки перебором с конца. Тогда за один цикл все удаляются.
&НаКлиенте
Процедура УдалитьПустые(Команда)
Сч = Объект.Контрагенты.Количество();
Пока Сч > 0 Цикл
Сч = Сч - 1;
Строка = Объект.Контрагенты[сч];
Если НЕ ЗначениеЗаполнено(Строка.Контрагент) Тогда
Объект.Контрагенты.Удалить(Сч);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Показать
Создай подписку на событие "ПередЗаписью", добавь туда все доки с табличными частями, а в обработчик помести вот это:
Процедура ОчиститьПустыеСтрокиВТабличнойЧастиОбъекта(Источник) Экспорт
Мета = Метаданные.НайтиПоТипу(ТипЗнч(Источник.Ссылка));
Для Каждого СтрТаб Из Мета.ТабличныеЧасти Цикл
Таб = Источник[СтрТаб.Имя];
Если Таб.Количество() > 0 Тогда
МасСтрок = Новый СписокЗначений;
Для Индекс = 0 По Таб.Количество() - 1 Цикл
Стр = Таб[Индекс];
Эл = Стр[СтрТаб.Реквизиты[0].Имя];
Если НЕ ЗначениеЗаполнено(Эл) Тогда
МасСтрок.Добавить(Стр.НомерСтроки);
КонецЕсли;
КонецЦикла;
МасСтрок.СортироватьПоЗначению(НаправлениеСортировки.Убыв);
Для Каждого НомерСтр Из МасСтрок Цикл
Для Каждого СтрТ Из Таб Цикл
Если СтрТ.НомерСтроки = НомерСтр.Значение Тогда
Таб.Удалить(СтрТ);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Показать
(20) чего то тут не хватает)
Для Каждого СтрТаб Из Мета.ТабличныеЧасти Цикл
Таб = Объект_Документ_Справочник[СтрТаб.Имя];
Если Таб.Количество() > 0 Тогда
МасСтрок = Новый СписокЗначений;
Для Индекс = 0 По Таб.Количество() - 1 Цикл
Стр = Таб[Индекс];
//Например этого
ЕстьРеквизитНезаполнен=Ложь;
Для Каждого СтрРек из СтрТаб.Реквизиты Цикл
Эл = Стр[СтрРек.Имя];
Если Строка(СтрРек.ПроверкаЗаполнения)="Выдавать ошибку" тогда
Если Строка(СтрРек.Тип)<>"Номенклатура" тогда
Если НЕ ЗначениеЗаполнено(Эл) Тогда
ЕстьРеквизитНезаполнен=Истина;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если ЕстьРеквизитНезаполнен тогда
МасСтрок.Добавить(Стр.НомерСтроки);
КонецЕсли;
//Например этого
КонецЦикла;
МасСтрок.СортироватьПоЗначению(НаправлениеСортировки.Убыв);
Для Каждого НомерСтр Из МасСтрок Цикл
Для Каждого СтрТ Из Таб Цикл
Если СтрТ.НомерСтроки = НомерСтр.Значение Тогда
Таб.Удалить(СтрТ);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Показать
Вакансии
Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)