Имя: Пароль:
1C
1С v8
Уровни подразделений
, ,
0 guitar_player
 
11.01.12
07:34
Как можно побыстрее составить таблицу с уровнями подразделений (ссылка, уровень). Такая хрень работает долго:


ПостроительЗапроса = Новый ПостроительЗапроса;
   ПостроительЗапроса.Текст =
   "ВЫБРАТЬ
   |    ПодразделенияОрганизаций.Ссылка КАК Подразделение,
   |    0 КАК Уровень
   |ИЗ
   |    Справочник.ПодразделенияОрганизаций КАК ПодразделенияОрганизаций
   |{ГДЕ
   |    ПодразделенияОрганизаций.Владелец.* КАК Организация,
   |    ПодразделенияОрганизаций.Ссылка.* КАК Подразделение}";
   
   // Установка отборов
   Если ОтборОрганизация Тогда
       ДобавитьОтбор(ПостроительЗапроса, "Организация");
   КонецЕсли;
   
   Если ОтборПодразделение Тогда
       ДобавитьОтбор(ПостроительЗапроса, "Подразделение");
   КонецЕсли;
   
   Запрос = ПостроительЗапроса.ПолучитьЗапрос();
   Результат = Запрос.Выполнить();
   Если Результат.Пустой() Тогда
       Возврат Новый ТабличныйДокумент;
   КонецЕсли;
   
   ТаблицаПодразделений = Результат.Выгрузить();
   
   ВсегоЗаписей = ТаблицаПодразделений.Количество();
   
   Для Счетчик = 0 По ВсегоЗаписей - 1 Цикл    
       
       Строка = ТаблицаПодразделений[Счетчик];
       Строка.Уровень = Строка.Подразделение.Уровень();
       
       Если Счетчик % 10 Тогда
           Состояние("Построение таблицы уровней подразделений... [" + Счетчик + " из " + ВсегоЗаписей +"]");
       КонецЕсли;
       
   КонецЦикла;

Колонка используется для сортировки подразделения внутри иерархии, не спрашивайте зачем это нужно. Кто нибудь может подсказать?
1 asyr83
 
11.01.12
07:56
я для себя в запросе анализировал родителя (для этого четко определил количество уровней иерархии). ну а интересно было бы увидеть вариант с рекурсией...
2 Defender aka LINN
 
11.01.12
08:06
СКД
3 Рэйв
 
11.01.12
08:07
(0)Упорядочивание по иерархии

Для справочников можно назначать упорядочивание по иерархии справочника.

Пример:
Выбрать
  Справочник.Контрагенты.Наименование,
  Справочник.Контрагенты.Полноенаименование

Упорядочить По
  Справочник.Контрагенты.Наименование Иерархия
4 guitar_player
 
11.01.12
08:18
(3) и потом уровень брать уже из выборки или как?
5 Рэйв
 
11.01.12
08:23
(4)Можно и в выборке
6 golden-pack
 
11.01.12
08:24
(4) сделать запрос, потом посмотреть какие Системные поля
7 golden-pack
 
11.01.12
08:24
(5) ?
8 Рэйв
 
11.01.12
08:30
(6)Потом смотреть .Уровень()
у ссылке если оно тебе еще надо будет.
9 guitar_player
 
11.01.12
08:32
(6) не понял тебя.
(8) да, спасибо большое. Работает на порядок быстрее (т.е. для 2000 элементов теперь работает не заметно, а раньше занимало больше времени чем вывод самого отчета)
10 guitar_player
 
11.01.12
08:40
вот пример кода, если что:

   
   ПостроительЗапроса = Новый ПостроительЗапроса;
   ПостроительЗапроса.Текст =
   "ВЫБРАТЬ
   |    ПодразделенияОрганизаций.Ссылка КАК Подразделение
   |ИЗ
   |    Справочник.ПодразделенияОрганизаций КАК ПодразделенияОрганизаций
   |{ГДЕ
   |    ПодразделенияОрганизаций.Владелец.* КАК Организация,
   |    ПодразделенияОрганизаций.Ссылка.* КАК Подразделение}
   |
   |УПОРЯДОЧИТЬ ПО
   |    ПодразделенияОрганизаций.Ссылка ИЕРАРХИЯ";
   
   // Установка отборов
   Если ОтборОрганизация Тогда
       ДобавитьОтбор(ПостроительЗапроса, "Организация");
   КонецЕсли;
   
   Если ОтборПодразделение Тогда
       ДобавитьОтбор(ПостроительЗапроса, "Подразделение");
   КонецЕсли;
   
   Запрос = ПостроительЗапроса.ПолучитьЗапрос();
   Результат = Запрос.Выполнить();
   Если Результат.Пустой() Тогда
       Возврат Новый ТабличныйДокумент;
   КонецЕсли;
       
   ТаблицаПодразделений = Новый ТаблицаЗначений;
   ТаблицаПодразделений.Колонки.Добавить("Подразделение", Новый ОписаниеТипов("СправочникСсылка.ПодразделенияОрганизаций"));
   ТаблицаПодразделений.Колонки.Добавить("Уровень", Новый ОписаниеТипов("Число",
                                                    Новый КвалификаторыЧисла(2, 0, ДопустимыйЗнак.Неотрицательный)));
   
   Счетчик = 0;
   Выборка = Результат.Выбрать();
   ВсегоЗаписей = Выборка.Количество();
   
   Пока Выборка.Следующий() Цикл    
       
       Строка = ТаблицаПодразделений.Добавить();
       Строка.Подразделение = Выборка.Подразделение;
       Строка.Уровень         = Выборка.Уровень();
       
       Если Счетчик % 10 Тогда
           Состояние("Построение таблицы уровней подразделений... [" + Счетчик + " из " + ВсегоЗаписей +"]");
       КонецЕсли;
       Счетчик = Счетчик + 1;
       
   КонецЦикла;
11 Рэйв
 
11.01.12
08:42
(10)Выборка.Уровень()- это уровень выборки в запросе. Боюсь оно слабо относится к уровню ссылок справочника.

Наверное тебе надо
Выборка.Подразделение.Уровень()
12 golden-pack
 
11.01.12
08:45
(10) ололо
13 guitar_player
 
11.01.12
08:56
(11) Выборка.Подразделение.Уровень(). Так было в самом начале (см. 0), но оно торморзило.

В случае иерархического упорядочивания, уровень в выборке дает аналогичный результат Выборка.Подразделение.Уровень() только работает на порядок быстрее. Сейчас еще раз это проверю. Я думал, что ты именно это предлагал.

(12) ваши варианты?
14 golden-pack
 
11.01.12
08:58
(13) простой запрос.  скд. группировка по иерархии. Системные поля - Уровень
15 guitar_player
 
11.01.12
09:32
(14) вот такой вариант как раз дает не правильный результат
16 golden-pack
 
11.01.12
10:42
(15) да ну . не ври!
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс