|
Дерево значений | ☑ | ||
---|---|---|---|---|
0
Sova112
23.12.11
✎
18:51
|
Вывожу в документ дерево значений. Нужно в конце вывести строку итоговую по сумме колонок, именно в конце. каким механизмом можно это реализовать?
|
|||
1
Живой Ископаемый
23.12.11
✎
18:54
|
а почему строку? может в элементе формы сказать вывод подвала?
|
|||
2
Sova112
23.12.11
✎
18:58
|
там еще автоматом добавляются колонки
|
|||
3
Живой Ископаемый
23.12.11
✎
19:08
|
Наш диалог смахивает на такой:
-- Доктор, у меня вши... -- Давайте просто побреем вас налысо и помоем... -- Но у меня ведь аппендицит! |
|||
4
Sova112
23.12.11
✎
19:15
|
ну во как у меня
Строка = Неопределено; Пока Выборка.Следующий() Цикл Если Выборка.ТипЗаписи() = ТипЗаписиЗапроса.ДетальнаяЗапись Тогда Продолжить; КонецЕсли; ИмяГруппировки = Выборка.Группировка(); Если Выборка[ИмяГруппировки] = null Тогда Продолжить; КонецЕсли; Если ИмяГруппировки = "ПериодБюджета" И НЕ Строка = Неопределено Тогда Если НЕ Выборка[ИмяГруппировки] = Дата(1,1,1) Тогда ПериодСтр = Формат(Выборка[ИмяГруппировки],"ДФ=ггггММдд"); Строка["Неделя1" + ПериодСтр] = Выборка.Неделя1; Строка["Неделя2" + ПериодСтр] = Выборка.Неделя2; Строка["Неделя3" + ПериодСтр] = Выборка.Неделя3; Строка["Неделя4" + ПериодСтр] = Выборка.Неделя4; КонецЕсли; Продолжить; КонецЕсли; Если Строка = Неопределено Тогда Строка = Дерево.Строки.Добавить(); Иначе Строки = Неопределено; Если ПредУровень >= Выборка.Уровень() Тогда Пока ПредУровень > Выборка.Уровень() Цикл Строка = Строка.Родитель; ПредУровень = ПредУровень - 1; Если Строка = Неопределено Тогда Прервать; КонецЕсли; КонецЦикла; Родитель = ?(Строка = Неопределено, Неопределено, Строка.Родитель); Строки = ?(Родитель = Неопределено, Дерево.Строки, Родитель.Строки); ИначеЕсли ПредУровень < Выборка.Уровень() Тогда Строки = Строка.Строки; КонецЕсли; Если Строки = Неопределено Тогда Строки = Дерево.Строки; КонецЕсли; Строка = Строки.Добавить(); ПредУровень = Выборка.Уровень(); КонецЕсли; Строка.СтатьяБюджета = Выборка[ИмяГруппировки]; Строка.ИмяГруппировки = ИмяГруппировки; КонецЦикла; Строка = Дерево.Строки.Добавить(); - вот так хочу добавить, но не добавляется |
|||
5
Живой Ископаемый
23.12.11
✎
19:16
|
так почему (1) не подходит? без добавлений строк, просто чтобы итог был в подвале?
|
|||
6
ПесняПроЗайцев
23.12.11
✎
19:17
|
(0) Есть же Подвалы в табличном поле, если туда потом выводить. Есть Итог для дерева.
Читай же ЖКК иногда. |
|||
7
Sova112
23.12.11
✎
20:04
|
там нужно плюсовать и минусовать строки
|
|||
8
vmv
23.12.11
✎
20:12
|
(0) самое простое делать деревья формы запросами, как это делают в 8.2 на УФ практически - уже стандарт.
самое геморное, но тоже просто всмомнить первый курс и рекурсии и написать методы ВсплытиеУзлаСРасчетомИтогов(Узел) ПогружениеУзлаСРасчетомИтогов(Узел) Всегда есть и третий вариант, но как правило там банальный стиль решения - через Ж |
|||
9
vmv
23.12.11
✎
20:21
|
под 8.1 уже не актуальное свое старье кину, мож сгодится молодым друидам, ухаживающим за деревьями)
// Модуль : AddДеревья (2008) // Разработчики: ////////////////////////////////////////////////////////////////////////////////////////// // Методы получения данных деревьев ////////////////////////////////////////////////////////////////////////////////////////// Функция ПолучитьКоличествоЛистьевУзла(Узел) Экспорт Перем Строка, Листьев; Листьев = 0; Для Каждого Строка Из Узел.Строки Цикл Если Строка.Строки.Количество() = 0 Тогда Листьев = Листьев + 1; Иначе Листьев = Листьев + ПолучитьКоличествоЛистьевУзла(Строка); КонецЕсли; КонецЦикла; Возврат Листьев; КонецФункции Функция ПолучитьКоличествоПомеченныхЛистовУзла(Узел, КолонкаИмя = "Пометка") Экспорт Перем Строка, Пометок; Пометок = 0; Для Каждого Строка Из Узел.Строки Цикл Если Строка.Строки.Количество() = 0 Тогда Пометок = Пометок + ?(Строка[КолонкаИмя] = 0, 0, 1); Иначе Пометок = Пометок + ПолучитьКоличествоПомеченныхЛистовУзла(Строка, КолонкаИмя); КонецЕсли; КонецЦикла; Возврат Пометок; КонецФункции Функция ПолучитьКоличествоВсехИПомеченныхЛистовУзла(Узел, КолонкаИмя = "Пометка") Экспорт Перем мЛистья; мЛистья = Новый Массив(2); мЛистья[0] = 0; // количество всех листов мЛистья[1] = 0; // количество помеченных листов Возврат ОбходПолучитьКоличествоВсехИПомеченныхЛистовУзла(Узел, КолонкаИмя, мЛистья); КонецФункции Функция ОбходПолучитьКоличествоВсехИПомеченныхЛистовУзла(Узел, КолонкаИмя, мЛистья) Экспорт Перем Строка; Для Каждого Строка Из Узел.Строки Цикл Если Строка.Строки.Количество() = 0 Тогда мЛистья[0] = мЛистья[0] + 1; мЛистья[1] = мЛистья[1] + ?(Строка[КолонкаИмя] = 0, 0, 1); Иначе ОбходПолучитьКоличествоВсехИПомеченныхЛистовУзла(Строка, КолонкаИмя, мЛистья); КонецЕсли; КонецЦикла; Возврат мЛистья; КонецФункции Функция ПолучитьПервыйЛистУзла(Узел) Экспорт Если Узел.Строки.Количество() > 0 Тогда ПолучитьПервыйЛистУзла(Узел.Строки[0]); КонецЕсли; Возврат Узел; КонецФункции Функция ПолучитьМассивПодчиненныхЛистовУзла(Узел, мСтроки) Экспорт Перем Строка; Для Каждого Строка Из Узел.Строки Цикл Если Строка.Строки.Количество() = 0 Тогда мСтроки.Добавить(Строка); Иначе ПолучитьМассивПодчиненныхЛистовУзла(Строка, мСтроки); КонецЕсли; КонецЦикла; Возврат мСтроки; КонецФункции Функция ПолучитьМассивПодчиненныхУзловУзла(Узел, мСтроки, ТабличноеПоле = Неопределено, Развернут = Истина) Экспорт Перем Строка; Для Каждого Строка Из Узел.Строки Цикл Если Строка.Строки.Количество() > 0 Тогда Если ТабличноеПоле = Неопределено Тогда мСтроки.Добавить(Строка); Иначе Если ТабличноеПоле.Развернут(Строка) = Развернут Тогда мСтроки.Добавить(Строка); КонецЕсли; КонецЕсли; ПолучитьМассивПодчиненныхУзловУзла(Строка, мСтроки, ТабличноеПоле, Развернут); КонецЕсли; КонецЦикла; Возврат мСтроки; КонецФункции Процедура УстановитьИерархическийНомерУзла(Узел, КолонкаИмяПорядок = "Порядок", КолонкаИмяКоличество = Неопределено, КолонкаИмяПометка = Неопределено) Экспорт Перем УзелСтрокиКоличество; Если Узел.Родитель = Неопределено Тогда УзелРодительСтроки = Узел.Владелец().Строки; ВышестоящийНомер = ""; Иначе УзелРодительСтроки = Узел.Родитель.Строки; ВышестоящийНомер = Узел.Родитель[КолонкаИмяПорядок] + "."; КонецЕсли; ЧЦ = Формат(СтрДлина(Формат(УзелРодительСтроки.Количество(),"ЧГ=")),"ЧГ="); Узел[КолонкаИмяПорядок] = ВышестоящийНомер + Формат(УзелРодительСтроки.Индекс(Узел), "ЧЦ="+ЧЦ+";ЧВН=;ЧН=;ЧГ="); Если КолонкаИмяКоличество <> Неопределено Тогда УстановитьКоличествоСтрокУзла(Узел, КолонкаИмяКоличество, КолонкаИмяПометка); КонецЕсли; КонецПроцедуры Процедура УстановитьКоличествоСтрокУзла(Узел, КолонкаИмяКоличество = "Иерархия", КолонкаИмяПометка = Неопределено) Экспорт Перем УзелСтрокиКоличествоВсего, УзелСтрокиКоличествоВыбрано, СтрокаКоличествоСтрокУзла; УзелСтрокиКоличествоВсего = Узел.Строки.Количество(); Если УзелСтрокиКоличествоВсего = 0 Тогда Если КолонкаИмяПометка <> Неопределено Тогда УзелСтрокиКоличествоВыбрано = ?(Узел[КолонкаИмяПометка] = 0, 0, 1); КонецЕсли; Иначе Если КолонкаИмяПометка <> Неопределено Тогда УзелСтрокиКоличествоВыбрано = Формат(Узел.Строки.Итог(КолонкаИмяПометка, Ложь), "ЧРГ=; ЧГ=0; ЧН=-"); КонецЕсли; КонецЕсли; Если УзелСтрокиКоличествоВыбрано = Неопределено Тогда СтрокаКоличествоСтрокУзла = Формат(УзелСтрокиКоличествоВсего, "ЧРГ=; ЧГ=0; ЧН=-"); ИначеЕсли УзелСтрокиКоличествоВсего = 0 Тогда СтрокаКоличествоСтрокУзла = ""; Иначе СтрокаКоличествоСтрокУзла = Формат(УзелСтрокиКоличествоВсего, "ЧРГ=; ЧГ=0; ЧН=-") + "/" + Формат(УзелСтрокиКоличествоВыбрано, "ЧРГ=; ЧГ=0; ЧН=-"); КонецЕсли; Узел[КолонкаИмяКоличество] = СтрокаКоличествоСтрокУзла; КонецПроцедуры |
|||
10
vmv
23.12.11
✎
20:21
|
//////////////////////////////////////////////////////////////////////////////////////////
// Методы модификации данных деревьев ////////////////////////////////////////////////////////////////////////////////////////// //......... Обработчики пометок Процедура ПогружениеУзлаСИзменениемПометок(Узел, Пометка, КолонкаИмя = "Пометка", Метод = Неопределено, Параметры = Неопределено) Экспорт Перем Строка; Если Метод <> Неопределено И ТипЗнч(Узел) <> Тип("ДеревоЗначений") Тогда Выполнить(Метод + " (Узел, Параметры);"); КонецЕсли; Для Каждого Строка Из Узел.Строки Цикл Строка[КолонкаИмя] = Пометка; Если Метод <> Неопределено Тогда Выполнить(Метод + " (Строка, Параметры);"); КонецЕсли; Если Строка.Строки.Количество() > 0 Тогда ПогружениеУзлаСИзменениемПометок(Строка, Пометка, КолонкаИмя, Метод, Параметры); КонецЕсли; КонецЦикла; КонецПроцедуры Процедура ВсплытиеУзлаСИзменениемПометок(Узел, КолонкаИмя = "Пометка", Метод = Неопределено, Параметры = Неопределено) Экспорт Перем Родитель, мЛистья; Родитель = Узел.Родитель; Если Родитель = Неопределено Тогда Родитель = Узел.Владелец(); Если Метод <> Неопределено Тогда Выполнить(Метод + " (Узел, Параметры);"); КонецЕсли; Иначе мЛистья = ПолучитьКоличествоВсехИПомеченныхЛистовУзла(Родитель, КолонкаИмя); Если мЛистья[0] = 0 Тогда Родитель.Пометка = 0; Иначе Если мЛистья[1] = 0 Тогда Родитель.Пометка = 0; ИначеЕсли мЛистья[0] = мЛистья[1] Тогда Родитель.Пометка = 1; Иначе Родитель.Пометка = 2; КонецЕсли; КонецЕсли; Если Метод <> Неопределено Тогда Выполнить(Метод + " (Узел, Параметры);"); КонецЕсли; ВсплытиеУзлаСИзменениемПометок(Родитель, КолонкаИмя, Метод, Параметры); КонецЕсли; КонецПроцедуры //......... Обработчики-нумераторы Процедура ПогружениеУзлаСИзменениемПорядка(Узел, Параметры) Экспорт Перем Строка; Для Каждого Строка Из Узел.Строки Цикл УстановитьИерархическийНомерУзла(Строка, Параметры["КолонкаИмяПорядок"], Параметры["КолонкаИмяКоличество"], Параметры["КолонкаИмяПометка"]); Если Строка.Строки.Количество() > 0 Тогда ПогружениеУзлаСИзменениемПорядка(Строка, Параметры); КонецЕсли; КонецЦикла; КонецПроцедуры //......... Обработчики-терминаторы Процедура ВсплытиеУзлаСУдалениемСтроки(Узел, Метод = Неопределено, Параметры = Неопределено) Экспорт Перем Родитель; Родитель = Узел.Родитель; Если Родитель = Неопределено Тогда Родитель = Узел.Владелец(); Родитель.Строки.Удалить(Узел); Если Родитель.Строки.Количество() = 0 Тогда // фенита - все строки удалены Иначе Если Метод <> Неопределено Тогда Выполнить(Метод + " (Родитель, Параметры);"); КонецЕсли; КонецЕсли; Иначе Родитель.Строки.Удалить(Узел); Если Родитель.Строки.Количество() = 0 Тогда ВсплытиеУзлаСУдалениемСтроки(Родитель, Метод, Параметры); Иначе Если Метод <> Неопределено Тогда Выполнить(Метод + " (Родитель, Параметры);"); КонецЕсли; КонецЕсли; КонецЕсли; КонецПроцедуры //......... Обработчики-калькуляторы Процедура РассчитатьИтогиУзла(Узел, мЧК, Сподчиненными = Ложь) Экспорт Если Узел.Строки.Количество() = 0 Тогда Возврат; КонецЕсли; Для Инд = 0 По мЧК.ВГраница() Цикл Узел[мЧК[Инд]] = Узел.Строки.Итог(мЧК[Инд], Сподчиненными); КонецЦикла; КонецПроцедуры Процедура ПогружениеУзлаСРасчетомИтогов(Узел, мЧК, Метод = Неопределено, Параметры = Неопределено) Экспорт Перем Строка; Для Каждого Строка Из Узел.Строки Цикл Если Строка.Строки.Количество() > 0 Тогда ПогружениеУзлаСРасчетомИтогов(Строка, мЧК, Метод, Параметры); РассчитатьИтогиУзла(Строка, мЧК); Если Метод <> Неопределено Тогда Выполнить(Метод + " (Строка, Параметры);"); КонецЕсли; КонецЕсли; КонецЦикла; КонецПроцедуры Процедура ВсплытиеУзлаСРасчетомИтогов(Узел, мЧК) Экспорт Перем Родитель; Родитель = Узел.Родитель; Если Родитель <> Неопределено Тогда РассчитатьИтогиУзла(Родитель, мЧК); ВсплытиеУзлаСРасчетомИтогов(Родитель, мЧК); КонецЕсли; КонецПроцедуры Процедура ПогружениеУзлаСВыполнениемМедотаДляЛистьев(Узел, Метод, Параметры) Экспорт Перем Строка; Если Узел.Строки.Количество() = 0 Тогда Выполнить(Метод + " (Узел, Параметры);"); Возврат; КонецЕсли; Для Каждого Строка Из Узел.Строки Цикл Если Строка.Строки.Количество() = 0 Тогда Выполнить(Метод + " (Строка, Параметры);"); Иначе ПогружениеУзлаСВыполнениемМедотаДляЛистьев(Строка, Метод, Параметры); КонецЕсли; КонецЦикла; КонецПроцедуры //......... Обработчики-трансформаторы // Общая функция проверки подчинения двух узлов дерева значений Функция Узел1ВПодчиненииУзел2ДляДереваЗначений(Узел1, Узел2) Экспорт Перем Родитель, БулевоУзел1ВПодчиненииУзел2; Если ТипЗнч(Узел1) = Тип("ДеревоЗначений") Тогда Возврат Ложь; КонецЕсли; Если Узел1 = Неопределено Тогда Возврат Ложь; КонецЕсли; БулевоУзел1ВПодчиненииУзел2 = Ложь; Родитель = Узел1.Родитель; Если Родитель = Узел2 Тогда БулевоУзел1ВПодчиненииУзел2 = Истина; Иначе Если Родитель <> Неопределено Тогда БулевоУзел1ВПодчиненииУзел2 = Узел1ВПодчиненииУзел2ДляДереваЗначений(Родитель, Узел2); КонецЕсли; КонецЕсли; Возврат БулевоУзел1ВПодчиненииУзел2; КонецФункции // Передаем "ДеревоЗначений" и "Узел". Уставливаем "Родитель" узла и возвращем индекс узла в этом родителе. Функция ОпределитьРодителяИИндексУзлаДереваЗначений(ДеревоЗначений, Узел, Родитель) Если Узел = Неопределено Тогда Родитель = ДеревоЗначений; Индекс = Неопределено; ИначеЕсли Узел = ДеревоЗначений Тогда Родитель = ДеревоЗначений; Индекс = Неопределено; Иначе Если Узел.Родитель = Неопределено Тогда Родитель = ДеревоЗначений; Иначе Родитель = Узел.Родитель; КонецЕсли; Индекс = Родитель.Строки.Индекс(Узел); КонецЕсли; Возврат Индекс; КонецФункции // УзелКуда: Неопределено или СтрокаДереваЗначений. УзелОткуда: СтрокаДереваЗначений. Функция ПереместитьУзелВДеревеЗначений(УзелКуда, УзелОткуда) Экспорт Перем УзелКудаРодитель , УзелОткудаРодитель; Перем УзелКудаИндекс , УзелОткудаИндекс; Перем УзелКудаНовыйУзел, УзелКудаНовыйУзелНоваяСтрока; Если УзелКуда = УзелОткуда Тогда Возврат УзелОткуда; КонецЕсли; ДеревоЗначений = УзелОткуда.Владелец(); // При перемещении: ТипЗнч(УзелОткуда) = "СтрокаДереваЗначений" УзелКудаИндекс = ОпределитьРодителяИИндексУзлаДереваЗначений(ДеревоЗначений, УзелКуда, УзелКудаРодитель); УзелОткудаИндекс = ОпределитьРодителяИИндексУзлаДереваЗначений(ДеревоЗначений, УзелОткуда, УзелОткудаРодитель); Если УзелКуда = Неопределено И УзелОткудаРодитель = ДеревоЗначений Тогда // Попытка переместить строку из нулевого уровня за пределы дерева, // т.е. она все равно попадет в нулевой уровень без изменений. Просто делаем возврат. Возврат УзелОткуда; КонецЕсли; // Если в УзелКуда перемещаем УзелОткуда, который является вышестоящим родителем, // то УзелКуда смещаем на уровень с УзелОткуда, иначе будет выход в бесконечную рекурсию или сбой. Если Узел1ВПодчиненииУзел2ДляДереваЗначений(УзелКуда, УзелОткуда) Тогда УзелКуда = ПереместитьУзелВДеревеЗначений(УзелОткудаРодитель, УзелКуда); КонецЕсли; Если УзелКуда = Неопределено Тогда УзелНовый = ДеревоЗначений.Строки.Добавить(); Иначе Если УзелКудаИндекс = Неопределено Тогда УзелНовый = УзелКуда.Строки.Добавить(); Иначе УзелНовый = УзелКуда.Строки.Вставить(УзелКудаИндекс); КонецЕсли; КонецЕсли; ЗаполнитьЗначенияСвойств(УзелНовый, УзелОткуда); //ДеревоЗначений.ВыбратьСтроку("Отладка-Создан узел", УзелНовый); Пока УзелОткуда.Строки.Количество() > 0 Цикл ПереместитьУзелВДеревеЗначений(УзелНовый, УзелОткуда.Строки[0]); КонецЦикла; //ДеревоЗначений.ВыбратьСтроку("Отладка-Удаляем узел", УзелОткуда); УзелОткудаРодитель.Строки.Удалить(УзелОткуда); //ДеревоЗначений.ВыбратьСтроку("Отладка-Выход", УзелНовый); Возврат УзелНовый; КонецФункции |
|||
11
vmv
23.12.11
✎
20:22
|
//////////////////////////////////////////////////////////////////////////////////////////
// Методы смены представления данных дерева в табличном поле ////////////////////////////////////////////////////////////////////////////////////////// Процедура РазвернутьСтроку(ТабличноеПоле, ТекущиеДанные, Сподчиненными = Истина) Экспорт Если ТекущиеДанные = Неопределено Тогда Возврат; КонецЕсли; Если ТекущиеДанные.Строки.Количество() = 0 Тогда Возврат; КонецЕсли; ТабличноеПоле.Развернуть(ТекущиеДанные, Сподчиненными); КонецПроцедуры Процедура РазвернутьВсе(ТабличноеПоле, Сподчиненными = Истина) Экспорт Перем СтрокаДерева; Для Каждого СтрокаДерева Из ТабличноеПоле.Значение.Строки Цикл РазвернутьСтроку(ТабличноеПоле, СтрокаДерева, Сподчиненными); КонецЦикла; КонецПроцедуры Процедура СвернутьСтроку(ТабличноеПоле, ТекущиеДанные, Сподчиненными = Истина) Экспорт Если ТекущиеДанные = Неопределено Тогда Возврат; КонецЕсли; Если ТекущиеДанные.Строки.Количество() = 0 Тогда Возврат; КонецЕсли; ТабличноеПоле.Свернуть(ТекущиеДанные); Если Сподчиненными Тогда СвернутьВсеПодчиненныеУзлыУзла(ТекущиеДанные, ТабличноеПоле); КонецЕсли; КонецПроцедуры Процедура СвернутьВсе(ТабличноеПоле, Сподчиненными = Истина) Экспорт Перем СтрокаДерева; Для Каждого СтрокаДерева Из ТабличноеПоле.Значение.Строки Цикл СвернутьСтроку(ТабличноеПоле, СтрокаДерева, Сподчиненными); КонецЦикла; КонецПроцедуры Процедура СвернутьВсеПодчиненныеУзлыУзла(Узел, ТабличноеПоле) Экспорт Перем Строка; Для Каждого Строка Из Узел.Строки Цикл Если Строка.Строки.Количество() > 0 Тогда Если ТабличноеПоле.Развернут(Строка) Тогда ТабличноеПоле.Свернуть(Строка); КонецЕсли; СвернутьВсеПодчиненныеУзлыУзла(Строка, ТабличноеПоле); КонецЕсли; КонецЦикла; КонецПроцедуры Процедура ВыделитьМассивСтрокТабличногоПоля(ТабличноеПоле, мСтроки) Экспорт Перем Инд; ТабличноеПоле.ВыделенныеСтроки.Очистить(); Для Инд = 0 По мСтроки.ВГраница() Цикл ТабличноеПоле.ВыделенныеСтроки.Добавить(мСтроки[Инд]); КонецЦикла; КонецПроцедуры |
|||
12
ILM
гуру
23.12.11
✎
22:18
|
(11) А что ещё подобного есть?
Такое нужно паддаванам давать для выработки стиля. По деревьям, иногда решения через процедуры менее напрягают сервер, чем разовые запросы, да еще если механизм ВТ задействуется. Например когда дерево огромное и нужно подгружать части дерева. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |