Имя: Пароль:
1C
 
Структура организации с должностями и физлицами в виде дерева.
,
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) а выборка обрабатывается так:

ур1=...Выбрать(...)
Пока ур1.Следующий() цикл
   ур2=ур1.выбрать();
   Пока ур2.Следующий() цикл
   КонецЦикла;
КонецЦикла;
[\1c]
Крайне похоже на то, что представляешь результаты выборки простой таблицей, а там группировки, т.е. что-бы получить следующий уровень нужно ещё раз Выбрать().
7 Fedor-1971
 
07.10.15
09:22
6+ почему-то тэги перестали работать
8 Лефмихалыч
 
07.10.15
09:25

ур1=...Выбрать(...)
Пока ур1.Следующий() цикл
   ур2=ур1.выбрать();
   Пока ур2.Следующий() цикл
   КонецЦикла;
КонецЦикла;
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
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn