|
Как определить максимальный уровень группировок в справочнике | ☑ | ||
---|---|---|---|---|
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
|
назрел вопрос - какая задача то стоит на самом деле?
Для чего именно нужна такая информация? |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |