Удаление строк табличной части по условию
По теме из базы знаний
- №10. Удаление строк табличной части (обычное приложение)
- Обработка редактирования или удаления строк таблиц объектов по условиям.
- ЗУП 3.1 Добавление вопроса перед удалением строк в документах "Индивидуальный график" и "Табель учета рабочего времени" БЕЗ ИЗМЕНЕНИЯ типовой конфигурации
- Универсальное заполнение табличных частей
- Дополнительные реквизиты табличной части документов без изменения хранения данных
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
В 2 цикла: в первом цикле получаешь список с номерами строк которые удовлетворяют твоему условию, потом сортируешь список по убыванию и вторым циклом получаешь номера строк из цикла и удаляешь их.
Процедура УдалитьЛишниеСтроки()
спиСтр = создатьобъект("списокзначений");
выбратьстроки();
пока получитьстроку() = 1 цикл
если ценасндс<100 тогда
спиСтр.добавитьзначение(номерстроки);
конецесли;
конеццикла;
спиСтр.сортировать(1);
для йй = 1 по СпиСтр.размерСписка() цикл
номстр = СпиСтр.получитьзначение(йй);
ПолучитьСтрокуПоНомеру(номстр);
удалитьстроку();
конеццикла;
КонецПроцедуры
Показать
(4) Зеленоград,
Показать кода какой?
всей формы?
ТЧ=СоздатьОбъект("ТаблицаЗначений");
ВыгрузитьТабличнуюЧасть(ТЧ);
ТЧ.ВыбратьСтроки();
Пока ТЧ.ПолучитьСтроку()=1 Цикл
Если ТЧ.КомплектПластикаНабора.Вид<>Пластик_кт Тогда
ТЧ.УдалитьСтроку();
КонецЕсли;
КонецЦикла;
УдалитьСтроки();
ЗагрузитьТабличнуюЧасть(ТЧ);
Показать кода какой?
всей формы?
ТЧ=СоздатьОбъект("ТаблицаЗначений");
ВыгрузитьТабличнуюЧасть(ТЧ);
ТЧ.ВыбратьСтроки();
Пока ТЧ.ПолучитьСтроку()=1 Цикл
Если ТЧ.КомплектПластикаНабора.Вид<>Пластик_кт Тогда
ТЧ.УдалитьСтроку();
КонецЕсли;
КонецЦикла;
УдалитьСтроки();
ЗагрузитьТабличнуюЧасть(ТЧ);
(5) Mars2006, теряешь позиционирование,
нужно по-другому
Пока ТЧ.ПолучитьСтроку()=1 Цикл
ТЧ.УдалитьСтроку();
нужно по-другому
Сч = 0;
Пока Сч < ТЗ.Количество() Цикл
СтрокаТЗ = ТЗ.Получить(Сч);
Если СтрокаТЗ.КомплектПластикаНабора.Вид<>Пластик_кт Тогда
ТЗ.Удалить(Сч);
Иначе
Сч = Сч + 1;
КонецЕсли;
КонецЦикла;
Показать
Юзай на здоровье!
Процедура НаложитьФильтр()
ИмяКолонки = ТЗЗаявки.ТекущаяКолонка();
ЗначениеФильтра = ТЗЗаявки.ПолучитьЗначение(ТЗЗаявки.ТекущаяСтрока(),ИмяКолонки);
ТЗЗаявки.ВыбратьСтроки();
Пока ТЗЗаявки.ПолучитьСтроку()=1 Цикл
Пока (ТЗЗаявки.ПолучитьЗначение(ТЗЗаявки.НомерСтроки,ИмяКолонки)<>ЗначениеФильтра)
и(ПустоеЗначение(ТЗЗаявки.ПолучитьЗначение(ТЗЗаявки.НомерСтроки,ИмяКолонки))=0) Цикл
ТЗЗаявки.УдалитьСтроку(); //следующая строка стала текущей
Если ТЗЗаявки.НомерСтроки = 0 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
ТекстФильтр = "ФИЛЬТР";
КонецПроцедуры // НаложитьФильтр
Показать
Да. Похоже текст из 8-ки. Может проще
ВыгрузитьТабличнуюЧасть(ТЧ);
ТЧ.ВыбратьСтроки();
УдалитьСтроки(); //очищаем табличную часть документа
Пока ТЧ.ПолучитьСтроку()=1 Цикл
Если ТЧ.КомплектПластикаНабора.Вид=Пластик_кт Тогда
//а здесь переносить в документ нужную строку
НоваяСтрока();
РеквизитДокумента=ТЧ.РеквизитДокумента;
...
КонецЕсли;
КонецЦикла;
Показать
Тема удаления строк что с таблицы значений, что с табл. части неделю назад обсуждалась, но не нашел.
Суть алгоритмов:
1) переписать во временную нужные строки, потом вернуть в документ
2) удалять строки циклом с конца.
Суть алгоритмов:
1) переписать во временную нужные строки, потом вернуть в документ
2) удалять строки циклом с конца.
(17) sanek_kop,
<троллинг ON>
Ну... Эта "школьная задачка" проста только в школьной абстрактно-теоретической формулировке. На сообразительность.
Задача удаления строк из таблицы попроще и имеет меньше подводных камней :)
<троллинг ON>
Это школьная задачка, как замена двух переменных без использования третей
Ну... Эта "школьная задачка" проста только в школьной абстрактно-теоретической формулировке. На сообразительность.
Задача удаления строк из таблицы попроще и имеет меньше подводных камней :)
(13) это не программисты
Это какие-то грабители корованов
Я понимаю когда находишься в идейном тупняке и не можешь найти и просишь подсказку
Но когда полностью отсутствует абстрактное мышление и способность проиграть на примерах - это клиника, окостенение мозга, лечится трудно и длительно
Да и то только при горячем содействии самого болящего
Это какие-то грабители корованов
Я понимаю когда находишься в идейном тупняке и не можешь найти и просишь подсказку
Но когда полностью отсутствует абстрактное мышление и способность проиграть на примерах - это клиника, окостенение мозга, лечится трудно и длительно
Да и то только при горячем содействии самого болящего
пытаюсь удалить строки с конца
Сч = КоличествоСтрок();
Пока Сч > 0 Цикл
// СтрокаТЗ = ТЧ.ПолучитьЗначение(Сч);
АктивизироватьСтроку(Сч);
Если КомплектПластикаНабора.Вид<>Пластик_кт Тогда
УдалитьСтроку();
КонецЕсли;
Сч = Сч - 1;
КонецЦикла;
не работает активизироватьстроку
Сч = КоличествоСтрок();
Пока Сч > 0 Цикл
// СтрокаТЗ = ТЧ.ПолучитьЗначение(Сч);
АктивизироватьСтроку(Сч);
Если КомплектПластикаНабора.Вид<>Пластик_кт Тогда
УдалитьСтроку();
КонецЕсли;
Сч = Сч - 1;
КонецЦикла;
не работает активизироватьстроку
Удалять строки из таблицы лучше не стоит. Для этих целей, как говорилось выше, лучше переносить данные в другую таблицу и ее потом уже загружать. На больших объемах таблицы будет значительно быстрее. Да и код будет более "читабельный".
Не работает, потому что после удаления строки выборка нарушается.
Общий алгоритм таков :
Док.ВыбратьСтроки();
пока Док.ПолучитьСтроку()=1
Цикл
Если <условие>
Тогда
Док.УдалитьСтроку();
Док.ВыбратьСтроки(); //Вот эта строка важна ! Чтобы по-новой софрмировать выборку.
КонецЕсли;
КонецЦикла;
Общий алгоритм таков :
Док.ВыбратьСтроки();
пока Док.ПолучитьСтроку()=1
Цикл
Если <условие>
Тогда
Док.УдалитьСтроку();
Док.ВыбратьСтроки(); //Вот эта строка важна ! Чтобы по-новой софрмировать выборку.
КонецЕсли;
КонецЦикла;
(20) imax26, если строк не много то можно и каждый раз выбирать сначала, но лучше идти подряд но не терять позицию:
НомСтроки = 1;
Пока НомСтроки <= Док.КоличествоСтрок() Цикл
Док.ПолучитьСтрокуПоНомеру(НомСтроки);
Если <Условие> Тогда
Док.УдалитьСтроку();
Иначе
НомСтроки = НомСтроки + 1;
КонецЕсли;
Если НомСтроки > Док.КоличествоСтрок() Тогда //на тот случай, если удалили все строки
Прервать;
КонецЕсли;
КонецЦикла;
Показать
(23) kiser, (14) Mars2006, лучше действительно удалять строки с конца, чтобы не заморачиваться со сдвигом нумерации:
Проверено, работает.
НомСтроки = Док.КоличествоСтрок();
Пока НомСтроки > 0 Цикл
Док.ПолучитьСтрокуПоНомеру(НомСтроки);
Если <УСЛОВИЕ> Тогда
Док.УдалитьСтроку();
КонецЕсли;
НомСтроки = НомСтроки - 1;
КонецЦикла;
ПоказатьПроверено, работает.
(26)falcon, и, наверно, не проверяли? Работать будет так же некорректно, как и в (5) - потеря позиционирования. Дело в том, что с точки зрения позиционирования ТЗ.УдалитьСтроку() срабатывает так же, как и ТЗ.ПолучитьСтроку(), поэтому происходит пропуск непроверенных строк. (Так что, пожалуй, не стОит так категорично: (13) )
(31) falcon, если не дошло с первого раза, то дам подсказку. Ваш код (точнее даже не ваш) работает в определенных ограниченных условиях. Следовательно такой код не стабилен. Использовать не стабильный код не желательно. Тем более когда есть хороший стабильный проверенный временем (обход таблицы с конца).
Завязывайте с программированием.
Завязывайте с программированием.
(35) falcon, Вопрос не в том, что код работает, а в том, что он - плохое решение. Он пользуется нигде не документированными особенностями работы выборки из таблицы значений. Ладно в 7.7, когда платформа уже умерла и не развивается. Есть надежда, что подобный код будет работать на любой базе 7.7. Хотя, боюсь, ни кто не даст гарантии работоспособности подобного кода, если вдруг встретится что-то архаичное типа 19 релиза платформы.
Подобный код является ненадёжным, плохо читаемым и, соответственно, не рекомендуемым к использованию.
Если бы я увидел подобное извращение на 1с8, сразу бы канделябром по пальцам. Потому что ни кто не может обещать, что подобные извраты не приведут к глюкам на какой-нибудь версии платформы 8.3.8.
И даже касательно 7.7. Например. Вот вы сделали подобный код. Он часть какой-нибудь процедуры. Много развивался, дополнялся. И в один прекрасный момент в процедуру кроме стандартных таблиц значений стало можно передавать индексированную таблицу. Со всеми её наворотами - индексами, фильтрами... Вы уверены, что не словите труднодиагностируемых проблем?
Подобный код является ненадёжным, плохо читаемым и, соответственно, не рекомендуемым к использованию.
Если бы я увидел подобное извращение на 1с8, сразу бы канделябром по пальцам. Потому что ни кто не может обещать, что подобные извраты не приведут к глюкам на какой-нибудь версии платформы 8.3.8.
И даже касательно 7.7. Например. Вот вы сделали подобный код. Он часть какой-нибудь процедуры. Много развивался, дополнялся. И в один прекрасный момент в процедуру кроме стандартных таблиц значений стало можно передавать индексированную таблицу. Со всеми её наворотами - индексами, фильтрами... Вы уверены, что не словите труднодиагностируемых проблем?
(36) vcv,
давай не передергивай, спор всего лишь про то, работает код в (26) или нет, два "специалиста" утверждают, что - нет, я утверждаю что вполне работает, просто у них кривые руки адаптировать этот код под себя
вопрос где, кто и как его использует - зависит от контекста задачи и никак не влияет на его работоспособность.
и это далеко не единственный вариант удаления строк по условию....
давай не передергивай, спор всего лишь про то, работает код в (26) или нет, два "специалиста" утверждают, что - нет, я утверждаю что вполне работает, просто у них кривые руки адаптировать этот код под себя
вопрос где, кто и как его использует - зависит от контекста задачи и никак не влияет на его работоспособность.
и это далеко не единственный вариант удаления строк по условию....
(37) подсказчик, если руки кривые не позорься...
какие там еще у тебя условия не получается сделать? говорю же... не в коде дело, а в том, кто его использует...
Было:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Удаляем все кроме кратных 6 И 7
6
7
12
14
18
21
24
28
30
Показатькакие там еще у тебя условия не получается сделать? говорю же... не в коде дело, а в том, кто его использует...
(39) falcon,
Намекнули же в (30). Если в фильтрации строк присутствует условие от ТЗ.НомерСтроки. При удалении сначала в конец номера строк меняются. Пример вполне реальный. У меня, например, в конфигурации есть таблица значений при приходовании ТМЦ с доп.расходами. Там в каждой нечетной строке ТМЦ, а в каждой четной - сумма доп.расходов на неё.
какие там еще у тебя условия не получается сделать
Намекнули же в (30). Если в фильтрации строк присутствует условие от ТЗ.НомерСтроки. При удалении сначала в конец номера строк меняются. Пример вполне реальный. У меня, например, в конфигурации есть таблица значений при приходовании ТМЦ с доп.расходами. Там в каждой нечетной строке ТМЦ, а в каждой четной - сумма доп.расходов на неё.
(40) во первых в (30) нет никаких намеков на НомерСтроки, есть просто неумение воткнуть нужное условие в правильное место, не более того...
во вторых, ты не поверишь и твой вопрос вполне решается кодом из (26) т.к. все приведенные тут примеры, никаким боком не относятся к коду из (26), вы зацикливаетесь на каких то бредовых комбинациях условий, при этом абсолютно не отдавая себе отчет, в том, что смысл не в условии, любое условие из обратного перебора, с легкостью ляжет на код из (26), т.к. задача условия вернуть Истина/ложь и плевать по какому алгоритму оно будет получаться....
печально то, что такие элементарные вещи нужно разжевывать до нЕльзя
И уже ни в какие ворота ни лезет, выкрики некоторых "специалистов", которые из шаблона:
рожают:
с пеной у рта доказывая, что шаблон не верный )))
во вторых, ты не поверишь и твой вопрос вполне решается кодом из (26) т.к. все приведенные тут примеры, никаким боком не относятся к коду из (26), вы зацикливаетесь на каких то бредовых комбинациях условий, при этом абсолютно не отдавая себе отчет, в том, что смысл не в условии, любое условие из обратного перебора, с легкостью ляжет на код из (26), т.к. задача условия вернуть Истина/ложь и плевать по какому алгоритму оно будет получаться....
печально то, что такие элементарные вещи нужно разжевывать до нЕльзя
И уже ни в какие ворота ни лезет, выкрики некоторых "специалистов", которые из шаблона:
Пока (<условие>) и (ТЗ.НомерСтроки<>0) Цикл
рожают:
Пока ((Условие = ТЗ.Номер/2) и (ТЗ.НомерСтроки<>0)) Или (ТЗ.Номер = 5) Цикл
с пеной у рта доказывая, что шаблон не верный )))
(41) falcon, Предположим, что условие удаления выглядит так:
При обратном переборе понятие четная/нечетная строка, определяемая условием (ТЗ.НомерСтроки % 2 = 0) работает корректно. При прямом переборе оно будет работать с ошибками.
И хорошо, если цикл удаления строк компактен, и его, в случае чего, успешно перепишут. А если он на экран не влазит, да еще код не ваш? Когда заметите проблему?
Код в (26) плохой. Не потому что работает или не работает. Когда код плох, неважно, что он работает, его нужно пустить под реинжиниринг. И не надо подобное советовать в форумах. Не нужно учить людей плохому.
Если (ТЗ.Сумма < 0) И (ТЗ.НомерСтроки % 2 = 0) Тогда
При обратном переборе понятие четная/нечетная строка, определяемая условием (ТЗ.НомерСтроки % 2 = 0) работает корректно. При прямом переборе оно будет работать с ошибками.
И хорошо, если цикл удаления строк компактен, и его, в случае чего, успешно перепишут. А если он на экран не влазит, да еще код не ваш? Когда заметите проблему?
Код в (26) плохой. Не потому что работает или не работает. Когда код плох, неважно, что он работает, его нужно пустить под реинжиниринг. И не надо подобное советовать в форумах. Не нужно учить людей плохому.
(39) falcon, где код? Хотя и так понятно, что использовали колонку номер. Но ее нет в реальной таблице. Это называется костыль. Мало того, нужен еще один костыль, чтоб удалить не нужную колонку. В общем ваш уровень программирования и так понятен.
Я бы еще понял, если бы этот код значительно оптимизировал выполнение, но он же еще более затратный.
Я бы еще понял, если бы этот код значительно оптимизировал выполнение, но он же еще более затратный.
(48) и снова пук в лужу...
Использовать в условии номерстроки это к vcv я такими вещами не пользуюсь.
Даже после того как тебя ткнули носом в твою ошибку ты, вместо того, чтобы понять свою ошибку исправит ее и убедиться, что не прав, продолжаешь как баран гнуть свою линию.... показательно....
Использовать в условии номерстроки это к vcv я такими вещами не пользуюсь.
Даже после того как тебя ткнули носом в твою ошибку ты, вместо того, чтобы понять свою ошибку исправит ее и убедиться, что не прав, продолжаешь как баран гнуть свою линию.... показательно....
(50) ого.... ты это "все" что-ли? не льсти себе )))
кода не будет, ибо во-первых, шаблон кода указан в (26), любой более-менее грамотный специалист на основе его создаст нужный ему код, я тебе даже больше скажу, код из (26) почти 1 в 1 как у меня в обработке, отличается только вот этим: "<условие>"
во-вторых тебе несколько раз указали на твою ошибку, если тебе не хватает ума понять, что надо исправить, чем тебе поможет мой код? исправь свою ошибку и мой код не нужен будет ибо твой заработает, но для этого надо руки прямые и голову на плечах иметь....
кода не будет, ибо во-первых, шаблон кода указан в (26), любой более-менее грамотный специалист на основе его создаст нужный ему код, я тебе даже больше скажу, код из (26) почти 1 в 1 как у меня в обработке, отличается только вот этим: "<условие>"
во-вторых тебе несколько раз указали на твою ошибку, если тебе не хватает ума понять, что надо исправить, чем тебе поможет мой код? исправь свою ошибку и мой код не нужен будет ибо твой заработает, но для этого надо руки прямые и голову на плечах иметь....
(28) falcon, очень опрометчиво.
Что бы не быть голословным:
Вот листинг результата:
Что бы не быть голословным:
ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("Номер");
Для ш=1 По 10 Цикл
ТЗ.НоваяСтрока();
ТЗ.Номер = ш;
КонецЦикла;
ТЗ.Выбратьстроки();
Пока ТЗ.ПолучитьСтроку()=1 Цикл
Условие = Цел(ТЗ.Номер/2);
Пока ((Условие = ТЗ.Номер/2) и (ТЗ.НомерСтроки<>0)) Или (ТЗ.Номер = 5) Цикл
ТЗ.УдалитьСтроку();
КонецЦикла;
КонецЦикла;
ТЗ.Выбратьстроки();
Пока ТЗ.ПолучитьСтроку() = 1 Цикл
Сообщить("Номер = "+ТЗ.Номер);
КонецЦикла;
ПоказатьВот листинг результата:
Номер = 1
Номер = 3
Номер = 6
Номер = 7
Номер = 9
В (30) неправильно записано условие, вместо:
надо писать:
а еще лучше проверку на четность записать как (ТЗ.Номер%2 = 0)
Условие = Цел(ТЗ.Номер/2);
Пока ((Условие = ТЗ.Номер/2) и (ТЗ.НомерСтроки<>0)) Или (ТЗ.Номер = 5) Цикл
надо писать:
Пока ((Цел(ТЗ.Номер/2) = ТЗ.Номер/2) и (ТЗ.НомерСтроки<>0)) Или (ТЗ.Номер = 5) Цикл
а еще лучше проверку на четность записать как (ТЗ.Номер%2 = 0)
Мое мнение: возможно, код в (26) и 100% рабочий. То есть, работает при любых условиях, что не проверено.
Возможно, что нерабочий - т.е. можно найти условие, при котором он сработает некорректно. Что пока не доказано.
Но в любом случае, код непрозрачный, и программиста, который любит "украшать" свои творения такими перлами, лучше гнать из команды ссаной тряпкой. Ибо случись что - найдется ли еще хоть один умелец, способный разгребать такой геникод?
Так что "просто бизнес, ничего личного", пусть идет и основывает свою собственную фирму, "FalconSoft" какой-нить. Взлетит - снимем шляпы, нет - пусть возвращается на зарплату, сменив стиль программирования.
Возможно, что нерабочий - т.е. можно найти условие, при котором он сработает некорректно. Что пока не доказано.
Но в любом случае, код непрозрачный, и программиста, который любит "украшать" свои творения такими перлами, лучше гнать из команды ссаной тряпкой. Ибо случись что - найдется ли еще хоть один умелец, способный разгребать такой геникод?
Так что "просто бизнес, ничего личного", пусть идет и основывает свою собственную фирму, "FalconSoft" какой-нить. Взлетит - снимем шляпы, нет - пусть возвращается на зарплату, сменив стиль программирования.
впишу и свои 5коп
всегда при удалении строк таблицы значений делал перезапись НУЖНЫХ элементов в другую таблицу значений
и нагляднее и видно что было и что стало.
ну и контрольки можно делать по количеству записей и суммы ДО и ПОСЛЕ
всегда при удалении строк таблицы значений делал перезапись НУЖНЫХ элементов в другую таблицу значений
и нагляднее и видно что было и что стало.
ну и контрольки можно делать по количеству записей и суммы ДО и ПОСЛЕ
Вот так прекрасно работает
тблЗнач.ВыбратьСтроки();
Пока тблЗнач.ПолучитьСтроку() = 1 Цикл
Пока НЕ (<Условие>) Цикл
тблЗнач.УдалитьСтроку();
Если тблЗнач.НомерСтроки = 0 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Показать
(62) botman4, Смахивает, но, как говорится, есть нюанс.
Вторая часть условия не имеет смысла, поскольку условие накладывается на значение из строки. При НомерСтроки = 0, то есть при отсутствии позиционирования, проверка условия сразу даст исключение. Так что такая конструкция сбойнет, если придется удалить последнюю строку таблицы.
Пока (<условие>) и (ТЗ.НомерСтроки<>0) Цикл
Вторая часть условия не имеет смысла, поскольку условие накладывается на значение из строки. При НомерСтроки = 0, то есть при отсутствии позиционирования, проверка условия сразу даст исключение. Так что такая конструкция сбойнет, если придется удалить последнюю строку таблицы.
(63) PythonJ,
откуда же вы такие специалисты беретесь.....
При НомерСтроки = 0, то есть при отсутствии позиционирования, проверка условия сразу дастисключение ЛОЖЬ, т.к. 0 <> 0 - есть ложь.
и ес-сно такая конструкция не сбойнет при удалении любой строки, в том числе и последней.
откуда же вы такие специалисты беретесь.....
При НомерСтроки = 0, то есть при отсутствии позиционирования, проверка условия сразу даст
и ес-сно такая конструкция не сбойнет при удалении любой строки, в том числе и последней.
Давно сталкивался с такой задачей, в прочих языках программирования есть оператор Downto. а в 1С 7.7 возможно два варианта:
КолВо = КоличествоСтрок();
Для Н=-КолВо по -1 цикл
ПолучитьСтрокуПоНомеру(-Н);
Если <Условие> тогда
УдалитьСтроку();
КонецЕсли;
КонецЦикла;
////********Второй вариант*************************
КолВо = КоличествоСтрок();
Для Н=0 по КолВо-1 Цикл
ПолучитьСтрокуПоНомеру(КолВо-Н);
Если <Условие> тогда
УдалитьСтроку();
КонецЕсли;
КонецЦикла;
Т.е. перебираем строки от последней к первой, и удаляем в этом же порядке.
КолВо = КоличествоСтрок();
Для Н=-КолВо по -1 цикл
ПолучитьСтрокуПоНомеру(-Н);
Если <Условие> тогда
УдалитьСтроку();
КонецЕсли;
КонецЦикла;
////********Второй вариант*************************
КолВо = КоличествоСтрок();
Для Н=0 по КолВо-1 Цикл
ПолучитьСтрокуПоНомеру(КолВо-Н);
Если <Условие> тогда
УдалитьСтроку();
КонецЕсли;
КонецЦикла;
Т.е. перебираем строки от последней к первой, и удаляем в этом же порядке.
Если нужно удалить строки в Документе "Операция" (по пределенному счету):
СтрокиС_МЦ = ХозрасчетныйНаборЗаписей.НайтиСтроки(Новый Структура("СчетДт",ПланыСчетов.Хозрасчетный.НайтиПоКоду("МЦ.02")));
Для каждого СтрокаТаблицы Из СтрокиС_МЦ Цикл
ХозрасчетныйНаборЗаписей.Удалить(СтрокаТаблицы);
КонецЦикла;
А я как-то давно уже подобные задачи(удаление строк из таблицы по условию) решаю через:
Если напрямую, найти значение в ТЗ нельзя, а нужно проверять какое-то условие, возможно по нескольким колонкам, то сначала добавляю в ТЗ колонку, числовую, в которую в цикле(ВыбратьСтроки(), ПолучитьСтроку()), по условию, добавляю единичку, если условие соблюдается, или оставляю ноль, если нет. Потом, в цикле удаления строк(Пока НайтиЗначение(****) = 1 Цикл), уже ищу значение 1, по добавленной колонке, и удаляю все строки, в которых единичка находятся.
Немного через "Ж", но выборка при удалении строк не сбивается, так, как она просто не используется, работает на 100%
Стр = "";
Пока ТЗ.НайтиЗначение(<Искомое значение>, Стр, <Колонка таблицы, по которой ищем>) = 1 Цикл
ТЗ.УдалитьСтроку(Стр);
Стр = "";
КонецЦикла;
Если напрямую, найти значение в ТЗ нельзя, а нужно проверять какое-то условие, возможно по нескольким колонкам, то сначала добавляю в ТЗ колонку, числовую, в которую в цикле(ВыбратьСтроки(), ПолучитьСтроку()), по условию, добавляю единичку, если условие соблюдается, или оставляю ноль, если нет. Потом, в цикле удаления строк(Пока НайтиЗначение(****) = 1 Цикл), уже ищу значение 1, по добавленной колонке, и удаляю все строки, в которых единичка находятся.
Немного через "Ж", но выборка при удалении строк не сбивается, так, как она просто не используется, работает на 100%
(75)
если "очень ресурсоемкая операция" смотрите в сторону:
- индексированных таблиц
- 1скулайт
- эскуэл
- др. бд
- пр.
инструмент зависим от задачи; для 7.7 инструментов, - вагон и прицеп с тележкой
ТЗ.УдалитьСтроку(Стр); - очень ресурсоемкая операция.
- каждый.. как умеет.
если "очень ресурсоемкая операция" смотрите в сторону:
- индексированных таблиц
- 1скулайт
- эскуэл
- др. бд
- пр.
инструмент зависим от задачи; для 7.7 инструментов, - вагон и прицеп с тележкой
Процедура УдалитьСовпадающие()
ТЗн = СоздатьОбъект("ТаблицаЗначений");
ВыгрузитьТабличнуюЧасть(ТЗн);
КС = ТЗн.КоличествоСтрок();
НС = 1;
Пока НС <= КС Цикл
ТЗн.ПолучитьСтрокуПоНомеру(НС);
Если ТЗн.ПргОст = ТЗн.ИнвОст Тогда
ТЗн.УдалитьСтроку(НС); КС = ТЗн.КоличествоСтрок();
Иначе
НС = НС + 1;
КонецЕсли;
КонецЦикла;
ЗагрузитьТабличнуюЧасть(ТЗн);
КонецПроцедуры
Показать
Здравствуйте, решили свою задачу? У меня есть похожий алгоритм заполнения по минимальному остатку на конкретный розничный склад. Если количество товара равно остатку или больше, то из такая строка удаляется из ТЧ документа. Если не равно, то дополнится количеством. Если интересно, могу скинуть, сами разберётесь
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот