Имя: Пароль:
1C
1С v8
Как определить максимальный уровень группировок в справочнике
,
0 Noxvil
 
13.09.11
14:53
Для примера беру справочник номенклатура, нужно для запроса...
Как это можно сделать быстро? Возможно универсальный метод или как это определить запросом?
1 Grusswelle
 
13.09.11
14:54
СправочникСсылка.<Имя справочника>.Уровень (CatalogRef.<Имя справочника>.Level)
СправочникСсылка.<Имя справочника> (CatalogRef.<Имя справочника>)
Уровень (Level)
Синтаксис:

Уровень()
Возвращаемое значение:

Тип: Число. Уровень элемента справочника.
Описание:

Получает уровень элемента справочника.

Доступность:

Сервер, толстый клиент, внешнее соединение.
Примечание:

Имеет смысл только для многоуровневых справочников. Следует учитывать, что уровень элемента может меняться, например, при переносе в другую группу (смене родителя). Для элемента, не имеющего родителя, уровень будет равняться 0.
Если ссылка пустая, вызов метода вызывает исключение.
Пример:

Сообщить("Данный элемент принадлежит уровню " +
         СсылкаНаЭлемент.Уровень());
2 Noxvil
 
13.09.11
14:56
Спасибо, а как получить максимальный уровень сразу?
3 Noxvil
 
13.09.11
14:58
т.е. не для конкретной номенклатуры, а для самой "глубокой" номенклатуры.
4 Irbis
 
13.09.11
15:00
Никак, только уменьшить количество перебираемых элементов. Сначала определить уровень всех папок, потом проверить наличие элементов у самой нижней папки
5 unregistered
 
13.09.11
15:00
Ни как.
6 Noxvil
 
13.09.11
15:04
Нет ничего невозможного... Я так понял, что только обходом, или все же запросом можно?
7 Noxvil
 
13.09.11
15:08
Предложений нет больше?
8 mikecool
 
13.09.11
15:10
количество вложений совсем не ограничено или все таки есть предполагаемый предел?
9 Irbis
 
13.09.11
15:10
Ссылка.Родитель...Родитель только для заранее известного уровня вложенности у справочника. Если иерархия неограничена, то ...
10 mikecool
 
13.09.11
15:10
(9) ну почему же для известного? можно извратиться и динамически собрать текст запроса
11 mikecool
 
13.09.11
15:11
+10 правда пока не представил как )))
12 Irbis
 
13.09.11
15:12
(11) Когда только остановиться вопрос. уровень вложенности 100000 мы тестировали как-то, когда финдир не поверил что такое возможно.
13 mikecool
 
13.09.11
15:14
ТекстЗапроса = Новый Текст;
Для Сч = 1 ПО 256 Цикл

 Строка = ТекстЗапроса.ДобавитьСтроку();
 Строка = "Номенклатура";
 Для Сч2 = 1 По Сч Цикл

   ТекстЗапроса[Сч2] = ТекстЗапроса[Сч2] + ".Родитель"

 Конеццикла

Конеццикла

типа так )))
14 mikecool
 
13.09.11
15:14
+13 писал вообще без проверки, но идея думаю понятно )))
15 mikecool
 
13.09.11
15:16
+14 еще надо добавлять строку со счетчиком для каждой строки, а потом банально проверка на не нулл
16 Irbis
 
13.09.11
15:16
(14) Идея понятно, но уровень иерархии неограничен, то есть и миллион и два и хз сколько.
17 mikecool
 
13.09.11
15:17
(16) это понятно, но я не встречал пока глубже 16 кажется
18 Noxvil
 
13.09.11
15:19
А как думаете, обходом если количество номенклатуры около 4000 - быстрее будет обходом?
19 Irbis
 
13.09.11
15:20
(17) Я и больше 3 с трудом нахожу применение. Да и часто вообще с рассыпанным справочником работаю. Или вообще выбор из списка, чтобы формы лишние не открывать. Хочу сделать кнопку на весь экран с надписью "Сделать все за...ись", кнопку сделал, но обработчик еще не отладил до конца.
(18) Запросом вытяни все группы, узнай их уровень, и для максимума выбери запросом элементы.
20 YurOK_51
 
13.09.11
15:46
Процедура КнопкаВыполнитьНажатие(Кнопка)
   
МаксимальныйУровень=0;
   
Запрос=новый Запрос;
Запрос.Текст="
|ВЫБРАТЬ
|    Номенклатура.Ссылка КАК Родитель
|ИЗ
|    Справочник.Номенклатура КАК Номенклатура
|ГДЕ
|    Номенклатура.Родитель <> &Пустой
|";
Запрос.УстановитьПараметр("Пустой",Справочники.Номенклатура.ПустаяСсылка());
Выборка = Запрос.Выполнить().Выгрузить();
   
   Пока Истина Цикл
       Выборка = ВыделитьСРодителем(Выборка) ;
       МаксимальныйУровень = МаксимальныйУровень+1;
       Если Выборка.Количество()=0 Тогда
         Сообщить(МаксимальныйУровень);
       Прервать;  
       КонецЕсли;    
   КонецЦикла;    
КонецПроцедуры

Функция ВыделитьСРодителем(Выборка)
Запрос=новый Запрос;
Запрос.Текст="ВЫБРАТЬ
            |    Номенклатура.Родитель.Ссылка КАК Родитель
            |ИЗ
            |    Справочник.Номенклатура КАК Номенклатура
            |ГДЕ
            |    Номенклатура.Родитель <> &Пустой
            |    И Номенклатура.Ссылка В (&Выборка)";
Запрос.УстановитьПараметр("Пустой",Справочники.Номенклатура.ПустаяСсылка());
Запрос.УстановитьПараметр("Выборка",Выборка);
Выборка = Запрос.Выполнить().Выгрузить();
Возврат Выборка;
КонецФункции




Как-то так ))
21 Noxvil
 
13.09.11
15:49
Спасибо, пока остановился вот на таком варианте:

   Запрос = новый Запрос;
   Запрос.Текст =
   
   "ВЫБРАТЬ
   |    Номенклатура.Ссылка
   |ИЗ
   |    Справочник.Номенклатура КАК Номенклатура
   |ГДЕ
   |    Номенклатура.ЭтоГруппа";
   
   ТЧ = Запрос.Выполнить().Выгрузить();
   
   МаксимальныйУровеньГруппировки = 0;
   
   Для Каждого Строка Из ТЧ Цикл
       
       Если Строка.ссылка.Уровень() > МаксимальныйУровеньГруппировки Тогда
           МаксимальныйУровеньГруппировки = Строка.ссылка.Уровень();
       КонецЕсли;
       
   КонецЦикла;
   
   Сообщить(МаксимальныйУровеньГруппировки+1);
22 YurOK_51
 
13.09.11
15:52
А почему именно ЭтоГруппа? Можно ведь использовать иерархию групп и элементов. Родителя надо искать.
23 Fragster
 
гуру
13.09.11
15:58
а зачем тебе это для запроса? можно же тупо в СКД 2 набора соединить
24 OldFornit
 
13.09.11
16:57
назрел вопрос - какая задача то стоит на самом деле?
Для чего именно нужна такая информация?