Удалить из дерева значений строки

1. sCHTASS 49 07.12.15 11:10 Сейчас в теме
Есть дерево значений, в ней есть колонка "Количество". Нужно удалить из этого дерева строки, у которых количество равно нулю.
Делаю так:

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


При выполнении этого кода очищается все дерево значений, хотя есть строки с ненулевым количеством. Подскажите, где я мог накосячить? PS Отладчиком пробовал пройти, но конфигуратор падает после 2-3 проходов по циклу.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
8. Xershi 1487 07.12.15 11:26 Сейчас в теме
(1) sCHTASS, нужно обходить последнюю группировку и из нее удалять. А так как вы это описали не мудрено, что вылетит в ошибку. Думаю это вы дерево просто разрушаете.
10. herfis 500 07.12.15 11:27 Сейчас в теме
Непонятно, почему все ветки удаляются (проще всего сразу глянуть, попадают ли корневые ветки в массив результатов поиска).
Но юзать исключения как часть алгоритма - моветон.
Я бы на рекурсию переписал. Там элементарно сделать, чтобы удаление само по себе начиналось с вложенных веток.
(8) Он контролируемо разрушает дерево.
11. Xershi 1487 07.12.15 11:30 Сейчас в теме
14. herfis 500 07.12.15 11:31 Сейчас в теме
(11) Xershi, Какой индекс? "СтрокаДереваЗначений" - это ссылка, а не индекс.
12. herfis 500 07.12.15 11:30 Сейчас в теме
(10) herfis, Хотя о чём это я? На рекурсии можно гораздо оптимально сделать - чтобы если удаляется корневая, вниз уже не идти.
13. sCHTASS 49 07.12.15 11:30 Сейчас в теме
(10) Пробовал с использованием рекурскии - очень медленно работает.
16. herfis 500 07.12.15 11:33 Сейчас в теме
(13) sCHTASS, А ты сделай, как я в (12) написал.
17. sCHTASS 49 07.12.15 11:35 Сейчас в теме
(16) Ну так я же говорил, что через рекурсию очень долго работает.
18. Xershi 1487 07.12.15 11:35 Сейчас в теме
2. spezc 783 07.12.15 11:14 Сейчас в теме
удалять нужно строки только низшего уровня?
3. sCHTASS 49 07.12.15 11:15 Сейчас в теме
(2) Все строки, где есть 0.
4. alljoke 07.12.15 11:17 Сейчас в теме
"но конфигуратор падает после 2-3 проходов по циклу." - это как понят???? Комп не ыдерживает такую простую оталдку?
А по теме - вы удаляете строки из массива, где нулевые позиции, равзе нет?
7. sCHTASS 49 07.12.15 11:22 Сейчас в теме
(4)
"но конфигуратор падает после 2-3 проходов по циклу." - это как понят????

Падает с ошибкой виндовой.

А по теме - вы удаляете строки из массива, где нулевые позиции, равзе нет?

Ну как бы из текста кода понятно, что нужно. Нужно убрать из дерева значений все строки с количеством, равным нулю.
5. alljoke 07.12.15 11:18 Сейчас в теме
"Для Каждого СтрокаДерева Из МассивСтрокКУдалению Цикл"
тут скорей всего надо так
"Для Каждого СтрокаДерева Из ДеревоОстатков Цикл"
6. spezc 783 07.12.15 11:19 Сейчас в теме
Посмотрите что напишет этот код
ОтборСтрокКУдалению  = Новый Структура("Количество", 0);
    МассивСтрокКУдалению = ДеревоОстатков.Строки.НайтиСтроки(ОтборСтрокКУдалению, Истина);
    Сообщить("Всего корневых строк: "+ДеревоОстатков.Строки.Количество);
    Для Каждого СтрокаДерева Из МассивСтрокКУдалению Цикл
        
        Попытка
            
            Если СтрокаДерева.Родитель = Неопределено Тогда
                   Сообщить("удаляется корневая строка дерева"); 
            КонецЕсли;
            СтрокиДерева = ?(СтрокаДерева.Родитель = Неопределено,
                                ДеревоОстатков.Строки,
                                СтрокаДерева.Родитель.Строки);
                                
            СтрокиДерева.Удалить(СтрокаДерева);
            
        Исключение
        КонецПопытки;
        
    КонецЦикла;
Показать
15. sCHTASS 49 07.12.15 11:32 Сейчас в теме
(6) Свалилось с ошибкой

Ошибка выполнения запроса
Ошибка при выполнении запроса POST к ресурсу /e1cib/logForm:
по причине:
server_addr=tcp://[xvap1c03]:2564 descr=Ошибка сетевого доступа к серверу
(Windows Sockets - 10054(0x00002746). Удаленный хост принудительно разорвал существующее подключение. ) line=1041 file=Src\DataExchangeTcpClientImpl.cpp
9. Xershi 1487 07.12.15 11:27 Сейчас в теме
И не забывать про то что когда удаляете строку индекс тоже смешается, поэтому лучше делать обратный обход.
19. alljoke 07.12.15 11:36 Сейчас в теме
МоёДрево.Строки - у вас удаляет все строки вашего дерева.
20. alljoke 07.12.15 11:36 Сейчас в теме
СтрокиДерева = ?(СтрокаДерева.Родитель = Неопределено,
ДеревоОстатков.Строки,
СтрокаДерева.Родитель.Строки); //вот здесь возвращает - ДеревоОстатков.Строки и удаляет все строки т.о.

СтрокиДерева.Удалить(СтрокаДерева);
23. sCHTASS 49 07.12.15 11:39 Сейчас в теме
(20) Это нужно, чтобы удалить "нулевую" строку верхнего уровня.
21. herfis 500 07.12.15 11:37 Сейчас в теме
Типа такого
Процедура УдалитьНулевыеВетки(Дерево)
   Для Каждого Строка Из Дерево.Строки Цикл
      Если Строка.Количество = 0 Тогда
         Дерево.Строки.Удалить(Строка);
      Иначе
         УдалитьНулевыеВетки(Строка);
      КонецЕсли;
   КонецЦикла;
КонецПроцедуры
Показать

ЗЫ. А, ччерт.. Так-то как раз и нельзя делать... Выборка может сбиться. Щаз перепишу.
22. alljoke 07.12.15 11:39 Сейчас в теме
нет )))) туплю я с утра. Видать у вас неправильно построено дерево.

Вот код, он работает:


Процедура КнопкаВыполнитьНажатие(Кнопка)
	ОтборСтрокКУдалению  = Новый Структура("Колонка2", 0);
    МассивСтрокКУдалению = МоёДрево.Строки.НайтиСтроки(ОтборСтрокКУдалению, Истина);
    
    Для Каждого СтрокаДерева Из МассивСтрокКУдалению Цикл
        
        Попытка
            
            СтрокиДерева = ?(СтрокаДерева.Родитель = Неопределено,
                                МоёДрево.Строки,
                                СтрокаДерева.Родитель.Строки);
                                
            СтрокиДерева.Удалить(СтрокаДерева);
            
        Исключение
        КонецПопытки;
        
    КонецЦикла;
КонецПроцедуры
Показать


НА форме лежит ДеревоЗначений (МоёДрево), с двумя колонками "Колонка1, Колонка2"
25. sCHTASS 49 07.12.15 11:43 Сейчас в теме
(22) Дерево корректное. Код, как полагал, рабочий. На отдельных примерах срабатывает нормально. А вот сейчас задача от тестера пришла. Начал отладчиком ковырять и нашел вот такую штуку.
24. herfis 500 07.12.15 11:41 Сейчас в теме
Во, вот так попробуй:

Процедура УдалитьНулевыеВетки(Дерево)
   МассивУдаляемыхСтрок = Новый Массив;
   Для Каждого Строка Из Дерево.Строки Цикл
      Если Строка.Количество = 0 Тогда
         МассивУдаляемыхСтрок.Добавить(Строка);
      Иначе
         УдалитьНулевыеВетки(Строка);
      КонецЕсли;
   КонецЦикла;
   Для Каждого УдаляемаяСтрока Из МассивУдаляемыхСтрок Цикл
      Дерево.Строки.Удалить(УдаляемаяСтрока);
   КонецЦикла;
КонецПроцедуры
Показать
26. sCHTASS 49 07.12.15 11:44 Сейчас в теме
(24) Да пробывал я уже. Сколько еще раз повторять этот вариант меня не устраивает из-за скорости обработки.
27. herfis 500 07.12.15 11:46 Сейчас в теме
(26) sCHTASS, Либо у тебя дерево как в Яндексе, либо ты где-то протупил. Озвучь размер дерева.
29. sCHTASS 49 07.12.15 11:50 Сейчас в теме
(27) Дерева состоит из 3-5 уровней вложенности. На последнем уровне может быть до 500-600 строк. На верхнем уровне около 20 строк. Нулевых строк 84 шт.
36. herfis 500 07.12.15 12:04 Сейчас в теме
(29) sCHTASS, И сколько выполняется по времени? Что замер говорит? Просто интересно, на чем именно тормозит в таком простом коде.
Неужели из-за накладных расходов на саму рекурсию? Деревце средненькое весьма...
Что касается сабжевого кода - ты проверил, попадают или нет корневые узлы в массив результатов?
Если нет - тогда такая неадекватная реакция у 1С значит на попытку удаления невалидной ссылки. Хотя упасть, по-идее, должно было раньше. Можно попробовать в начале попытки еще воткнуть обращение к СтрокаДерева.Количество. Может, на нем лучше упадет :) Хотя я лично всё равно попробовал бы выяснить причину тормозов и решить вопрос без исключений.
37. sCHTASS 49 07.12.15 12:17 Сейчас в теме
(36) Удаление строк выполняется где-то 700 раз. С рекурсией выполняется код где-то 2-3 секунды, с отбором строк меньше секунды.
32. Dr_Medved 07.12.15 11:54 Сейчас в теме
(26) sCHTASS, А сам алгоритм поправить, который заполняет дерево, что - бы нулевые строки не добавлялись ни как ?
35. sCHTASS 49 07.12.15 11:56 Сейчас в теме
(32) Не получится. Дерево изменяется неоднократно при исполнении кода, переделкой запроса тут не обойдешься.
65. German_Tagil 43 14.04.17 12:55 Сейчас в теме
(24) Спасибо пригодилось для отборов на форме
28. herfis 500 07.12.15 11:48 Сейчас в теме
В идеале - глубину и общее количество элементов.
30. alljoke 07.12.15 11:50 Сейчас в теме
А если в Попытка Исключение КонецПопытки добавить СообщитьОписаниеОшибки()?
Попытка
//вашкод
Исключение
СообщитьОписаниеОшибки()
КонецПопытки

Что скажет?
Или винда опять упадёт?
31. sCHTASS 49 07.12.15 11:53 Сейчас в теме
(30) Ругается на строку СтрокиДерева.Удалить(СтрокаДерева); мол индекс выходит за пределы.
39. Xershi 1487 07.12.15 13:11 Сейчас в теме
(31) sCHTASS, об этом я и писал. Индекс сместился.

С деревом мало работал, но основа везде одинакова. Удалять нужно с конца.
40. herfis 500 07.12.15 13:55 Сейчас в теме
(39) Xershi, В таблице значений синтаксис удаления тоже имеет два разных варианта. "Удалять нужно с конца" - это семерочная мантра и в восьмерке актуальна только при удалении по индексу.
41. Xershi 1487 07.12.15 14:28 Сейчас в теме
(40) herfis, как тогда удалять значения без потери индексов при обходе коллекции?

Если это мантра 1с7, тогда не могли бы вы поведать, что в 1с8 изменилось?
61. herfis 500 07.12.15 17:14 Сейчас в теме
(41) Xershi,
Если вопросы остались, могу разъяснить подробно.
62. Xershi 1487 07.12.15 17:18 Сейчас в теме
(61) herfis, мы походу уже разобрали этот случай, но если это что-то новое конечно было бы кстати!
63. herfis 500 07.12.15 17:23 Сейчас в теме
(62) Xershi, Откуда ж я знаю, что новое :)
Добавлю только, что на восьмерке я вообще почти перестал пользоваться удалением по индексам, т.к. по ссылкам гибче, хотя и избыточнее в простых случаях.
Чаще в обычном цикле "Для Каждого" запоминаю ссылки для удаления и потом их удаляю в отдельном цикле, как в (24).
Да, в простых случаях избыточно. Но предельно простые случаи у меня как-то редко стали встречаться. Зато код читабельнее и легче расширяемый при необходимости. Проход ведь может быть многофункциональный, а не только для удаления некоторых строк. И обратный порядок обхода в этом случае - явный костыль, который ясности и простоты в бизнес-код отнюдь не привносит (а где-то может быть и вообще неприемлем).
64. Xershi 1487 07.12.15 21:17 Сейчас в теме
(63) herfis, я уже по этому вопросу в (60) высказался))
33. sCHTASS 49 07.12.15 11:54 Сейчас в теме
Ладно, уважаемые!
Видно проблему, решить не получиться. Решил от удаления строк пока отказаться.
34. spezc 783 07.12.15 11:55 Сейчас в теме
ого ветка как разрослась
38. spezc 783 07.12.15 12:22 Сейчас в теме
попробуйте код:
	ОтборСтрокКУдалению  = Новый Структура("Количество", 0);
	МассивСтрокКУдалению = ДеревоОстатков.Строки.НайтиСтроки(ОтборСтрокКУдалению, Истина);
	
	ТаблицаСтрокДляУдаления = Новый ТаблицаЗначений;
	ТаблицаСтрокДляУдаления.Колонки("КоллекцияСтрокДереваДляУдаления");
	ТаблицаСтрокДляУдаления.Колонки("СтрокаДереваДляУдаления");
	ТаблицаСтрокДляУдаления.Колонки("УровеньСтрокиДереваДляУдаления");
	
	Для Каждого СтрокаДерева Из МассивСтрокКУдалению Цикл
		
		нс = ТаблицаСтрокДляУдаления.Добавить();
		нс.КоллекцияСтрокДереваДляУдаления = ?(СтрокаДерева.Родитель = Неопределено,
                                ДеревоОстатков.Строки,
                                СтрокаДерева.Родитель.Строки);
		нс.СтрокаДереваДляУдаления = СтрокаДерева;
		нс.УровеньСтрокиДереваДляУдаления = СтрокаДерева.Уровень();
		
	КонецЦикла;
	
	ТаблицаСтрокДляУдаления.Сортировать("УровеньСтрокиДереваДляУдаления Убыв");
	
	Для каждого Стр Из ТаблицаСтрокДляУдаления Цикл
	
		Стр.КоллекцияСтрокДереваДляУдаления.Удалить(Стр.СтрокаДереваДляУдаления);
	
	КонецЦикла; 
Показать
Good_Smile; dooD1iez; KolBbl4; artichoke; wolfsoft; klinval; +6 Ответить
42. spezc 783 07.12.15 14:49 Сейчас в теме
это дерево, тут нет понятия "с конца", тут есть понятие "снизу".
рабочий код по удалению строк дерева значений в (38). развели дискуссию на 40 постов.
45. Xershi 1487 07.12.15 15:01 Сейчас в теме
(42) spezc, ну я представляю каждую ветвь как таблицу значений.

Поэтому и с конца.
47. klinval 338 07.12.15 15:05 Сейчас в теме
(45) Xershi, вам же уже сказали, что удаление происходит не по индексу, значит всё будет ОК. Вот вам пример:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	Для Индекс = 1 По 10 Цикл
		Стр = Объект.ТабличнаяЧасть1.Добавить();
		Стр.Реквизит1 = Индекс;
	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура УдалитьЧетные(Команда)
	УдалитьЧетныеНаСервере();
КонецПроцедуры

&НаСервере
Процедура УдалитьЧетныеНаСервере()
	
	//Получаем каким-то образом массив строк к удалению
	МассивЧетныхСтрок = Новый Массив;
	Для Каждого Строка из Объект.ТабличнаяЧасть1 Цикл
		Если Строка.Реквизит1%2=0 Тогда
			МассивЧетныхСтрок.Добавить(Строка);
		КонецЕсли;
	КонецЦикла;
	
	Для Каждого Строка из МассивЧетныхСтрок Цикл
		Объект.ТабличнаяЧасть1.Удалить(Строка);
	КонецЦикла;
		
КонецПроцедуры
Показать

См. вложение. Процедура отрабатывает корректно: сначала удаляет 2 строку со значением 2, потом удаляется 3 строка со значением 4 (хотя в момент попадания массива она была 4) и т.д. Всё корректно отработалось.
Хотите пример перепишите с ТЗ, с Деревом - всё-равно будет всё нормально пока вы удаляете не по индексу.
Прикрепленные файлы:
ПробаУдалениеСНачала.epf
49. Xershi 1487 07.12.15 15:08 Сейчас в теме
(47) klinval, так ты делаешь избыточную операцию! Лучше и быстрее один раз обойти с конца за один проход.

Никто не спорт что такое решение будет работать. Только ты 2 обхода делаешь.

Я же говорил про удаление за один обход. В таком ключе у вас есть решение/предложение?
50. klinval 338 07.12.15 15:23 Сейчас в теме
(49) Xershi,
На код:
    ОтборСтрокКУдалению  = Новый Структура("Количество", 0);
    МассивСтрокКУдалению = ДеревоОстатков.Строки.НайтиСтроки(ОтборСтрокКУдалению, Истина);
    
    Для Каждого СтрокаДерева Из МассивСтрокКУдалению Цикл
        
        Попытка
            
            СтрокиДерева = ?(СтрокаДерева.Родитель = Неопределено,
                                ДеревоОстатков.Строки,
                                СтрокаДерева.Родитель.Строки);
                                
            СтрокиДерева.Удалить(СтрокаДерева);
            
        Исключение
        КонецПопытки;
        
    КонецЦикла;
Показать

Ты писал:
нужно обходить последнюю группировку и из нее удалять. А так как вы это описали не мудрено, что вылетит в ошибку. Думаю это вы дерево просто разрушаете.
...
И не забывать про то что когда удаляете строку индекс тоже смешается, поэтому лучше делать обратный обход.

Там вначале автор получил МАССИВСТРОК и потом делает удаление по строке, а не по индексу. Ты утверждал, что так нельзя. Больше половины сообщений темы занято тем, чтобы доказать тебе что так можно делать и не обязательно делать "с конца". И теперь ты пишешь:
Никто не спорт что такое решение будет работать.

....


По поводу:
Только ты 2 обхода делаешь.

Я бы мог получить строки запросом или НайтиСтроки. Не обязательно делать 2 обхода. Я просто создал тестовый пример, чтобы доказать, что в можно удалять не в обратном порядке. До 49 сообщения (например в (8), (9), (41) и т.д.) ты утверждал, что так делать нельзя, теперь оказывается ты изначально знал, что так делать можно. О чём тогда спор?
53. Xershi 1487 07.12.15 15:31 Сейчас в теме
(50) klinval, о том что твой пример для ТЗ, а у него ДЗ.

И метод которым он получил данные не гарантирует корректную сортировку.

Т.е. он удалил ветвь, а потом пытается удалить потомка, который уже удален.
56. klinval 338 07.12.15 16:25 Сейчас в теме
(53) Xershi, тебе не стыдно мне повторять мою же мысль только другими словами?
(52) klinval 07.12.15 15:29
Изначально код возможно не работал из-за того, что удалялась строка уровнем выше, а потом идёт попытка удалить строку уровнем ниже, которой физически не существует.
Т.е. есть элементы 1, 1.1, 1.2, 2, 2.1 и т.д. Идёт удаление элемента 1, он тянет за собой 1.1 и 1.2. Потом пытаемся удалить 1.1, а этой строки уже нет.

(53) Xershi 07.12.15 15:31
Т.е. он удалил ветвь, а потом пытается удалить потомка, который уже удален.

Вы делаете вид, что слова указанные в 53 сообщении вы с самого начала всем пытались донести. Но на самом деле вы писали совсем не это! Вы писали, что то про индексы. Но на самом деле индексы тут не важны, т.к. удаляет автор не по индексу. Об этом вам неоднократно писали! Тут важен уровень в иерархии, а не какой-то индекс!

А теперь почему:
(50) klinval, о том что твой пример для ТЗ, а у него ДЗ.

Пример для тебя, а не для автора был, т.к. в ответ на сообщение про ТЗ:
(39) Xershi, В таблице значений синтаксис удаления тоже имеет два разных варианта. "Удалять нужно с конца" - это семерочная мантра и в восьмерке актуальна только при удалении по индексу.

ты написал:
(40) herfis, как тогда удалять значения без потери индексов при обходе коллекции?

Если это мантра 1с7, тогда не могли бы вы поведать, что в 1с8 изменилось?

Я тебе привёл пример, что в ТЗ можно удалять "не с конца". И на индексы в этом случае плевать.
52. klinval 338 07.12.15 15:29 Сейчас в теме
А что касается темы:
Изначально код возможно не работал из-за того, что удалялась строка уровнем выше, а потом идёт попытка удалить строку уровнем ниже, которой физически не существует.
Т.е. есть элементы 1, 1.1, 1.2, 2, 2.1 и т.д. Идёт удаление элемента 1, он тянет за собой 1.1 и 1.2. Потом пытаемся удалить 1.1, а этой строки уже нет.

ИМХО код в (38) эту проблему устраняет. Вопрос к топикстартеру: попробовал ли он этот код?
43. 32ops 192 07.12.15 14:55 Сейчас в теме
Еще такой косяк может быть:
На верхнем уровне есть элемент с нулевым количеством, в подчиненных элементах тоже есть нулевое количество. Первым удалили верхнее значение из дерева. Соотвественно все его потомки тоже удалены. Потом пытаемся удалить потомков.

Вообще в постановке задачи не сказано, что делать с потомками удаляемого элемента.

С рекурсией тоже непонятно, почему она так медленно работает, в дереве вроде индексов не бывает, найтистроки не должна работать быстрее.
44. Xershi 1487 07.12.15 14:59 Сейчас в теме
(43) 32ops, по поводу нет индексов
КоллекцияСтрокДереваЗначений (ValueTreeRowCollection)
Удалить (Delete)
Вариант синтаксиса: По объекту

Синтаксис:

Удалить(<Строка>)
Параметры:

<Строка> (обязательный)

Тип: СтрокаДереваЗначений.
Строка, которую необходимо удалить из данной коллекции строк ДеревоЗначений.
Вариант синтаксиса: По индексу

Синтаксис:

Удалить(<Индекс>)
Параметры:

<Индекс> (обязательный)

Тип: Число.
Индекс удаляемой строки.
Описание:

Удаляет строку из коллекции строк данного уровня дерева значений. Если у строки имеются подчиненные строки, они также будут удалены.

Доступность:

Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
Пример:

СтрокиСостава.Удалить(6);

Показать
46. 32ops 192 07.12.15 15:04 Сейчас в теме
(44) В данном случае индекс элемента в коллекции. Не связано с механизмом быстрого поиска ИМХО.
48. Xershi 1487 07.12.15 15:05 Сейчас в теме
(46) 32ops, обращение по индексу как раз и есть быстрый поиск. В чем разница тогда по вашим словам?
51. 32ops 192 07.12.15 15:28 Сейчас в теме
(48) В моем понимании индекс - несколько другое. Это вспомогательная структура облегчающая поиск нужного элемента в массиве. например если есть массив чисел от 1 до ста, для поиска нужного элемента с использованием индекса нужно будет 7 сравнений 2 в степени 7 = 128 > 100. Она как бы превращает массив в дерево для удобного сравнения, сначала идет сравнение с самым среднем значением (50), потом в зависимости от результат 25 или 75, и т.д. Все, что я описал, наверное, не совсем соответствует действительности, но описывает мое понимание индекса.
55. Xershi 1487 07.12.15 15:35 Сейчас в теме
(51) 32ops, в целом так и есть. Индексирование позволяет ускорить поиск. А вот обращение по индексу позволяет сразу обратиться к нужному элементу.

Главное помнить, что удаляя по индексу не стоит забывать, что он будет смещаться.
54. Xershi 1487 07.12.15 15:33 Сейчас в теме
Поэтому я предложил решение которое будет всегда работать!
57. Xershi 1487 07.12.15 16:32 Сейчас в теме
Вы делаете вид, что слова указанные в 53 сообщении вы с самого начала всем пытались донести. Но на самом деле вы писали совсем не это! Вы писали, что то про индексы. Но на самом деле индексы тут не важны, т.к. удаляет автор не по индексу. Об этом вам неоднократно писали! Тут важен уровень в иерархии, а не какой-то индекс!


Просто пишу код так как нужно, я не задумывался над тем какие могут быть последствия у автора, делая как он делал.

А потом пораскинув сделал вывод, что он удалил родителя, а потом удаляет потомка. Потому как массив то у него не отсортирован как нужно.

А по поводу индекса. У ДЗ как вы уже поняли он есть, т.е. внутренняя нумерация коллекции. И автор даже привел текст ошибки, что индекс находится за границей доступности.

Вас я попросил пояснить что нового в 1С8 есть чего я не знаю. Увы я это все знал. Так что спора как бы и нет...
59. klinval 338 07.12.15 16:42 Сейчас в теме
(57) Xershi,
А потом пораскинув сделал вывод, что он удалил родителя, а потом удаляет потомка. Потому как массив то у него не отсортирован как нужно.

Поэтому предлагаю плюсануть 38 сообщение, т.к. именно там происходит сортировка удаляемых строк (правда не по индексу, а по уровню) и закончить дискуссию.
60. Xershi 1487 07.12.15 16:59 Сейчас в теме
(59) klinval, мне такое решение просто не нравится как мое личное мнение.

Но думаю, если автора оно устроит. То и вопросов нет.

Я хоть и люблю все правильное, но если есть решение которое будет с костылем, но сработает быстрее могу применить.

Тут дело в конкретном случае меня не устраивает такой огород вот и все))

Так что тут нет спора учимся и делаем выводы.
58. Xershi 1487 07.12.15 16:36 Сейчас в теме
А по поводу решения автора. Думаю ему лишь проверку на конечную запись нужно делать или чтобы у записи не было потомков.

В таком ключе с нулями останутся только записи у которых будут потомки.
66. user1209971 74 04.01.21 20:46 Сейчас в теме
(9) Тема старая, но ответа нет
комментарий из 9 помог решить вопрос, удаляйте в ветке листы начиная с последнего. Индекс важен!!!

        Дерево = РеквизитФормыВЗначение("РаспоряженияНаДоставку");
	
	Для Каждого СтрокиПоЗоне Из Дерево .Строки цикл
			
		//Для Каждого Строка Из СтрокиПоЗоне.Строки цикл
		КоличествоСтрок = СтрокиПоЗоне.Строки.Количество();
		Для й = 1 по КоличествоСтрок цикл
			
			Строка = СтрокиПоЗоне.Строки[КоличествоСтрок-й];
			
			Если УсловиеДляУдаления тогда
                               СтрокиПоЗоне.Строки.Удалить(Строка);
			КонецЕсли;
               КонецЦикла;
       КонецЦикла;
Показать
67. Xershi 1487 04.01.21 21:03 Сейчас в теме
(66) ответа это кода который должен был быть в (9)?)
68. user1209971 74 05.01.21 09:42 Сейчас в теме
нет это пример как обойти листья ветки в обратном порядке для удаление листьев за один проход
Оставьте свое сообщение

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