Имя: Пароль:
1C
 
КАК у элемента справочника быстро найти самого верхнего родителя?
0 Vika64
 
04.02.09
15:14
вопрос, собственно в теме
1 gr13
 
04.02.09
15:15
Пока ЗначениеЗаполнено(ВыбСправочник.Родитель) Цикл
ВыбСправочник = ВыбСправочник.Родитель;
КонецЦикла
2 Vika64
 
04.02.09
15:17
Спасибо, попробую.
3 almar
 
04.02.09
15:21
а в запросе?
4 gr13
 
04.02.09
15:22
2... варианта... есть тебе какой попроще и подурацкей, или посложнее и покрасивей?
5 AndOne
 
04.02.09
15:25
правильный.
6 H A D G E H O G s
 
04.02.09
15:26
(4) Желательно для неограниченного по иерархии справочника
7 Sadovnikov
 
04.02.09
15:35
Для семерки:

Set NoCount On

Declare @элТовар Char(9)
Set @элТовар = '   2IW   '

While 1 = 1 Begin
   Select
       @элТовар = ParentID
   From
       спрНоменклатура
   Where
       ID = @элТовар And ParentID != '     0   '

   IF @@RowCount = 0 Break
End

Select @элТовар

Для восьмерки - по аналогии.
8 H A D G E H O G s
 
04.02.09
15:36
(7) Нет в восьмерке в запросах переменных.
9 Sadovnikov
 
04.02.09
15:37
(8) Сочуствую, конечно, восьмерке... Но, то же самое ADO еще никто не отменял :)
10 megalodon
 
04.02.09
15:38
для реально неограниченного количества уровней в запросе не получить. но если точно нать, что реальное количество уровней иерархии например не больше пяти - тогда запросто.
11 NcSteel
 
04.02.09
15:39
В запросе быстрее. Имхо
12 Sadovnikov
 
04.02.09
15:39
(10) Как это не получить? См. (7).
13 megalodon
 
04.02.09
15:40
(12) я про запросы 1С 8.х. Там к сожалению ни циклов ни рекурсии нет.
14 tsr
 
04.02.09
15:40
(6) А если в Иерархии с условием Родитель=Справочник.ПустоеЗначение ?
15 Sadovnikov
 
04.02.09
15:40
(13) Тогда см (9)
:)
16 megalodon
 
04.02.09
15:42
(15) ну тогда скинь мне АДО драйвер для файловой восьмерки умнег :-)
17 NcSteel
 
04.02.09
15:42
ВЫБРАТЬ
   Номенклатура.Ссылка КАК Ссылка
   
ИЗ
   Справочник.Номенклатура КАК Номенклатура
ГДЕ
   Номенклатура.Ссылка = &Ссылка
ИТОГИ ПО
   Ссылка ТОЛЬКО ИЕРАРХИЯ

А такой способ не устраивает?
18 gr13
 
04.02.09
15:42
(5) правильного не знаю.
(6) если для ограниченного, то можно так

ВЫБОР
   КОГДА РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации.Родитель = ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка)
       ТОГДА РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации.Родитель
   ИНАЧЕ ВЫБОР
           КОГДА РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка)
               ТОГДА РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации.Родитель.Родитель
           ИНАЧЕ РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации.Родитель.Родитель.Родитель
       КОНЕЦ
КОНЕЦ
19 Sadovnikov
 
04.02.09
15:42
(16) А нефиг пользоваться левыми продуктами. Восьмерка, файловая. На до же...
20 NiXeR
 
04.02.09
15:43
Запрос = Новый Запрос;

Запрос.Текст =
"ВЫБРАТЬ
|    Номенклатура.Ссылка КАК Ссылка
|ИЗ
|    Справочник.Номенклатура КАК Номенклатура
|ГДЕ
|    Номенклатура.Ссылка = &Ссылка
|ИТОГИ ПО
|    Ссылка ТОЛЬКО ИЕРАРХИЯ";

Запрос.УстановитьПараметр("Ссылка",МояСсылка);

Выборка = Запрос.Выполнить().Выбрать();

Выборка.Следующий();

ВерхнийУровень = Выборка.Ссылка;
21 Sadovnikov
 
04.02.09
15:43
(18) Опупеть... "Здраствуйте, тормоза!!!"
22 NcSteel
 
04.02.09
15:43
(20) Баян
23 gr13
 
04.02.09
15:43
(17) угу, что-то вроде. потом можно попробовать прикрутить по левому соединению другую таблицу. Но у меня в правилах не получилось указать В Иерархии
24 gr13
 
04.02.09
15:44
(21) какие тормоза))) нет никаких тормозов. Я как вариант привел, который будет работать, предложи лучше
25 megalodon
 
04.02.09
15:45
(20) не годится, потому что результат нельзя использовать например в подзапросе.
26 ATI
 
04.02.09
15:46
насчет семерки: как-то Рупор приводил такой код :

ВерхнийРодитель=ЗначениеИзСтрокиВнутр(Шаблон("[ЗначениеВСтрокуВнутр(Спр"+СтрЗаменить(Формат("","С"+(Спр.Уровень()-1))," ",".Родитель")+")]"));

:)
27 NcSteel
 
04.02.09
15:46
(25) Можно, выгружайте в Таблицу, дальше Временные таблицы
28 megalodon
 
04.02.09
15:46
(19) ОК. В монопольном режиме 1С 8.х твое АДО будет работать? :-)
29 ATI
 
04.02.09
15:46
+26 вот где красота и изящество :D
30 NcSteel
 
04.02.09
15:47
(0) Логичнее использовать не Иерархию справочника, а например Номенклатурные группы
31 Sadovnikov
 
04.02.09
15:49
(26) Это да.. Тот еще извращенец :) "Извращенец" в данном случае - в хорошем смысле.
(28) Мое ODBC - будет. А ваше восьмерошное ADO - нет, конечно :)
32 megalodon
 
04.02.09
15:49
(27) тогда это ничем не отличается от получения главного родителя в 1С-ком коде.
33 Sadovnikov
 
04.02.09
15:50
(24) А засветика что скуль при таком запросе выполнит?
34 Сергей-ХХХ
 
04.02.09
15:51
А вообще у товара есть  полный код, который косухами разделен. Типа

ИскомыйРодитель =  спр.НайтиПоКоду(Лев(товар.полныйкод,1,Найти(товар.полныйкод,"/")-1))
35 NcSteel
 
04.02.09
15:51
Да не лучше, но запрос быстрее + методично правильнее.
36 Sadovnikov
 
04.02.09
15:52
(34) Ай молодца! Меня практически каждый твой пост радует! Зайди-ка на закладочку "Нумерация" в свойствах справочника.
37 Сергей-ХХХ
 
04.02.09
15:54
(36) По коду будет искатся верхний уровень, а нам больше ничего и не надо ))) Меня твои посты тоже радуют глупостью...
38 Sadovnikov
 
04.02.09
15:55
(37) У тебя СП украли? Почитай
"<Родитель> (необязательный)
Тип: СправочникСсылка. Родитель, в пределах которого нужно выполнять поиск. Если не указан, то поиск будет проводиться во всем справочнике. "
39 Сергей-ХХХ
 
04.02.09
15:56
(38) НайтиПоКоду(<Код>, <Поиск по полному коду>, <Родитель>, <Владелец>)
В чем проблема?
40 NcSteel
 
04.02.09
15:57
(37) Юморной однако.

Хотя в 7.7 есть возможность получить "полный код" справочника через "\"
41 Sadovnikov
 
04.02.09
15:57
(39) Еще раз внимательно (38) прочитай. А потом все-таки загляни на закладочку "Нумерация".
42 Сергей-ХХХ
 
04.02.09
15:57
(40) В 8.х тоже
43 NcSteel
 
04.02.09
15:58
(39) Ты предлогаешь в элементе справочника хранить поле с програмно записанным путем к родителю, имхо это не правильно
44 Сергей-ХХХ
 
04.02.09
15:58
СправочникСсылка.<Имя справочника> (CatalogRef.<Имя справочника>)
ПолныйКод (FullCode)
Синтаксис:
ПолныйКод()
Возвращаемое значение:
Тип: Строка. Строка, включающая код элемента и коды всех вышестоящих элементов.
Коды выводятся слева направо, начиная с самого верхнего уровня, разделяются символом "/".
Описание:
Получает код элемента справочника с учетом кодов всех вышестоящих элементов.
Пример:
Сообщить("Полный код данного элемента: " +
         СсылкаНаЭлемент.ПолныйКод());
45 NcSteel
 
04.02.09
15:58
(42) Нельзя, только програмно. посмотри свой код и заметишь "товар.полныйкод"
46 megalodon
 
04.02.09
15:58
как всегда на мисте чем тупее вопрос тем живее обсуждение.
47 gr13
 
04.02.09
15:59
(46) а ты предложи красивое решение
48 NcSteel
 
04.02.09
16:00
(44) о_0 Гуру, не замечал такого !!

(47) получается (44) самое красивое
49 megalodon
 
04.02.09
16:00
а я предлагал в (10) при наличии ряда условий, а без них штатно запросом низя.
50 NcSteel
 
04.02.09
16:01
(49) что ты так упрям, запросом можно!!!
51 megalodon
 
04.02.09
16:02
(50) твое решение в (17) - это не запрос, а несколько запросов - тогда лучше делать кодом без затей.
52 НЕА123
 
04.02.09
16:03
ПолныйКод - это метод.


ИскомыйРодитель =  спр.НайтиПоКоду(Лев(товар.полныйкод(),1,Найти(товар.полныйкод(),"/")-1))

и что тут неправильного?
53 NcSteel
 
04.02.09
16:04
КАК у элемента справочника быстро найти самого верхнего родителя?

По этому сабжу запросом можно, ты же усложняешь задачу, но и более сложную задачу тоже лучше делать через запрос.
54 gr13
 
04.02.09
16:05
(50) блин! как?
55 megalodon
 
04.02.09
16:05
(53) да не в запросе это получается, а уже в выборке.
56 Sadovnikov
 
04.02.09
16:06
(52) Неправильно то, что, если не стоит галка Контроль уникальности и серии кодов не в пределах всего справочника, то неизвестно, что ты найдешь.
57 НЕА123
 
04.02.09
16:09
(56)если уникальности нет, то да, не катит.
а если не в пределах спр, то так, по полному коду.


ИскомыйРодитель =  спр.НайтиПоКоду(Лев(товар.полныйкод(),1,Найти(товар.полныйкод(),"/")-1), Истина)
58 Sadovnikov
 
04.02.09
16:10
(57) Вот так уже чуток лучше :)
59 Kashemir
 
04.02.09
16:12
Наиболее практичное решение на данный момент  (17)... увы.
Более "красивое" можно добится в СКД используя связи наборов данных с передачей параметра. Но по факту это лишь имитация циклических запросов с изменением параметра.
60 Kashemir
 
04.02.09
16:13
(59) + Сорь ... имел ввиду (18)
61 Sadovnikov
 
04.02.09
16:13
(59) НайтиПоКоду должно быстрее отработать, при перечисленных выше ограничениях.
62 gr13
 
04.02.09
16:14
(59) а как мне узнать в (17) у конкретного элемента родителя верхнего уровня?
63 hhhh
 
04.02.09
16:16
(62) так он там один и будет в выборке
64 НЕА123
 
04.02.09
16:17
автор-то, автор почему молчит.
65 Kashemir
 
04.02.09
16:19
(62) Опечатался. См. (60)
66 H A D G E H O G s
 
04.02.09
16:22
(63) В выборке, а не в запросе..
1С-ина дополнит (17) запрос еще своими запросами..
67 gr13
 
04.02.09
16:23
(65) я уже понял
68 Vika64
 
04.02.09
16:24
(65) вообще-то мне просто надо было найти у элемента, мне известного:
например МояНоменклатура - (это ссылка) самую его верхнюю папочку, например его родитель Папка1 а у папка1 родитель папка2 и т.д. вот мне надо самую верхнюю папку и ответ мне был дан сразу, спасибо gr13.... Правда я надеялась, что можно узнать самого верхнего типа так:
ИскомыйРодитель = МояНоменклатура.СамыйВерхнийРодитель;
но в 1С этого не предусмотрели.
69 vde69
 
04.02.09
16:25
я при решении похожей задачи (правда не со справочниками а с вложенными БП) создал реквизит "ВерхнийУровень"
70 Rebelx
 
04.02.09
16:28
(0)самый быстрый - посчитать для всех групп группу верхнего уровня и похранить на время надобности в каком-нить соответствии. и по родителю элемента всегда получим нужный верхний элемент
71 Vika64
 
04.02.09
16:31
(69) а можно подробнее? какая была задача и как воплотили?
72 H A D G E H O G s
 
04.02.09
16:31
(69) А если папочку, в которой лежит элемент перенести в другого родителя верхнего уровня?
73 vde69
 
04.02.09
16:34
(72) перезаписывать все элементы :( на самом деле зависит от задачи

у меня для БП изменение вержнего родиделя невозможно по определению
74 vde69
 
04.02.09
16:35
(71) а тебе вообще ЗАЧЕМ это надо делать? какая цель? может решение проще есть?
75 gr13
 
04.02.09
16:50
+1
76 NcSteel
 
04.02.09
16:59
(69) Тогда лучше что то вроде "Номенклатурных групп", доп аналитики
77 vde69
 
04.02.09
17:02
(76) мы не знаем ЗАЧЕМ, вариантов много

мне это надо было для RLS использовать, там в верхнем БП была группа доступа
2 + 2 = 3.9999999999999999999999999999999...