Работа с деревом значений (УФ)

1. sys1c 26.11.19 07:17 Сейчас в теме
Всем привет.

Имею два справочника сведенных в одну таблицу:


Через код

	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	Док1.Справочник1 КАК Справочник1,
	|	Док1.Справочник2 КАК Справочник2,
	|	Док1.Количество КАК Количество,
	|	Док1.Цена КАК Цена,
	|	Док1.Сумма КАК Сумма
	|ИЗ
	|	Документ.Док1.ТабЧасть КАК Док1
	|ГДЕ
	|	Док1.Ссылка = &Ссылка
	|ИТОГИ
	|	СУММА(Количество),
	|	СУММА(Сумма)
	|ПО
	|	Справочник1";
	
	Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
	
	ДанныеДляДерева = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);

    ЗначениеВРеквизитФормы(ДанныеДляДерева, "ДеревоНаФорме");
Показать


Получаю:

а как сделать вот так? :
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
14. herfis 499 28.11.19 12:26 Сейчас в теме
(1) Всегда решаю задачи подобного рода добавлением суррогатной колонки.
15. Sashares 34 28.11.19 12:51 Сейчас в теме
(1) добавить условное оформление и пустое значение отображать для детальных строк.
2. dhurricane 26.11.19 08:09 Сейчас в теме
Уточните, пожалуйста, Вас интересует любое решение или исключительно запросом? Ведь первое, что здесь напрашивается, это отказаться от использования метода "ЗначениеВРеквизитФормы" и заполнить дерево формы согласно своим предпочтениям последовательным обходом выборки.
5. sys1c 26.11.19 08:39 Сейчас в теме
(2) любое
(3) реквизит формы - дерево значений
(4) так у меня такие итоги и есть..
6. Kovekh 26.11.19 08:44 Сейчас в теме
(5)
А, блин, мой косяк, не досмотрел строчку.
Тогда остаётся просто циклом пробегать, а не одной строчкой выгрузки) Потому что выгрузкой для запроса у вас всегда будет заполнена колонка "Справочник1". Для понимания можете в консоли запросов глянуть результат
7. DmitriyPopow 33 26.11.19 08:44 Сейчас в теме
(5) результатЗапроса.Выгрузить() там как отображается?
и попробуйте ДанныеДляДерева = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); (сИерархией убрать)
ДанныеДляДерева - после выгрузки имеет тип дерево значений и нужный вид?
8. dhurricane 26.11.19 08:49 Сейчас в теме
(5) Ну вот как вариант:
ДанныеДляДерева = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);

Для каждого Группировка Из ДанныеДляДерева.Строки Цикл
	Для каждого ДетальныеЗаписи Из Группировка.Строки Цикл
		ДетальныеЗаписи.Справочник1 = Неопределено;
	КонецЦикла; 
КонецЦикла; 

ЗначениеВРеквизитФормы(ДанныеДляДерева, "ДеревоНаФорме");
Показать
9. dhurricane 26.11.19 08:53 Сейчас в теме
(5) Либо так, как Вам больше нравится:
ДанныеДляДерева = РеквизитФормыВЗначение("ДеревоНаФорме");
ДанныеДляДерева.Строки.Очистить();

ВыборкаПоГруппировкам = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаПоГруппировкам.Следующий() Цикл
	
	Группировка = ДанныеДляДерева.Строки.Добавить();
	ЗаполнитьЗначенияСвойств(Группировка, ВыборкаПоГруппировкам);
	
	ВыборкаДетальныеЗаписи = ВыборкаПоГруппировкам.Выбрать();
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		
		ДетальныеЗаписи = Группировка.Строки.Добавить();
		ЗаполнитьЗначенияСвойств(ДетальныеЗаписи, ВыборкаДетальныеЗаписи, , "Справочник1");
		
	КонецЦикла; 
	
КонецЦикла; 

ЗначениеВРеквизитФормы(ДанныеДляДерева, "ДеревоНаФорме");
Показать
10. sys1c 28.11.19 12:02 Сейчас в теме
(9) спасибо, "перебором" получилось.

Еще вопрос добавился:

Если у элемента верхнего уровня, длинное название, можно как-то настроить, чтобы оно было по всей строке.
Ведь в первой строке у меня вообще только один элемент с типом Справочник1.
Думаю на картинке понятно, что сейчас обрезает по красной линии:
11. dhurricane 28.11.19 12:05 Сейчас в теме
(10) А колонки обоих справочников могут редактироваться пользователем?
12. sys1c 28.11.19 12:06 Сейчас в теме
(11) да, по сути делаю иерархический подбор в документ (не иерархия справочника, а подчинение одного справочника другому, как в примере)
13. dhurricane 28.11.19 12:15 Сейчас в теме
(12) Опять предлагаю Вам попробовать два пути решения:

1. Спрятать колонки справочников, добавить третью составного типа. Ее и вывести на форму. При обходе результата запроса заполнять новую колонку либо значением справочника 1, либо справочника 2 зависимости от уровня. В зависимости от уровня же при активизации строки ограничивать тип выбираемых данных в отображаемой колонке, при изменении ее значения корректно заполнять одну из скрытых колонок (если нужно, конечно).

2. Добавить скрытую колонку булево типа "ЭтоГруппа", или числового "Уровень". Заполнять ее при обходе результата запроса. Настроить условное оформление формы в зависимости от значения в новой колонке. В оформлении указать не то "Видимость=Ложь", не то "Отображать=Ложь", точно не помню.
3. DmitriyPopow 33 26.11.19 08:13 Сейчас в теме
а если посмотреть результатЗапроса.Выгрузить() там отображается как надо?
Может у вас ЭлементФормы не дерево?
4. Kovekh 26.11.19 08:15 Сейчас в теме
В запросе подправьте итоги.
Скорее всего, Вам нужно:
Итоги
Сумма(Количество),
Сумма(Сумма)
По
Справочник1


И тогда отображение должно быть как Вы хотите.Хотя, вроде, тогда всё равно на дочернем уровне будут светиться поля и всё равно нужно тогда дерево заполнять вручную циклом)
16. user1559729 23.12.21 16:31 Сейчас в теме
(9) Почему у меня не работает Группировка = ДанныеДляДерева.Строки.Добавить(); ?
Пишет ошибку "Несоответствие типов". Делаю в модуле формы &НаСервере.
18. dhurricane 23.12.21 16:54 Сейчас в теме
(16) Скорее всего имя переменной "Группировка" неудачное. Например, совпало с именем свойства формы. Попробуйте использовать другое имя, например "ГруппаДерева".
17. user1559729 23.12.21 16:43 Сейчас в теме
(8) И с этим кодом такая же ошибка - "Несоответствие типов".
19. user1559729 23.12.21 16:59 Сейчас в теме
20. AtamanovYS 149 28.12.21 13:42 Сейчас в теме
1. Нужно ПоГруппировкам обходить, а не ПоГруппировкамСИерархией. Это другое. Для иерархических справочников. У вас в запросе нет иерархии
2. Не нужно ничего дообрабатывать в цикле. Всё в запросе делается. Через ISNULL в поле итогов можно назначить разное значение для итогового поля, в зависимости от уровня группировки. И вообще в итогах можно произвольные выражения делать любой сложности. Сделал в демоБазе пример. Думаю из него понятно, как это можно к другой любой задаче использовать, когда нужно дерево на форму вывести.
Примерно так:
Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|	ЗаказКлиента.Ссылка КАК Заказ
|ПОМЕСТИТЬ ВтЗаказы
|ИЗ
|	Документ.ЗаказКлиента КАК ЗаказКлиента
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
|	ВтЗаказы.Заказ КАК Заказ,
|	РеализацияТоваровУслугТовары.Ссылка КАК Реализация,
|	РеализацияТоваровУслугТовары.Цена КАК Цена,
|	РеализацияТоваровУслугТовары.Ссылка.Менеджер КАК Менеджер,
|	РеализацияТоваровУслугТовары.Количество КАК Количество,
|	РеализацияТоваровУслугТовары.Номенклатура КАК ДокументТовар,
|	РеализацияТоваровУслугТовары.Сумма КАК Сумма
|ИЗ
|	ВтЗаказы КАК ВтЗаказы
|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
|		ПО ВтЗаказы.Заказ = РеализацияТоваровУслугТовары.ЗаказКлиента
|ИТОГИ
|	ВЫБОР
|		КОГДА Реализация ЕСТЬ NULL
|			ТОГДА ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка)
|		ИНАЧЕ МАКСИМУМ(Менеджер)
|	КОНЕЦ КАК Менеджер,
|	СУММА(Количество),
|	ЕСТЬNULL(Реализация, Заказ) КАК ДокументТовар,
|	СУММА(Сумма)
|ПО
|	Заказ,
|	Реализация";

ЗначениеВРеквизитФормы(Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам), "Дерево");

Показать
Прикрепленные файлы:
user755340; assa; +2 Ответить
21. _DaFNa_ 06.03.23 11:05 Сейчас в теме
(20) Подскажите, пожалуйста, почему у меня ошибка, делаю так же

Ошибка при вызове метода контекста (ЗначениеВРеквизитФормы)
по причине:
Недопустимое значение параметра (параметр номер '2')
Прикрепленные файлы:
22. ImHunter 315 06.03.23 11:10 Сейчас в теме
(21) Неодинаково заименованы поля запроса и колонки дерева.
24. _DaFNa_ 07.03.23 02:29 Сейчас в теме
(22) Спасибо большое! Так и оказалось
23. coollerinc 188 06.03.23 13:21 Сейчас в теме
Всегда это делаю через условное оформление и ЗначениеВРеквизитФормы(ДанныеДляДерева, "ДеревоНаФорме");
Оставьте свое сообщение

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