Имя: Пароль:
1C
1С v8
Вопрос по работе со справочником подразделений
0 не_1Снег
 
07.11.12
12:43
У нас штатная структура в 4 этажа: Служба->Управление->Отдел->Группа
Делаю внешний отчет по штатке в соответствии с утвержденной у нас формой, т.е. вместо одной колонки - подразделение, выводятся все 4 колонки, т.е. Служба->Управление->Отдел->Группа.

Все нормально, но на некоторых почему то не выводятся по 2 предыдущих уровна. Открываю справочник ПодразделенияОрганизация, смотрю глазами, там все в порядке. Где неправильно и что?

Вот фрагмент кода:

Функция ПолучитьВышестоящееПодразделение(КодПодр)  
   
 Подр = Справочники.ПодразделенияОрганизаций.НайтиПоКоду(КодПодр);        
 Если Подр <> Справочники.ПодразделенияОрганизаций.ПустаяСсылка() Тогда
   Возврат Подр.Родитель  
 Иначе
   Сообщить("Вышестоящее подразделение для кода: "+КодПодр+" не надено!");
   Возврат Справочники.ПодразделенияОрганизаций.ПустаяСсылка();  
 КонецЕсли;

КонецФункции    

//........................

   Пока ВыборкаДетали.Следующий() Цикл                
       ОбластьСтрокаДоНадбавок.Параметры.Заполнить(ВыборкаДетали);        
       
       Код = ВыборкаДетали.Код;
       Подр = Справочники.ПодразделенияОрганизаций.НайтиПоКоду(Код);        
       Уровень = Подр.Уровень(); //Текущий уровень строки штатной единицы
       ОбластьСтрокаДоНадбавок.Параметры.ПодразделениеОрганизацииКод = Цел(Код);
       
       Если Уровень = 0 Тогда
         ОбластьСтрокаДоНадбавок.Параметры.Служба     = ВыборкаДетали.ПодразделениеОрганизации;    
         ОбластьСтрокаДоНадбавок.Параметры.Управление = "";
         ОбластьСтрокаДоНадбавок.Параметры.Отдел      = "";
         ОбластьСтрокаДоНадбавок.Параметры.Группа     = "";
         КонецЕсли;  
     
       Если Уровень = 1 Тогда
         ОбластьСтрокаДоНадбавок.Параметры.Управление = ВыборкаДетали.ПодразделениеОрганизации;              
         СлужбаСсылка = ПолучитьВышестоящееПодразделение(Код);
         ОбластьСтрокаДоНадбавок.Параметры.Служба = СлужбаСсылка;          
         ОбластьСтрокаДоНадбавок.Параметры.Отдел      = "";
         ОбластьСтрокаДоНадбавок.Параметры.Группа     = "";          
         КонецЕсли;  
         
       Если Уровень = 2 Тогда
         ОбластьСтрокаДоНадбавок.Параметры.Отдел = ВыборкаДетали.ПодразделениеОрганизации;    
         УправлениеСсылка = ПолучитьВышестоящееПодразделение(Код);          
         ОбластьСтрокаДоНадбавок.Параметры.Управление = УправлениеСсылка;
         
         СлужбаСсылка = ПолучитьВышестоящееПодразделение(УправлениеСсылка.Код);          
         ОбластьСтрокаДоНадбавок.Параметры.Служба = СлужбаСсылка;
         ОбластьСтрокаДоНадбавок.Параметры.Группа     = "";          
       КонецЕсли;  

       Если Уровень = 3 Тогда        
         ОбластьСтрокаДоНадбавок.Параметры.Группа = ВыборкаДетали.ПодразделениеОрганизации;    
         ОтделСсылка = ПолучитьВышестоящееПодразделение(ВыборкаДетали.Код);          
         ОбластьСтрокаДоНадбавок.Параметры.Отдел = ОтделСсылка;
         
         УправлениеСсылка = ПолучитьВышестоящееПодразделение(ОтделСсылка.Код);          
         ОбластьСтрокаДоНадбавок.Параметры.Управление = УправлениеСсылка;          
         
         Службассылка = ПолучитьВышестоящееПодразделение(УправлениеСсылка.Код);          
         ОбластьСтрокаДоНадбавок.Параметры.Служба = Службассылка;      
       КонецЕсли;
1 vmv
 
07.11.12
12:46
(0) я не вижу рекурсии в этом блоке г-кода, чувак

можешь быть свободен, вернее бегом изучать классические методы перебора иерархий
2 не_1Снег
 
07.11.12
12:49
Вот запрос, все путем

"
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
|    ВЫБОР
|        КОГДА РаботникиОрганизацийСрезПоследних.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
|                И РаботникиОрганизацийСрезПоследних.ПериодЗавершения <= &Период
|            ТОГДА РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизацииЗавершения
|        ИНАЧЕ РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации
|    КОНЕЦ КАК ПодразделениеОрганизации,
|    ВЫБОР
|        КОГДА РаботникиОрганизацийСрезПоследних.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
|                И РаботникиОрганизацийСрезПоследних.ПериодЗавершения <= &Период
|            ТОГДА РаботникиОрганизацийСрезПоследних.ДолжностьЗавершения
|        ИНАЧЕ РаботникиОрганизацийСрезПоследних.Должность
|    КОНЕЦ КАК Должность,
|    СУММА(ВЫБОР
|            КОГДА РаботникиОрганизацийСрезПоследних.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
|                    И РаботникиОрганизацийСрезПоследних.ПериодЗавершения <= &Период
|                ТОГДА РаботникиОрганизацийСрезПоследних.ЗанимаемыхСтавокЗавершения
|            ИНАЧЕ РаботникиОрганизацийСрезПоследних.ЗанимаемыхСтавок
|        КОНЕЦ) КАК ОсвобожденныхСтавок
|ПОМЕСТИТЬ ОсворбожденныеСтавки
|ИЗ
|    (ВЫБРАТЬ
|        СотрудникиОсвободившиеСтавкиВОрганизацияхСрезПоследних.Сотрудник КАК Сотрудник,
|        СотрудникиОсвободившиеСтавкиВОрганизацияхСрезПоследних.Организация КАК Организация,
|        ВЫБОР
|            КОГДА СотрудникиОсвободившиеСтавкиВОрганизацияхСрезПоследних.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
|                    И СотрудникиОсвободившиеСтавкиВОрганизацияхСрезПоследних.ПериодЗавершения <= &Период
|                ТОГДА СотрудникиОсвободившиеСтавкиВОрганизацияхСрезПоследних.ОсвобождатьСтавкуЗавершения
|            ИНАЧЕ СотрудникиОсвободившиеСтавкиВОрганизацияхСрезПоследних.ОсвобождатьСтавку
|        КОНЕЦ КАК ОсвобождатьСтавки
|    ИЗ
|        РегистрСведений.СотрудникиОсвободившиеСтавкиВОрганизациях.СрезПоследних(&Период, ) КАК СотрудникиОсвободившиеСтавкиВОрганизацияхСрезПоследних
|    ГДЕ
|        ВЫБОР
|                КОГДА СотрудникиОсвободившиеСтавкиВОрганизацияхСрезПоследних.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
|                        И СотрудникиОсвободившиеСтавкиВОрганизацияхСрезПоследних.ПериодЗавершения <= &Период
|                    ТОГДА СотрудникиОсвободившиеСтавкиВОрганизацияхСрезПоследних.ОсвобождатьСтавкуЗавершения
|                ИНАЧЕ СотрудникиОсвободившиеСтавкиВОрганизацияхСрезПоследних.ОсвобождатьСтавку
|            КОНЕЦ) КАК СотрудникиОсовободившиеставки
|        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РаботникиОрганизаций.СрезПоследних(&Период, ) КАК РаботникиОрганизацийСрезПоследних
|        ПО СотрудникиОсовободившиеставки.Сотрудник = РаботникиОрганизацийСрезПоследних.Сотрудник
|            И СотрудникиОсовободившиеставки.Организация = РаботникиОрганизацийСрезПоследних.Организация
|ГДЕ
|    ВЫБОР
|            КОГДА РаботникиОрганизацийСрезПоследних.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
|                    И РаботникиОрганизацийСрезПоследних.ПериодЗавершения <= &Период
|                ТОГДА РаботникиОрганизацийСрезПоследних.ПричинаИзмененияСостоянияЗавершения
|            ИНАЧЕ РаботникиОрганизацийСрезПоследних.ПричинаИзмененияСостояния
|        КОНЕЦ <> ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)
|
|СГРУППИРОВАТЬ ПО
|    ВЫБОР
|        КОГДА РаботникиОрганизацийСрезПоследних.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
|                И РаботникиОрганизацийСрезПоследних.ПериодЗавершения <= &Период
|            ТОГДА РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизацииЗавершения
|        ИНАЧЕ РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации
|    КОНЕЦ,
|    ВЫБОР
|        КОГДА РаботникиОрганизацийСрезПоследних.ПериодЗавершения <> ДАТАВРЕМЯ(1, 1, 1)
|                И РаботникиОрганизацийСрезПоследних.ПериодЗавершения <= &Период
|            ТОГДА РаботникиОрганизацийСрезПоследних.ДолжностьЗавершения
|        ИНАЧЕ РаботникиОрганизацийСрезПоследних.Должность
|    КОНЕЦ
|;
|
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
|    ШтатноеРасписаниеОрганизаций.ПодразделениеОрганизации.Код КАК Код,
|    ШтатноеРасписаниеОрганизаций.ПодразделениеОрганизации.Владелец КАК Организация,
|    ШтатноеРасписаниеОрганизаций.КоличествоСтавок КАК КоличествоСтавок,
|    ЕСТЬNULL(ЗанятыеШтатныеЕдиницыОрганизаций.КоличествоСтавокОстаток, 0) - ЕСТЬNULL(ОсворбожденныеСтавки.ОсвобожденныхСтавок, 0) КАК ЗанятоСтавок,
|    ШтатноеРасписаниеОрганизаций.КоличествоСтавок - ЕСТЬNULL(ЗанятыеШтатныеЕдиницыОрганизаций.КоличествоСтавокОстаток, 0) + ЕСТЬNULL(ОсворбожденныеСтавки.ОсвобожденныхСтавок, 0) КАК Вакантно,
|    ШтатноеРасписаниеОрганизаций.ПодразделениеОрганизации КАК ПодразделениеОрганизации,
|    ШтатноеРасписаниеОрганизаций.Должность КАК Должность,
|    ШтатноеРасписаниеОрганизаций.ГрафикРаботы КАК ГрафикРаботы,
|    ШтатноеРасписаниеОрганизаций.ВидТарифнойСтавки КАК ВидТарифнойСтавки,
|    ШтатноеРасписаниеОрганизаций.ВалютаТарифнойСтавки КАК ВалютаТарифнойСтавки,
|    ШтатноеРасписаниеОрганизаций.МинимальнаяТарифнаяСтавка КАК МинимальнаяТарифнаяСтавка,
|    ШтатноеРасписаниеОрганизаций.МаксимальнаяТарифнаяСтавка КАК МаксимальнаяТарифнаяСтавка,
|    СведенияОШтатныхЕдиницахОрганизации.Информация КАК Информация,
|    СведенияОШтатныхЕдиницахОрганизации.ДолжностныеОбязанности КАК ДолжностныеОбязанности,
|    СведенияОШтатныхЕдиницахОрганизации.ДолженЗнать КАК ДолженЗнать,
|    СведенияОШтатныхЕдиницахОрганизации.ТребованияККвалификации КАК ТребованияККвалификации
|{ВЫБРАТЬ
|    Организация.*,
|    КоличествоСтавок,
|    ЗанятоСтавок,
|    Вакантно,
|    ПодразделениеОрганизации.*,
|    Должность.*,
|    ГрафикРаботы.*,
|    ВидТарифнойСтавки,
|    ВалютаТарифнойСтавки,
|    МинимальнаяТарифнаяСтавка,
|    МаксимальнаяТарифнаяСтавка,
|    Информация,
|    ДолжностныеОбязанности,
|    ДолженЗнать,
|    ТребованияККвалификации}
|ИЗ
|    РегистрСведений.ШтатноеРасписаниеОрганизаций.СрезПоследних(&Период, {(ПодразделениеОрганизации).* КАК ПодразделениеОрганизации, (Должность).* КАК Должность, (ПодразделениеОрганизации.Владелец).* КАК Организация}) КАК ШтатноеРасписаниеОрганизаций
|        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗанятыеШтатныеЕдиницыОрганизаций.Остатки(&ДатаПослеАктуальности, {(ПодразделениеОрганизации).* КАК ПодразделениеОрганизации, (Должность).* КАК Должность, (ПодразделениеОрганизации.Владелец).* КАК Организация}) КАК ЗанятыеШтатныеЕдиницыОрганизаций
|        ПО ШтатноеРасписаниеОрганизаций.Должность = ЗанятыеШтатныеЕдиницыОрганизаций.Должность
|            И ШтатноеРасписаниеОрганизаций.ПодразделениеОрганизации = ЗанятыеШтатныеЕдиницыОрганизаций.ПодразделениеОрганизации
|        {ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОШтатныхЕдиницахОрганизаций КАК СведенияОШтатныхЕдиницахОрганизации
|        ПО ШтатноеРасписаниеОрганизаций.Должность = СведенияОШтатныхЕдиницахОрганизации.Должность
|            И ШтатноеРасписаниеОрганизаций.ПодразделениеОрганизации = СведенияОШтатныхЕдиницахОрганизации.ПодразделениеОрганизации}
|        ЛЕВОЕ СОЕДИНЕНИЕ ОсворбожденныеСтавки КАК ОсворбожденныеСтавки
|        ПО ШтатноеРасписаниеОрганизаций.ПодразделениеОрганизации = ОсворбожденныеСтавки.ПодразделениеОрганизации
|            И ШтатноеРасписаниеОрганизаций.Должность = ОсворбожденныеСтавки.Должность
|ГДЕ
|    ((ШтатноеРасписаниеОрганизаций.КоличествоСтавок <> 0
|    ИЛИ ЗанятыеШтатныеЕдиницыОрганизаций.КоличествоСтавокОстаток <> 0))
|    И ШтатноеРасписаниеОрганизаций.ПодразделениеОрганизации.Владелец = &Организация
|
|{ГДЕ
|    ШтатноеРасписаниеОрганизаций.ГрафикРаботы.* КАК ГрафикРаботы,
|    ШтатноеРасписаниеОрганизаций.ВидТарифнойСтавки КАК ВидТарифнойСтавки,
|    ШтатноеРасписаниеОрганизаций.ВалютаТарифнойСтавки КАК ВалютаТарифнойСтавки,
|    ШтатноеРасписаниеОрганизаций.МинимальнаяТарифнаяСтавка,
|    ШтатноеРасписаниеОрганизаций.МаксимальнаяТарифнаяСтавка,
|    ШтатноеРасписаниеОрганизаций.КоличествоСтавок,
|    ЗанятыеШтатныеЕдиницыОрганизаций.КоличествоСтавокОстаток КАК ЗанятоСтавок,
|    (ШтатноеРасписаниеОрганизаций.КоличествоСтавок - ЕСТЬNULL(ЗанятыеШтатныеЕдиницыОрганизаций.КоличествоСтавокОстаток, 0)) КАК Вакантно,
|    СведенияОШтатныхЕдиницахОрганизации.Информация,
|    СведенияОШтатныхЕдиницахОрганизации.ДолжностныеОбязанности,
|    СведенияОШтатныхЕдиницахОрганизации.ДолженЗнать,
|    СведенияОШтатныхЕдиницахОрганизации.ТребованияККвалификации,
|    ШтатноеРасписаниеОрганизаций.ПодразделениеОрганизации.Владелец.* КАК Организация,
|    ШтатноеРасписаниеОрганизаций.ПодразделениеОрганизации.*,
|    ШтатноеРасписаниеОрганизаций.Должность.*}    
| УПОРЯДОЧИТЬ ПО
|    ПодразделениеОрганизации ";
3 vmv
 
07.11.12
12:49
да почему эту хрень

        ОбластьСтрокаДоНадбавок.Параметры.Группа = ВыборкаДетали.ПодразделениеОрганизации;    
         ОтделСсылка = ПолучитьВышестоящееПодразделение(ВыборкаДетали.Код);          
         ОбластьСтрокаДоНадбавок.Параметры.Отдел = ОтделСсылка;
         
         УправлениеСсылка = ПолучитьВышестоящееПодразделение(ОтделСсылка.Код);          
         ОбластьСтрокаДоНадбавок.Параметры.Управление = УправлениеСсылка;          
         
         Службассылка = ПолучитьВышестоящееПодразделение(УправлениеСсылка.Код);          
         ОбластьСтрокаДоНадбавок.Параметры.Служба = Службассылка;  

не обернуть тожа в процедуру(фкнкцию) а параметры в нее передать в Струкртуре
4 не_1Снег
 
07.11.12
12:50
(3)Если можно - по делу, Сэр
5 vmv
 
07.11.12
12:52
(4) уже все по делу сказано, твое ПолучитьВышестоящее..()

косячное, код уродлив - работай над ошибками
6 vmv
 
07.11.12
12:55
да и нахрена работать с кодами, если в выборке есть ссылки, да и коды на различных уровнях могут быть идентичны, если уникальность в пределах группы

и такиех почему масса, так и чешуться руки расстрелять тс, ну нельзя быть косячным таким
Независимо от того, куда вы едете — это в гору и против ветра!