Вывод данных на форму (УФ)

1. SantiouS 17.09.20 10:47 Сейчас в теме
Есть таблица значений с двумя реквизитами: "Клиент" и "НомерТелефона".
За клиентом может быть закреплено несколько номеров телефонов, по этому клиенты могут повторяться с разными строками.
Подскажите пожалуйста, как вывести на УФ дерево, на верхнем уровне которого будет находиться "Клиент", при открытии которого будут отображаться его номера телефонов.
По теме из базы знаний
Найденные решения
12. FatPanzer 17.09.20 11:46 Сейчас в теме
(10) Я же привел часть кода. Родитель не задается, он для чтения только. Просто дочерние строки добавлять надо не в Дерево.Строки.Добавить(), а в РодительскаяСтрока.Строки.Добавить().
alex-l19041; SantiouS; Sashares; +3 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. DmitriyPopow 33 17.09.20 11:03 Сейчас в теме
запихнуть тз в запрос. в запросе сделать группировку по колонке клиент. и на выходе получите дерево. а дальше просто его вывести на форму
или выгрузить колонку клиент из этой тз в другую. Свернуть строки. потом обходом получившейся тз искать строки в исходной тз по клиенту и построить так дерево
3. herfis 499 17.09.20 11:06 Сейчас в теме
Эммм... Просто пробегаешься по таблице значений, отсортированной по полю "Клиент". При изменении значения клиента относительно предыдущего добавляешь в дерево ветку верхнего уровня и пока он тот же самый - добиваешь по нему телефоны.
4. SantiouS 17.09.20 11:24 Сейчас в теме
(3) А как заполнять дерево? Пытаюсь вот так, но получаю ошибку при попытки записи родителя, так как данный реквизит только для чтения...Что я делаю не так?
ДеревоЗначений=ДанныеФормыВЗначение(ДеревоЗначенийКлиенты,Тип("ДеревоЗначений"));
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"
                 .....(вырезано)
		|ВЫБРАТЬ
		|	.....ТорговаяТочкаПоставки КАК ТорговаяТочка,
		|	......НомерТелефона
		|ИЗ
		|	....
		|ИТОГИ ПО
		|	ТорговаяТочка";	
	Запрос.УстановитьПараметр("ДатаВыборки", НачалоДня(ДатаВыборки));	
	РезультатЗапроса = Запрос.Выполнить();	
	ПартнерМаршрут=РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);		
	Пока ПартнерМаршрут.Следующий() Цикл
		СтрокаДЗ=ДеревоЗначений.Строки.Добавить();
		СтрокаДЗ.Партнер      = ПартнерМаршрут.ТорговаяТочка;
		СтрокаДЗ.НомерТелефона= "";
		Номера=ПартнерМаршрут.Выбрать();
		Пока Номера.Следующий() Цикл
			СтрокаДЗНомер=ДеревоЗначений.Строки.Добавить();
			СтрокаДЗНомер.Партнер      = Номера.ТорговаяТочка;
			СтрокаДЗНомер.НомерТелефона= Номера.НомерТелефона;
			СтрокаДЗНомер.Родитель     = СтрокаДЗ;	
		КонецЦикла; 		
	КонецЦикла; 	
	ДанныеФормыВЗначение(ДеревоЗначенийКлиенты,Тип("ДеревоЗначений"));
	ЗначениеВДанныеФормы(ДеревоЗначений,ДеревоЗначенийКлиенты);
Показать
5. FatPanzer 17.09.20 11:28 Сейчас в теме
(4) Строки телефонов надо добавлять не к дереву значений, а к родительской строке:
        Пока Номера.Следующий() Цикл
            СтрокаДЗНомер=СтрокаДЗ.Строки.Добавить();
            СтрокаДЗНомер.Партнер      = Номера.ТорговаяТочка;
            СтрокаДЗНомер.НомерТелефона= Номера.НомерТелефона;
        КонецЦикла; 
6. SantiouS 17.09.20 11:34 Сейчас в теме
(5) В таком случае строки будут без родителя и не будут отображаться в группе - не работает
Прикрепленные файлы:
7. FatPanzer 17.09.20 11:39 Сейчас в теме
(6) Ну здрассте! Дерево сформировалось корректно и без ошибок. Отобразить его на форме - это уже второй этап.

ЗначениеВРеквизитФорм() и проверьте свойство отображения табличного поля на форме.
10. SantiouS 17.09.20 11:44 Сейчас в теме
(7) Вот так все работает:
ПромДерево = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
	ЗначениеВДанныеФормы(ПромДерево, ДеревоЗначенийКлиенты);


Но я не пойму как вручную заполнить дерево (код в сообщении (4)). Почему я не могу задать родителя, как мне его тогда задавать?
12. FatPanzer 17.09.20 11:46 Сейчас в теме
(10) Я же привел часть кода. Родитель не задается, он для чтения только. Просто дочерние строки добавлять надо не в Дерево.Строки.Добавить(), а в РодительскаяСтрока.Строки.Добавить().
alex-l19041; SantiouS; Sashares; +3 Ответить
15. SantiouS 17.09.20 11:50 Сейчас в теме
(12)
РодительскаяСтрока.Строки.Добавить()

Именно это я и хотел осознать - спасибо.
Я второй раз сталкиваюсь с иерархическими списками и каждый раз забываю об этом нюансе.
14. herfis 499 17.09.20 11:49 Сейчас в теме
(10) Тебе показали - как. Подчиненные узлы добавляются в коллекцию "Строки" родительского узла. Родитель при этом "вытекает" автоматически.
(13) Так и не получится. Иногда полезно заглядывать в синтакс-помощник.
17. SantiouS 17.09.20 11:52 Сейчас в теме
(14)
Так и не получится. Иногда полезно заглядывать в синтакс-помощник.


Я об этом и написал в ответ на (11) - так не получается - по этому и преобразовываю.
19. herfis 499 17.09.20 11:58 Сейчас в теме
(17) Если устраивает результат автовыгруженного дерева - тогда это имеет смысл.
20. SantiouS 17.09.20 12:01 Сейчас в теме
(19) Для автовыгрузки ведь все равно нужно преобразовывать? Сразу в дерево значений формыне выгружает.
ДеревоЗначений=ДанныеФормыВЗначение(ДеревоЗначенийКлиенты,Тип("ДеревоЗначений"));
ДеревоЗначенийКлиенты = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
ЗначениеВДанныеФормы(ПромДерево, ДеревоЗначенийКлиенты);
23. FatPanzer 17.09.20 12:03 Сейчас в теме
(20) Зачем здесь первая строка? Ты её нигде не используешь.
ЗначениеВРеквизитФормы(ДеревоЗначенийКлиенты, "ИмяРеквизитаФормыДерева");
24. SantiouS 17.09.20 12:05 Сейчас в теме
(23) Верно подметили. Теперь я понял о чём Вы писали. Спасибо за разъяснение.
27. herfis 499 17.09.20 12:17 Сейчас в теме
(20) Да. Если устраивает автовыгруженное из запроса дерево - тогда только через ДеревоЗначений. ДанныеФормыДерево "оптом" только через него загружаться умеет. А вот если поэлементное заполнение делать - тогда смысл использовать ДеревоЗначений теряется, если не нужны какие-то особые его методы. Это особенно на клиенте удобно - простые преобразования не требующие обращений к БД можно делать не переходя на сервер, экономя таким образом на серверных вызовах.
9. FatPanzer 17.09.20 11:42 Сейчас в теме
(6) И у строк с номерами телефонов необязательно заполнять колонку с партнером (он уже есть в родительской строке). Так будет нагляднее.
8. herfis 499 17.09.20 11:40 Сейчас в теме
Не понимаю, зачем ДанныеФормыДерево преобразовывать в ДеревоЗначений и потом обратно. Почему напрямую не заполнять ДанныеФормыДерево?
11. FatPanzer 17.09.20 11:45 Сейчас в теме
(8) Старая привычка работать с деревом через "Строки", а не через "ПолучитьЭлементы()". Функционала больше при работе с деревом, чем при работе с ДаннымиФормы.
SantiouS; +1 Ответить
18. SantiouS 17.09.20 11:56 Сейчас в теме
(11)
Старая привычка работать с деревом через "Строки", а не через "ПолучитьЭлементы()"

Можно узнать поподробнее пожалуйста об этом вкратце?
21. FatPanzer 17.09.20 12:01 Сейчас в теме
(18) О чем? В (16) приведен пример уже простой.
22. SantiouS 17.09.20 12:02 Сейчас в теме
(21) В (16) перед этим нужно данные формы дерево значений преобразовать в дерево значений (на сколько я понимаю), а Вы писали, как я понял, о том, что можно заполнить дерево значений формы без преобразований туда-назад в дерево значений. Хотел разобраться как это сделать.
25. FatPanzer 17.09.20 12:06 Сейчас в теме
(22) Зачем тебе дерево с формы тащить? Ты просто подготавливаешь новое дерево после запроса и кладешь его на место старого на форме.
SantiouS; +1 Ответить
26. Sashares 34 17.09.20 12:06 Сейчас в теме
(22)
В (16) перед этим нужно данные формы дерево значений преобразовать в дерево значений (на сколько я понимаю)

Вы не правильно понимаете.

Есть 2 варианта работы с деревьями.
1. обычное ДеревоЗначений - строки добавляются через МоеДерево.Строки.Добавить();
2. дерево значений на форме - строки добавляются через ДеревоНаФорме.ПолучитьЭлементы().Добавить();

Все.
SantiouS; +1 Ответить
13. SantiouS 17.09.20 11:47 Сейчас в теме
(8) Потому что сразу не получается записать туда данные.
Прикрепленные файлы:
16. Sashares 34 17.09.20 11:51 Сейчас в теме
(13)Все просто.
НоваяКорневаяСтрока = ДеревоЗначенийКлиенты.ПолучитьЭлементы().Добавить();

НоваяДетальнаяСтрока = НоваяКорневаяСтрока.ПолучитьЭлементы().Добавить();
SantiouS; +1 Ответить
Оставьте свое сообщение

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