Как добавить строку в ДеревоЗначений

1. A1nur1ch 12.01.24 10:19 Сейчас в теме
Получаю строку так:
ДеревоСтарое = РеквизитФормыВЗначение("Товары");
Строка = ДеревоСтарое.Строки.НайтиСтроки(Новый Структура("Номенклатура,Характеристика", строка2.Номенклатура, строка2.Характеристика));

Как теперь "Строка" добавить в другое ДеревоЗначений?
По теме из базы знаний
Найденные решения
2. MuxaH 12.01.24 10:27 Сейчас в теме
(1)
Для Каждого пСтрока Из Строка Цикл
   НоваяСтрока = НовоеДерево.Строки.Добавить();
   ЗаполнитьЗначенияСвойств(НоваяСтрока, пСтрока);
КонецЦикла;
16. MuxaH 12.01.24 11:14 Сейчас в теме
(14)
Строка = ДеревоСтарое.Строки.НайтиСтроки(Новый Структура("Номенклатура,Характеристика", строка2.Номенклатура, строка2.Характеристика));


Вот это возвращает массив строк. В новом дереве нет никаких реквизитов, поэтому ЗаполнитьЗначенияСвойств не даст нужного эффекта. Поэтому надо, для начала, новое дерево сделать идентичным старому:
НовоеДерево = Новый ДеревоЗначений;
Для Каждого пКолонка Из ДеревоСтарое.Колонки Цикл
   НовоеДерево.Колонки.Добавить(пКолонка.Имя);
КонецЦикла;


Ну и дальше
МассивСтрок = ДеревоСтарое.Строки.НайтиСтроки(Новый Структура("Номенклатура,Характеристика", строка2.Номенклатура, строка2.Характеристика)); 
Для Каждого пСтрока Из МассивСтрок Цикл    
НоваяСтрока = ДеревоНовое.Строки.Добавить();
    ЗаполнитьЗначенияСвойств(НоваяСтрока, пСтрока);
КонецЦикла;
20. antz 12.01.24 11:31 Сейчас в теме
(19) Читаем внимательно справку по Методу НайтиСтроки для дерева значений. Там есть второй параметр "ВключатьПодчиненные".
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. MuxaH 12.01.24 10:27 Сейчас в теме
(1)
Для Каждого пСтрока Из Строка Цикл
   НоваяСтрока = НовоеДерево.Строки.Добавить();
   ЗаполнитьЗначенияСвойств(НоваяСтрока, пСтрока);
КонецЦикла;
3. A1nur1ch 12.01.24 10:34 Сейчас в теме
(2)
Ошибку выдает:
Ошибка при вызове метода контекста (ЗначениеВРеквизитФормы)
{Обработка.СостояниеОбеспечения.Форма.Форма.Форма(81)}:ЗначениеВРеквизитФормы(НоваяСтрока, Строка);


Вот Код:
Строка = ДеревоСтарое.Строки.НайтиСтроки(Новый Структура("Номенклатура,Характеристика", строка2.Номенклатура, строка2.Характеристика)); 
    НоваяСтрока = ДеревоНовое.Строки.Добавить();
    ЗначениеВРеквизитФормы(НоваяСтрока, Строка);

4. MuxaH 12.01.24 10:36 Сейчас в теме
(3) Я вроде другой код писал :)
5. A1nur1ch 12.01.24 10:37 Сейчас в теме
(4) А ОЙ :D Извиняюсь, немножечко перепутал
6. A1nur1ch 12.01.24 10:39 Сейчас в теме
(4) Чтобы потом новое дерево добавить в реквизит с типом ДеревоЗначений, то нужно уже ЗначениеВРеквизитФормы использовать, да ?
7. MuxaH 12.01.24 10:40 Сейчас в теме
(6) Да, если нужно именно в реквизит формы запихать, конечно
8. A1nur1ch 12.01.24 10:45 Сейчас в теме
(7) Реквизит с типом ДеревоЗначений Называется Товары.
Пробовал сделать так: "ЗначениеВРеквизитФормы(ДеревоНовое, Товары);"
И так ЗначениеВРеквизитФормы(ДеревоНовое, "Товары");
Но выдает ошибку:
Ошибка при вызове метода контекста (ЗначениеВРеквизитФормы)
{Обработка.СостояниеОбеспечения.Форма.Форма.Форма(86)}:ЗначениеВРеквизитФормы(ДеревоНовое, Товары);

Что не так ?
10. MuxaH 12.01.24 10:54 Сейчас в теме
(8) Тут не знаю, всё зависит от того, что в реквизите формы и того, что в реквизите ДеревоНовое
12. A1nur1ch 12.01.24 10:57 Сейчас в теме
(10) Ну я с Товары достал нужные мне строки по тому коду, который писал выше. Делаю Товары.ПолучитьЭлементы().Очистить(); А потом просто добавляю туда данные с другого дерева, где находятся отобранные строки
13. MuxaH 12.01.24 10:59 Сейчас в теме
(12) Ключевой вопрос - как :) Покажи полный код?
14. A1nur1ch 12.01.24 11:00 Сейчас в теме
(13)
ДеревоНовое = Новый ДеревоЗначений;
ДеревоСтарое = РеквизитФормыВЗначение("Товары"); 
РезервТовары = Товары.ПолучитьЭлементы();
Резерв = Товары.ПолучитьЭлементы();
Для каждого строка1 из Резерв Цикл
Товар = строка1.ПолучитьЭлементы();
Для каждого строка2 из Товар Цикл
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    ВложенныйЗапрос.Номенклатура КАК Номенклатура,
        |    ВложенныйЗапрос.Характеристика КАК Характеристика
        |ИЗ
        |    (ВЫБРАТЬ
        |        ЗаказыПоставщикам.ЗаказПоставщику КАК ЗаказПоставщику,
        |        ЗаказыПоставщикам.Номенклатура КАК Номенклатура,
        |        ЗаказыПоставщикам.Характеристика КАК Характеристика
        |    ИЗ
        |        РегистрНакопления.ЗаказыПоставщикам КАК ЗаказыПоставщикам
        |    ГДЕ
        |        ЗаказыПоставщикам.ЗаказПоставщику.ДокументОснование = &ЗаказПоставщику) КАК ВложенныйЗапрос
        |ГДЕ
        |    ВложенныйЗапрос.Номенклатура = &Номенклатура 
        | И ВложенныйЗапрос.Характеристика = &Характеристика";
        
    Запрос.УстановитьПараметр("ЗаказПоставщику", строка2.Заказ);
    Запрос.УстановитьПараметр("Номенклатура", строка2.Номенклатура);
    Запрос.УстановитьПараметр("Характеристика", строка2.Характеристика);
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

    Если ВыборкаДетальныеЗаписи.Количество() > 0 Тогда 
    Строка = ДеревоСтарое.Строки.НайтиСтроки(Новый Структура("Номенклатура,Характеристика", строка2.Номенклатура, строка2.Характеристика)); 
    НоваяСтрока = ДеревоНовое.Строки.Добавить();
    ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
    КонецЕсли;                                                                               
    
КонецЦикла;    
КонецЦикла; 
Товары.ПолучитьЭлементы().Очистить();
ЗначениеВРеквизитФормы(ДеревоНовое, "Товары");  
Элементы.Товары.Обновить();

Показать

Два цикла, потому что нужно дойти до 2 уровня, так как данные о номенклатуре там.
16. MuxaH 12.01.24 11:14 Сейчас в теме
(14)
Строка = ДеревоСтарое.Строки.НайтиСтроки(Новый Структура("Номенклатура,Характеристика", строка2.Номенклатура, строка2.Характеристика));


Вот это возвращает массив строк. В новом дереве нет никаких реквизитов, поэтому ЗаполнитьЗначенияСвойств не даст нужного эффекта. Поэтому надо, для начала, новое дерево сделать идентичным старому:
НовоеДерево = Новый ДеревоЗначений;
Для Каждого пКолонка Из ДеревоСтарое.Колонки Цикл
   НовоеДерево.Колонки.Добавить(пКолонка.Имя);
КонецЦикла;


Ну и дальше
МассивСтрок = ДеревоСтарое.Строки.НайтиСтроки(Новый Структура("Номенклатура,Характеристика", строка2.Номенклатура, строка2.Характеристика)); 
Для Каждого пСтрока Из МассивСтрок Цикл    
НоваяСтрока = ДеревоНовое.Строки.Добавить();
    ЗаполнитьЗначенияСвойств(НоваяСтрока, пСтрока);
КонецЦикла;
17. A1nur1ch 12.01.24 11:26 Сейчас в теме
(16)
Если ВыборкаДетальныеЗаписи.Количество() > 0 Тогда
    МассивСтрок = ДеревоСтарое.Строки.НайтиСтроки(Новый Структура("Номенклатура,Характеристика", строка2.Номенклатура, строка2.Характеристика)); 
    Для Каждого пСтрока Из МассивСтрок Цикл    
    НоваяСтрока = ДеревоНовое.Строки.Добавить();
    ЗаполнитьЗначенияСвойств(НоваяСтрока, пСтрока);
    КонецЦикла;
    КонецЕсли;    


Вот тут, ставил точку остановки, Доходит до Для Каждого пСтрока Из МассивСтрок Цикл и в цикл уже не лезет, неужели массив пустой ? ...
18. MuxaH 12.01.24 11:27 Сейчас в теме
(17) Раз не лезет, значит пустой, ага, строки не нашлись.
19. A1nur1ch 12.01.24 11:28 Сейчас в теме
(18) Сейчас отбор сделал по заказу, всё вышло, но заказ по сути это 1 уровень, а позиции(номенклатура) уже 2 уровень. Заказы всё вышли, но без позиций, сейчас надо думать, как вывести 2 уровень
20. antz 12.01.24 11:31 Сейчас в теме
(19) Читаем внимательно справку по Методу НайтиСтроки для дерева значений. Там есть второй параметр "ВключатьПодчиненные".
21. A1nur1ch 12.01.24 11:32 Сейчас в теме
(20) Оппачки, спасибо за наводку
22. A1nur1ch 12.01.24 11:36 Сейчас в теме
(20) А можно как-то по подчиненным отбор сделать, чтобы вывести нужные мне по отбору номенклатуру?
23. antz 12.01.24 11:41 Сейчас в теме
(22) по подчиненным чему? Искать будет везде.
24. A1nur1ch 12.01.24 11:44 Сейчас в теме
(23) Про 2 уровень говорил, уже сделал это, но теперь 1 уровень почему-то не выводится.
Вот код:
Если ВыборкаДетальныеЗаписи.Количество() > 0 Тогда
    МассивСтрок = ДеревоСтарое.Строки.НайтиСтроки(Новый Структура("Заказ,Номенклатура,Характеристика", строка2.Заказ,строка2.Номенклатура,строка2.Характеристика),Истина); 
    Для Каждого пСтрока Из МассивСтрок Цикл    
    НоваяСтрока = ДеревоНовое.Строки.Добавить();
    ЗаполнитьЗначенияСвойств(НоваяСтрока, пСтрока);
    КонецЦикла;
    КонецЕсли; 


Выводится только 2 уровень
25. A1nur1ch 12.01.24 11:49 Сейчас в теме
(24) 1 скрин - как выводит сейчас (тестовая база)
2 скрин - как должен правильно выводиться (рабочая)
Прикрепленные файлы:
26. antz 12.01.24 11:50 Сейчас в теме
(24) Ну так потому что строки, которые подходят под условие, находятся на 2 уровне. Надо при выводе дергать родителя текущей строки, искать его в строках нового дерева, если его нет - добавлять и в его подстроки добавлять текущую строку.
27. A1nur1ch 12.01.24 11:53 Сейчас в теме
(26) ну если дергаю только родителя, то всё выводит, но вот отбор по подчиненным уже пропадает. Как тогда можно сделать правильно отбор на 2 уровень уже ?
29. antz 12.01.24 11:54 Сейчас в теме
(27) У строки дерева значений есть свойство Родитель. В массив дергаете строки 2 уровня, при выводе обращаетесь к свойству Родитель, ищете его в новом дереве, если нет - добавляете и т.д.
30. A1nur1ch 12.01.24 11:59 Сейчас в теме
(29) Да, сейчас точкой остановки посмотрел и в МассивеСтроки переменная Родитель пустая
31. A1nur1ch 12.01.24 13:59 Сейчас в теме
(29) В родитель строки, которую добавляю в новое дерево впихиваю родителя, которую достаю со 2 уровня. Но выдает ошибку. А как тогда еще можно это сделать ? Больше идей нету
Ошибка:
Поле объекта недоступно для записи (Родитель)
{Обработка.СостояниеОбеспечения.Форма.Форма.Форма(82)}:НоваяСтрока.Родитель = строка2.Родитель;
32. antz 12.01.24 14:56 Сейчас в теме
(31) Потому что только чтение у родителя, да и правильно - не надо ему ничего присваивать. Надо наоборот делать: на первый уровень добавлять родителя

Родитель = НовоеДерево.Строки.Добавить();
Родитель.ЧетоТам = ТекСтрока.Родитель.ЧетоТам;
.....


а потом

НовСтрока = Родитель.Строки.Добавить();


и т.д.
33. A1nur1ch 12.01.24 15:39 Сейчас в теме
Получается к новому дереву присвоить строки с родителем - 1 уровень
Потом уже к новым строкам присвоить 1 уровень и в нее уже добавлять данные - 2 уровень
Надеюсь правильно всё понял?...
34. A1nur1ch 12.01.24 15:47 Сейчас в теме
(32)
Родитель = НовоеДерево.Строки.Добавить();
Родитель.ЧетоТам = ТекСтрока.Родитель.ЧетоТам;

Там, где Родитель.ЧетоТам. Что нужно написать ?
Там получается можно поставить Владелец, Получить,Родитель,Строки,Уровень,Установить
35. antz 12.01.24 15:52 Сейчас в теме
(34) Это заказ, в данном случае. То есть, сначала мы ищем - есть ли строка первого уровня с этим заказом

Строки = НовоеДерево.Строки.НайтиСтроки(Новый Структура("Заказ", ТекСтрока.Родитель.Заказ));
Если Строки.Количество() = 0 Тогда
    Родитель = НовоеДерево.Строки.Добавить();
    Родитель.Заказ = ТекСтрока.Родитель.Заказ;
    //заполняем остальные данные
Иначе
    Родитель = Строки[0]
КонецЕсли;

НовСтрока = Родитель.Строки.Добавить();
НовСтрока.Номенклатура = ТекСтрока.Номенклатура;
//заполняем остальные данные
Показать
36. A1nur1ch 12.01.24 15:54 Сейчас в теме
(35) Понял, получается все строки придется прописать в ручную
28. A1nur1ch 12.01.24 11:54 Сейчас в теме
(26) Хотя, в принципе да, можно получить отдельно родителя и к нему уже присваивать 2 уровень
15. YozZzhik 12.01.24 11:09 Сейчас в теме
(1) Чтобы работали ЗначениеВРеквизитФормы и ЗаполнитьЗначенияСвойств нужно чтобы в новом и старом дереве были идентичные колонки
9. ActionBlog 12.01.24 10:54 Сейчас в теме
Я правильно понимаю, что Вы нашли строку в дереве "Товары" и хотите ее добавить в какое-то другое дерево?
11. A1nur1ch 12.01.24 10:56 Сейчас в теме
(9) Там Отбор надо сделать, я вот получил нужные строки, хотел очистить всё с Товары и добавить туда новые строки
Оставьте свое сообщение

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