|
Структура организации с должностями и физлицами в виде дерева. | ☑ | ||
---|---|---|---|---|
0
patria0muerte
07.10.15
✎
08:38
|
День добрый, коллеги!
Для одной обработки понадобилось вывести на форму дерево вида: - Подразделение - - Должность - - - Физлицо Как бы ничего сложно, делай запрос, итоги, и вперед. Но подразделения необходимо выводить с иерархией (т.е. как стандартная форма выбора у подразделений). Т.е. дерево должно иметь вид такой: - Подразделение 1 - - Подразделение 1.1 - - - Должность 1 - - - Должность 2 - - - - Физлицо 1 - - Подразделение 1.2 - - Должность 3 и т.д. Делаю запрос, в запросах итоги вида: |ИТОГИ ПО | Подразделение ИЕРАРХИЯ, | ДолжностнаяИнструкция, | ФизЛицо"; А вот обойти - не получается. Запутался во всех этих типах записей запроса и именах группировок. Может у кого примеры есть? Или кто носом ткнет в образец, где помимо иерархии подразделений необходимо выводить еще подчиненные данные к ним? |
|||
1
Лефмихалыч
07.10.15
✎
08:41
|
ВЫбрать(ОБходГруппировкиЗапроса.ПоГруппировкамСИерархией)
|
|||
2
patria0muerte
07.10.15
✎
08:42
|
(1) Ну это то понятно. Но глубже первого уровня почему то не идет. Видимо все дело в типах записи запроса.
Для тех, у которых тип = "Итоги по иерархии" - отрабатывает. Для тех у кого тип = "Итоги по группировке" - не отрабатывает. |
|||
3
Лефмихалыч
07.10.15
✎
08:43
|
(2) может потому, что глубже первого уровня в запросе ни чего нет?
|
|||
4
patria0muerte
07.10.15
✎
08:44
|
(3) Есть. Сейчас даже проверил еще раз...
|
|||
5
Лефмихалыч
07.10.15
✎
08:46
|
(4) значит ты что-то накосячил в коде обхода выборки
|
|||
6
Fedor-1971
07.10.15
✎
09:21
|
(4) а выборка обрабатывается так:
|
|||
7
Fedor-1971
07.10.15
✎
09:22
|
6+ почему-то тэги перестали работать
|
|||
8
Лефмихалыч
07.10.15
✎
09:25
|
|
|||
9
Лефмихалыч
07.10.15
✎
09:26
|
+(8) C должна быть большой и латинской
|
|||
10
Fedor-1971
07.10.15
✎
09:28
|
(9) Спасибо.
|
|||
11
patria0muerte
07.10.15
✎
09:37
|
(6) Благодарю. Но и об этом я знаю. Еще раз выбрать - не получится, т.к. не известен уровень вложенности подразделений. На данный момент - процедура заполнения дерева такова:
Процедура ЗаполнениеДерева(СтрокаДерева, Выборка, ЭтоПервыйУровень = Ложь, ИмяГруппировки) ТекущаяВыборка = Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией, ИмяГруппировки); Пока ТекущаяВыборка.Следующий() Цикл Если ЭтоПервыйУровень Тогда НоваяСтрока = СтрокаДерева.Строки.Добавить(); НоваяСтрока.Субъекты = ТекущаяВыборка.Подразделение; ЗаполнениеДерева(НоваяСтрока, ТекущаяВыборка, Ложь, "Подразделение"); ИначеЕсли (ТекущаяВыборка.ТипЗаписи() = ТипЗаписиЗапроса.ИтогПоИерархии) Тогда Если НЕ ТекущаяВыборка.Подразделение = Выборка.Подразделение Тогда НоваяСтрока = СтрокаДерева.Строки.Добавить(); НоваяСтрока.Субъекты = ТекущаяВыборка.Подразделение; ЗаполнениеДерева(НоваяСтрока, ТекущаяВыборка, Ложь, "Подразделение"); КонецЕсли; ИначеЕсли (ТекущаяВыборка.ТипЗаписи() = ТипЗаписиЗапроса.ИтогПоГруппировке) И ИмяГруппировки = "Подразделение" Тогда ЗаполнениеДерева(СтрокаДерева, ТекущаяВыборка, Ложь, "ДолжностнаяИнструкция"); ИначеЕсли (ТекущаяВыборка.ТипЗаписи() = ТипЗаписиЗапроса.ИтогПоГруппировке) И ИмяГруппировки = "ДолжностнаяИнструкция" Тогда НоваяСтрока = СтрокаДерева.Строки.Добавить(); НоваяСтрока.Субъекты = ТекущаяВыборка.ДолжностнаяИнструкция; ЗаполнениеДерева(НоваяСтрока, ТекущаяВыборка, Ложь, ""); КонецЕсли; КонецЦикла; КонецПроцедуры Но не взлетает. Сейчас экспериментирую.. P.S. ДолжностнаяИнструкция - здесь - вместо должности |
|||
12
vde69
07.10.15
✎
09:37
|
потихоньку делаю очень хитрый сабж, вроде очень хорошо выходит :)
сейчас нахожусь на второй итерации (переделываю на скорую руку сделанный код на универсальный) подскажите удобную графическую форму штатного расписания будет графически отрисованы отделы с руководителями в иерархии, далее в подчиненности функциональные единицы, и дальше сотрудники/вакансии. на базе этой схемы в программе будут распределятся 100% прав, кроме того будут формироваться персональные должностные инструкции на основании множественной функциональной совместительности, и будет реализована (о ужас) множественная подчиненность сотрудника при совмещении функционала (у сотрудника несколько руководителей) |
|||
13
Fedor-1971
07.10.15
✎
09:58
|
(11)Вот это:
ТекущаяВыборка = Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией, ИмяГруппировки); противоречит (0) там иерархия есть только у подразделения Возможно я ошибаюсь но для нижних уровней нужно ОбходРезультатаЗапроса.ПоГруппировкам |
|||
14
patria0muerte
07.10.15
✎
10:32
|
Разобрался. В итоге - все в кучу, и накосячил сам кое где при тестах в коде, и да, надо использовать (13), сначала полагал, что только ОбходРезультатаЗапроса.ПоГруппировкамСИерархией обойдусь
Если есть желание/настроение - покритикуйте. Вот рабочий код: Процедура ЗаполнениеДерева(СтрокаДерева, Выборка, ЭтоПервыйУровень = Ложь, ТипОбхода, ИмяГруппировки) ТекущаяВыборка = Выборка.Выбрать(ТипОбхода, ИмяГруппировки); Пока ТекущаяВыборка.Следующий() Цикл Если ЭтоПервыйУровень ИЛИ ТекущаяВыборка.ТипЗаписи() = ТипЗаписиЗапроса.ИтогПоИерархии Тогда Если ЭтоПервыйУровень ИЛИ НЕ ТекущаяВыборка.Подразделение = Выборка.Подразделение Тогда НоваяСтрока = СтрокаДерева.Строки.Добавить(); НоваяСтрока.Субъекты = ТекущаяВыборка.Подразделение; ЗаполнениеДерева(НоваяСтрока, ТекущаяВыборка, Ложь, ОбходРезультатаЗапроса.ПоГруппировкамСИерархией, "Подразделение"); Иначе ЗаполнениеДерева(СтрокаДерева, ТекущаяВыборка, Ложь, ОбходРезультатаЗапроса.ПоГруппировкамСИерархией, "Подразделение"); КонецЕсли; ИначеЕсли ТекущаяВыборка.ТипЗаписи() = ТипЗаписиЗапроса.ИтогПоГруппировке И ИмяГруппировки = "Подразделение" Тогда Если НЕ ТекущаяВыборка.Подразделение = Выборка.Подразделение Тогда НоваяСтрока = СтрокаДерева.Строки.Добавить(); НоваяСтрока.Субъекты = ТекущаяВыборка.Подразделение; ЗаполнениеДерева(НоваяСтрока, ТекущаяВыборка, Ложь, ОбходРезультатаЗапроса.ПоГруппировкам, "ДолжностнаяИнструкция"); Иначе ЗаполнениеДерева(СтрокаДерева, ТекущаяВыборка, Ложь, ОбходРезультатаЗапроса.ПоГруппировкам, "ДолжностнаяИнструкция"); КонецЕсли; ИначеЕсли (ТекущаяВыборка.ТипЗаписи() = ТипЗаписиЗапроса.ИтогПоГруппировке) И ИмяГруппировки = "ДолжностнаяИнструкция" Тогда Если ЗначениеЗаполнено(ТекущаяВыборка.ДолжностнаяИнструкция) Тогда НоваяСтрока = СтрокаДерева.Строки.Добавить(); НоваяСтрока.Субъекты = ТекущаяВыборка.ДолжностьОрганизации; ЗаполнениеДерева(НоваяСтрока, ТекущаяВыборка, Ложь,ОбходРезультатаЗапроса.ПоГруппировкам, ""); Иначе ЗаполнениеДерева(СтрокаДерева, ТекущаяВыборка, Ложь,ОбходРезультатаЗапроса.ПоГруппировкам, ""); КонецЕсли; ИначеЕсли (ТекущаяВыборка.ТипЗаписи() = ТипЗаписиЗапроса.ДетальнаяЗапись) И ИмяГруппировки = "" Тогда Если ЗначениеЗаполнено(ТекущаяВыборка.Физлицо) Тогда НоваяСтрока = СтрокаДерева.Строки.Добавить(); НоваяСтрока.Субъекты = ТекущаяВыборка.Физлицо; КонецЕсли; КонецЕсли; КонецЦикла; КонецПроцедуры |
|||
15
patria0muerte
07.10.15
✎
10:40
|
И да, всем спасибо за помощь!
|
|||
16
НЕА123
07.10.15
✎
10:42
|
(14)
ДеревоФормы=Запрос.Выполнить.Выгрузить(ОбходРезультатаЗапроса .ПоГруппировкамСИерархией) ? |
|||
17
patria0muerte
07.10.15
✎
10:45
|
(16) Ты б видел то дерево, которое 1С формирует. Там вложеность черте как. Так то бы конечно легко было.
|
|||
18
Лефмихалыч
07.10.15
✎
11:00
|
(11) Рекурсия тут более чем не нужна совершенно нафиг
|
|||
19
Косяк
07.10.15
✎
12:24
|
(14)в виде картинки покаж
|
|||
20
patria0muerte
08.10.15
✎
02:13
|
(18) А как же без нее, уважаемый? Уровень вложенности подразделений же мне не известен заранее.
|
|||
21
patria0muerte
08.10.15
✎
02:26
|
(19) Вот так дерево в результате выглядит:
http://hkar.ru/Ec0V |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |