Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
24 окт 2021, 09:46

Дерево значений. Строка не принадлежит коллекции

Автор tasya, 09 июн 2021, 09:22

0 Пользователей и 1 гость просматривают эту тему.

tasya

Добрый день! Помогите, пожалуйста, разобраться. Нужно удалить строки из дерева значений по условию.
ДеревоТСП = РеквизитФормыВЗначение("ПачкиТСП");
Отбор = Новый Структура();
Отбор.Вставить("Отметка", Истина);
МассивСтрок = ДеревоТСП.Строки.НайтиСтроки(Отбор, Истина);
Для каждого СтрокаПачки из МассивСтрок Цикл
Если СтрокаПачки.Уровень() <> 0 Тогда // значит не родитель
НомерМашины = СтрокаПачки.Родитель.ПорядковыйНомерМашины;
СтрокаРодитель = ДеревоТСП.Строки.Найти(НомерМашины, "ПорядковыйНомерМашины");
СтрокаРодитель.Строки.Удалить(СтрокаПачки);
КонецЕсли;
КонецЦикла;
ЗначениеВРеквизитФормы(ДеревоТСП, "ПачкиТСП");


По СтрокаРодитель.Строки.Удалить(СтрокаПачки) выдает Ошибку Строка не принадлежит коллекции.

antoneus

Отладчик что говорит?

upd: А зачем вообще вся эта дополнительная возня с поиском в подчиненных строках? Если не уровень <> 0, то сразу удалять - это работает, потому что в массиве, который возвращается методом НайтиСтроки, содержатся не сами строки, а ссылки на них, удалять можно в цикле по массиву.

tasya

Цитата: antoneus от 09 июн 2021, 10:06
Отладчик что говорит?

upd: А зачем вообще вся эта дополнительная возня с поиском в подчиненных строках? Если не уровень <> 0, то сразу удалять - это работает, потому что в массиве, который возвращается методом НайтиСтроки, содержатся не сами строки, а ссылки на них, удалять можно в цикле по массиву.

Потому что мне нужно удалить не все подчиненные строки, а по условию, удалить в нужном уровне. Поэтому я подчиненные строки отбираю через метод НайтиСтроки. А как получить из ссылки строку?

antoneus

Вот так чем не устраивает?

Для каждого СтрокаПачки из МассивСтрок Цикл
    Если СтрокаПачки.Уровень() <> 0 Тогда // значит не родитель
        СтрокаПачки.Родитель.Строки.Удалить(СтрокаПачки);
    КонецЕсли;
КонецЦикла;

tasya

Цитата: antoneus от 09 июн 2021, 10:42
Вот так чем не устраивает?

Для каждого СтрокаПачки из МассивСтрок Цикл
    Если СтрокаПачки.Уровень() <> 0 Тогда // значит не родитель
        СтрокаПачки.Родитель.Строки.Удалить(СтрокаПачки);
    КонецЕсли;
КонецЦикла;


Очищает строку в массиве, а в дереве значений строка остается

LexaK

вообще для ДЗ нужен рекурсивный обход ветвей дерева
вот пример как просто удалить все отмеченные, в примере по Кнопке Удалить отмеченные

&НаКлиенте
Процедура КомандаУдалитьОтмеченные(Команда)
        //для вашей задачи,
УдалитьОтмеченные(ПачкиТСП);

КонецПроцедуры

&НаКлиенте
Процедура УдалитьОтмеченные(Источник)

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

КонецПроцедуры



проверено, работает, удаляет отмеченные элементы из разных в том числе и вложенных веток
ответ Понравился? (в смысле пригодился?)

antoneus

Цитата: tasya от 09 июн 2021, 10:45

Очищает строку в массиве, а в дереве значений строка остается

Недопонял.

tasya

Цитата: antoneus от 09 июн 2021, 11:11
Цитата: tasya от 09 июн 2021, 10:45

Очищает строку в массиве, а в дереве значений строка остается

Недопонял.

Да, так работает. Спасибо. У меня не работало, так как я передаю МассивСтрок через временное хранилище в другую процедуру.
   ДеревоТСП = РеквизитФормыВЗначение("ПачкиТСП");
Отбор = Новый Структура();
Отбор.Вставить("Отметка", Истина);
МассивСтрок = ДеревоТСП.Строки.НайтиСтроки(Отбор, Истина);
АдресХранилища = ПоместитьВоВременноеХранилище(МассивСтрок, Новый УникальныйИдентификатор());

//другая серверная процедура
МассивСтрок = ПолучитьИзВременногоХранилища(АдресХранилища);
Для каждого СтрокаПачки Из МассивСтрок Цикл
Если НЕ СтрокаПачки.Уровень() = 0 Тогда
ДеревоТСП = РеквизитФормыВЗначение("ПачкиТСП");
СтрокаПачки.Родитель.Строки.Удалить(СтрокаПачки);
ЗначениеВРеквизитФормы(ДеревоТСП, "ПачкиТСП");
КонецЕсли;
КонецЦикла;

antoneus

Ну и не будет работать. РеквизитФормыВЗначение создает в памяти новый объект, к которому массив строк из хранилища не имеет никакого отношения.

tasya

Цитата: antoneus от 09 июн 2021, 12:19
Ну и не будет работать. РеквизитФормыВЗначение создает в памяти новый объект, к которому массив строк из хранилища не имеет никакого отношения.
Теперь буду знать, спасибо большое!

Теги:

Похожие темы (5)

Рейтинг@Mail.ru Rambler's Top100

Поиск