Всем добрый день! Помогите, пожалуйста, кто разбирается, как удалить строку из дерева значений.
Пользователь на форме видит эти данные дерева. Туда выгружает запрос. И чтобы не добавлять условий в запрос (ну это план Б), хотелось бы поудалять строки, несоответствующие условию. Почему-то удаляет не все. Видимо что-то не правильно
Пользователь на форме видит эти данные дерева. Туда выгружает запрос. И чтобы не добавлять условий в запрос (ну это план Б), хотелось бы поудалять строки, несоответствующие условию. Почему-то удаляет не все. Видимо что-то не правильно
СостоитВГруппеВыпуска = Ложь;
Для Каждого СтрокаСписка Из ТЗ.Строки Цикл
ТекущаяГруппаВыпуска = СтрокаСписка.ГруппаВыпуска;
Для каждого СтрокаНомен из СтрокаСписка.Строки Цикл
ТекущаяНоменклатура = СтрокаНомен.Номенклатура;
Для каждого СтрокаГруппы из ТекущаяГруппаВыпуска.Состав Цикл
Если СтрокаГруппы.Номенклатура = ТекущаяНоменклатура Тогда
СостоитВГруппеВыпуска = Истина
КонецЕсли;
КонецЦикла;
Если СостоитВГруппеВыпуска= Ложь Тогда
СтрокаСписка.Строки.Удалить(СтрокаНомен);
КонецЕсли;
СостоитВГруппеВыпуска = Ложь;
КонецЦикла;
КонецЦикла;
ПоказатьПо теме из базы знаний
- Пример преобразования дерева значений в таблицу значений и обратно в 1Cv8
- Алгоритм преобразования XML строки в дерево значений
- Управляемая форма 1С 8.2(8.3) – работа с деревом значений и таблицей значений. Часть II (Реализация DRAG and DROP)
- Восстановление развернутых строк ДереваЗначений после его обновления (управляемая форма)
- Работа с деревом значений для новичков (Управляемые формы 8.3)
Найденные решения
(9) Как то так
Для Каждого СтрокаСписка Из ТЗ.Строки Цикл
МассивНаУдаление = Новый Массив;
ТекущаяГруппаВыпуска = СтрокаСписка.ГруппаВыпуска;
Для каждого СтрокаНомен из СтрокаСписка.Строки Цикл
ТекущаяНоменклатура = СтрокаНомен.Номенклатура;
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Номенклатура", ТекущаяНоменклатура);
ПоискНоменклатуры = ТекущаяГруппаВыпуска.Состав.НайтиСтроки(ПараметрыОтбора);
Если НЕ ЗначениеЗаполнено(ПоискНоменклатуры)Тогда
МассивНаУдаление.Добавить(СтрокаНомен);
КонецЕсли;
КонецЦикла;
Для Каждого СтрокаУдаления из МассивНаУдаление Цикл
СтрокаСписка.Строки.Удалить(СтрокаУдаления);
КонецЦикла;
КонецЦикла;
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(2)
В массив записать получилось. По крайней мере, 121 одна строка, и вроде те что нужно. Но удалять не получается. Если убрать условие с поиском строки, то просто выдает ошибку "Строка не не принадлежит коллекции"
В массив записать получилось. По крайней мере, 121 одна строка, и вроде те что нужно. Но удалять не получается. Если убрать условие с поиском строки, то просто выдает ошибку "Строка не не принадлежит коллекции"
МассивНаУдаление = Новый Массив;
Для Каждого СтрокаСписка Из ТЗ.Строки Цикл
ТекущаяГруппаВыпуска = СтрокаСписка.ГруппаВыпуска;
Для каждого СтрокаНомен из СтрокаСписка.Строки Цикл
ТекущаяНоменклатура = СтрокаНомен.Номенклатура;
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Номенклатура", ТекущаяНоменклатура);
ПоискНоменклатуры = ТекущаяГруппаВыпуска.Состав.НайтиСтроки(ПараметрыОтбора);
Если НЕ ЗначениеЗаполнено(ПоискНоменклатуры)Тогда
МассивНаУдаление.Добавить(СтрокаНомен);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Для Каждого СтрокаУдаления из МассивНаУдаление Цикл
Для каждого СтрокаДерева из ТЗ.Строки Цикл
//если не это условие, то просто ошибка (параметр №1, строка не принадлежит коллекции)
Если СтрокаДерева.Строки.Найти(СтрокаУдаления) <> Неопределено Тогда
СтрокаДерева.Строки.Удалить(СтрокаУдаления);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Показать
(9) Как то так
Для Каждого СтрокаСписка Из ТЗ.Строки Цикл
МассивНаУдаление = Новый Массив;
ТекущаяГруппаВыпуска = СтрокаСписка.ГруппаВыпуска;
Для каждого СтрокаНомен из СтрокаСписка.Строки Цикл
ТекущаяНоменклатура = СтрокаНомен.Номенклатура;
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Номенклатура", ТекущаяНоменклатура);
ПоискНоменклатуры = ТекущаяГруппаВыпуска.Состав.НайтиСтроки(ПараметрыОтбора);
Если НЕ ЗначениеЗаполнено(ПоискНоменклатуры)Тогда
МассивНаУдаление.Добавить(СтрокаНомен);
КонецЕсли;
КонецЦикла;
Для Каждого СтрокаУдаления из МассивНаУдаление Цикл
СтрокаСписка.Строки.Удалить(СтрокаУдаления);
КонецЦикла;
КонецЦикла;
Показать
Программная работа с деревом - это почти всегда рекурсия.
Ну или ставь условия в запросе.
И в коде твоём вообще дерево именуется ТЗ. Линейкой по рукам надо бить за такое.
А на самом деле - у тебя ошибка в построении циклов. У тебя переменная СостоитВГруппеВыпуска будет определяться только по последней строке.
Ну или ставь условия в запросе.
И в коде твоём вообще дерево именуется ТЗ. Линейкой по рукам надо бить за такое.
А на самом деле - у тебя ошибка в построении циклов. У тебя переменная СостоитВГруппеВыпуска будет определяться только по последней строке.
(3)
даааа, всё сложно. Я посмотрела уже подобные вопросы, видела объяснения о рекурсии, но это моё первое практическое столкновение с деревом. Может проще и в запросе добавить. Всё это добро было сделано внедренцами, поэтому линейкой их можно, да. У меня просто задача по желанию пользователей добавить колонку Номенклатура. Запрос там из 14 подзапоросов. Я добавила уже соединение, чтоб выбрать номенклатуру. А то что она выбирается вся решила после удалить.
даааа, всё сложно. Я посмотрела уже подобные вопросы, видела объяснения о рекурсии, но это моё первое практическое столкновение с деревом. Может проще и в запросе добавить. Всё это добро было сделано внедренцами, поэтому линейкой их можно, да. У меня просто задача по желанию пользователей добавить колонку Номенклатура. Запрос там из 14 подзапоросов. Я добавила уже соединение, чтоб выбрать номенклатуру. А то что она выбирается вся решила после удалить.
(5) Поэтому прислушайся к Рустаму, он посоветовал самый правильный вариант.
Но есть нюанс - все равно придется использовать рекурсию, если количество уровней дерева не ограничено.
Если ограничено - да, можно использовать вложенные циклы. Неоптимально, криво, но будет работать. Пока количество уровней не увеличится.
Но есть нюанс - все равно придется использовать рекурсию, если количество уровней дерева не ограничено.
Если ограничено - да, можно использовать вложенные циклы. Неоптимально, криво, но будет работать. Пока количество уровней не увеличится.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот