Имя: Пароль:
1C
1С v8
определить "глубину" справочника
,
0 ladalk
 
30.07.12
08:05
добрый день,
может кто знает, как можно весьма логично определить количество уровней в справочнике (куча вложенных папок)?
1 Живой Ископаемый
 
30.07.12
08:06
запросом?
2 ladalk
 
30.07.12
08:07
(1) считать Справочник........Родитель??
3 i_rodionov
 
30.07.12
08:07
(0) Максимальная глубина? Или конкретный элемент, углубленный в папках?
4 ladalk
 
30.07.12
08:08
(3) ну с элементом проще.
нужна максимальная глубина по всему справочнику
5 Ranger_83
 
30.07.12
08:09
в запросе максимальный уровень
6 i_rodionov
 
30.07.12
08:09
(4) Метаданные. Глобальный объект в восьмерке.
7 Живой Ископаемый
 
30.07.12
08:09
не, это вопрос. Так вот запросом сразу нельзя... потому что нет функции уровень() но можно в СКД
8 Живой Ископаемый
 
30.07.12
08:10
2(6) тогда все еще проще максимальный уровень часто вообще не задан
9 Ranger_83
 
30.07.12
08:15
уровень() есть у объектного типа справочника.если справочник небольшой,то можно сделать перебор всех элементов
10 i_rodionov
 
30.07.12
08:16
Свойство метаданных КоличествоУровней. Недоступно на тонком клиенте
11 ladalk
 
30.07.12
08:18
(6) а можно поподробнее? не нашла свойства "уровень" или что-то подобное у объекта метаданных
12 ladalk
 
30.07.12
08:18
(9) большой
13 Живой Ископаемый
 
30.07.12
08:19
2(11) Это не имеет значения. По умолчанию во всех типовых все справочники неограниченного уровня. Если движок конечно не базовый.
14 Живой Ископаемый
 
30.07.12
08:20
2(12) нужно пробовать.
15 i_rodionov
 
30.07.12
08:21
(11) Метаданные.Справочники.ИмяСправочника.КоличествоУровней - это свойство,доступное для чтения на сервере и толстом
16 i_rodionov
 
30.07.12
08:25
+(15) Нужно дополнительно контролировать Метаданные.Справочники.ИмяСправочника.ОграничиватьКоличествоУровней тип булевый. Доступно на сервере и толстом
17 бомболюк
 
30.07.12
08:25
Запросом в цикле. При первом обходе получаешь элементы, у которых родитель = пустая ссылка. При втором обходе получаешь элементы, у которых родитель в выборке первого обхода и так далее. Цикл гоняешь пока пустой результат запроса не вернется.
18 ladalk
 
30.07.12
08:25
странно..
определяю программно количество уровней (показывает 2), захожу в справочник - там в структуре можно увидеть и 4 уровня..
19 ladalk
 
30.07.12
08:26
(17) это нужно при формировании отчета - каждый раз обрабатывать тысячи элементов наверно не логично.
20 бомболюк
 
30.07.12
08:28
(19) другого пути нет.
21 shuhard
 
30.07.12
08:28
(19) бредовая затея
22 бомболюк
 
30.07.12
08:28
+(20) попробуй это должно быстро работать
23 i_rodionov
 
30.07.12
08:31
Предлагаю другое решение. Запросом выбрать только папки. После этого в цикле выборки посчитать их родителей
24 бомболюк
 
30.07.12
08:33
(23) существует иерархия элементов
25 vde69
 
30.07.12
08:33
(21) почему бредовая? количество запросов равно максимальному  используемому уровню.

Ихмо - если это нужно разово то нормальная идея, если постоянно - нужно добовлять в справочники поле "Уровень" и заполнять его в подписке
26 ladalk
 
30.07.12
08:33
ОграничиватьКоличествоУровней имеет значение Ложь => максимальное количество уровней иерархии неограничено, т.е. так получить количество уровней нельзя?
27 aleks-id
 
30.07.12
08:35
функция СколькоУровнейВСправочнике()
   счетчик=1;
   Запрос = Новый Запрос;
   Запрос.Текст =
       "ВЫБРАТЬ
       |    Номенклатура.Ссылка,
       |    Номенклатура.Родитель
       |ИЗ
       |    Справочник.Номенклатура КАК Номенклатура
       |ГДЕ
       |    Номенклатура.ЭтоГруппа
       |    И Номенклатура.Родитель = &Родитель";
   
   Запрос.УстановитьПараметр("Родитель", Справочники.Номенклатура.ПустаяСсылка());
   Родитель = Запрос.Выполнить().Выгрузить();
   Запрос.Текст =
       "ВЫБРАТЬ
       |    Номенклатура.Ссылка
       |ИЗ
       |    Справочник.Номенклатура КАК Номенклатура
       |ГДЕ
       |    Номенклатура.ЭтоГруппа
       |    И Номенклатура.Родитель В(&Родитель)";
   условие=истина;
   пока условие цикл
       счетчик=счетчик+1;
       Родитель = Запрос.Выполнить().Выгрузить();
       Запрос.УстановитьПараметр("Родитель", Родитель);
       Если Родитель.Количество()=0 Тогда
           Условие=Ложь;
       КонецЕсли;
   КонецЦикла;
   возврат счетчик
КонецФункции
28 ladalk
 
30.07.12
08:35
(25) под "уровнем" понимается группа?
29 Ant1773
 
30.07.12
08:35
(26) Через метаданные получить реально использованное кол-во уровней - нет.
30 Ant1773
 
30.07.12
08:36
(28) Группа - это группа. На одном уровне может быть много групп.
31 patapum
 
30.07.12
08:37
(0) а зачем вообще все это нужно? после озвучки задачи может выясниться что уровень нафиг не нужно получать...
32 ladalk
 
30.07.12
08:40
(31) выводить в отчет
33 бомболюк
 
30.07.12
08:41
(27) хороший код, только есть косячки:
1. не работает с иерархией элементов;
2. если я пральна понял, то минимум что вернет эта функция - это число 2, что будет неправильно для пустого справочника или справочника с 1 уровнем.
3. не проверял но имхо некорректно отработается ситуация, когда на последнем уровне нет элементов (а только пустые группы).
34 i_rodionov
 
30.07.12
08:43
(33) пункт 1 ты прав.
пункт 3 тоже
35 Рэйв
 
30.07.12
08:44
Велосипедостроители:-)

Справочники.ИмяСправочника.Пустаяссылка().Метаданные().КоличествоУровней
36 бомболюк
 
30.07.12
08:45
(34) а 2 типа не прав чтоль?
37 i_rodionov
 
30.07.12
08:45
(35) речь идет о ОграничиватьКоличествоУровней имеет значение Ложь
38 Рэйв
 
30.07.12
08:46
(37)А... Вон оно что.
39 i_rodionov
 
30.07.12
08:46
(36) Может и прав, но я не проверил и не уверен. И не буду подписываться на то, что не уверен
40 ladalk
 
30.07.12
08:46
(35) тоже самое, что и (18)
41 aleks-id
 
30.07.12
08:50
(33) я не проснулся еще. просто пытался донести общий смысл.
по 1 вопросу согласен.
по 2 счетчик надо в 0 или -1
по 3 неправ.
42 patapum
 
30.07.12
08:50
(32) выводить в отчет максимальный уровень? или уровень каждого элемента? на хрена вообще юзерам такие отчеты...
43 ladalk
 
30.07.12
08:52
(42) в зависимости от глубины дальнейшее продолжение отчета.
44 i_rodionov
 
30.07.12
08:53
(43) Отчет на СКД?
45 patapum
 
30.07.12
08:56
(43) а можно не выносить людям мозг и озвучить собственно задачу? я думаю, помогут быстрее. хотя наверное, я не прав, надо было ближе к сотке вбросить...
46 Serg_1960
 
30.07.12
08:59
"А чё тут думать? Трясти нада!"(анекдот-с)

Рекурсия. И только рекурсия, если исходить из утверждения "количество уровней не ограничено".
47 ladalk
 
30.07.12
09:00
(45) грубо говоря, вывести на печать прейскурант, прейскурант - справочник, в котором куча вложенных папок. нужно все по папкам, с группировкой.
48 Ant1773
 
30.07.12
09:03
(47) СКД
49 ladalk
 
30.07.12
09:05
(48) пытаюсь
50 Живой Ископаемый
 
30.07.12
09:06
2(47) а максимальный уровень зачем?
51 i_rodionov
 
30.07.12
09:07
(47) На СКД это проще реализовать. Там все очень просто группируется.
52 ladalk
 
30.07.12
09:08
(50) в настройках когда добавляю поля группировки - знать, сколько "родителей" указывать
53 Serg_1960
 
30.07.12
09:09
(50) +1 Знание максимального уровня автору не нужно при печати прескуранта.
54 i_rodionov
 
30.07.12
09:10
(53) Не надо, можно детально с иерархией
55 Живой Ископаемый
 
30.07.12
09:10
2(52) чего-чего?
56 ladalk
 
30.07.12
09:14
(55) на вкладке "настройки" добавить группировку для вывода на печать
57 i_rodionov
 
30.07.12
09:16
(56) С иерархией. Потом настраивайте отчет в целом и детальные записи
58 ladalk
 
30.07.12
09:18
(57)добавляю Элемент.Родитель.Родитель....Родитель
надо же знать, сколько этих родителей добавлять?
59 i_rodionov
 
30.07.12
09:21
(58) Хм.. Я не понимаю. Я о группировках. Она одна. Добавляется с указанием, что она с иерархией
60 vde69
 
30.07.12
09:21
(58) вот и развязка, теперь можно тему - в юмор....

не делай так НИКОГДА!!! Это ппц какие тормоза будут...
61 i_rodionov
 
30.07.12
09:23
(60) Да ладно тебе, может, человек не знает, что делать
62 ladalk
 
30.07.12
09:24
(61)))
63 vde69
 
30.07.12
09:25
(61) если человек не знает что делать - пусть ничего не делает.

то что он сейчас делает можно прировнять к терроризму :)
64 i_rodionov
 
30.07.12
09:27
(63) Не прикалывайся :)) блин. Я бы объяснил автору, как мог, но даже не знаю, как подступить
65 Ant1773
 
30.07.12
09:28
(64) Дать консоль отчетов? Чтобы человек понял что такое СКД.
66 ladalk
 
30.07.12
09:29
(63) в настройках какое поле добавлять с группировкой?
67 ladalk
 
30.07.12
09:30
запрос - выбираю просто элемент из справочника.
68 ladalk
 
30.07.12
09:30
(67) со всеми родителями
69 i_rodionov
 
30.07.12
09:31
(66) Попробуй сначала пустое поле с иерархией в качестве первой группировки
70 ladalk
 
30.07.12
09:34
(69) получается "детальные записи" и пусто
71 i_rodionov
 
30.07.12
09:37
(70) Нужно настроить этот отчет, чтобы корень его выбирал детальные записи из запроса.
72 ladalk
 
30.07.12
09:39
(71) ну тогда еще вопрос: каким должен быть запрос? просто элемент или еще родителей выбирать?
73 Ant1773
 
30.07.12
09:40
(72) Просто элемент.
74 i_rodionov
 
30.07.12
09:42
(72) Запрос должен выбирать элементы. К сожалению, я не могу рассказать в рамках форума, как это должно работать. Вам нужно прочесть хорошую книгу по этому предмету. Я и сам только начинаю, и начал с чтения многих книг
75 ladalk
 
30.07.12
09:42
(73) а в настройках тогда что?
новая группировка - элемент - иерархия?
76 i_rodionov
 
30.07.12
09:47
(75) настройки - это слишком обширная тема, вряд ли тут кто-то сможет помочь.
Закон Брукера: Даже маленькая практика стоит большой теории.