Имя: Пароль:
1C
 
Определить старший уровень
0 ацкий
 
23.11.05
12:14
туплю. нужно пределить самый старший уровень у элемента в справочнике
1 Рупор абсурда
 
23.11.05
12:15
Уровень самого верхнего родителя?
2 ацкий
 
23.11.05
12:15
да
3 SnarkHunter
 
23.11.05
12:15
Что такое "старший уровень"?
4 Рупор абсурда
 
23.11.05
12:15
(2) 1
5 PVasili
 
23.11.05
12:16
Искать родителей
6 NS
 
23.11.05
12:16
род=ТекущийЭлемент();
Пока род.Родитель.Выбран()=1 цикл
 Род=Род.Родитель;
КонецЦикла;
сообщить(Род.Наименование);
7 SnarkHunter
 
23.11.05
12:16
Я в шоке.
8 ацкий
 
23.11.05
12:16
у родителя искать родителя?
9 PVasili
 
23.11.05
12:17
во блин, отвечают, быстрее, чем вопрос задается :)))
10 Рупор абсурда
 
23.11.05
12:18
(6) Скучно ..., пОшло ...
11 ацкий
 
23.11.05
12:18
Ясно
(7) а ты по-моему постоянно в шоке или в ахтунге, уж не знаю
12 Рупор абсурда
 
23.11.05
12:18
(6) Давай решение в одну строчку ...
13 PVasili
 
23.11.05
12:19
В запросе?
14 NS
 
23.11.05
12:20
Что поделаешь. Тупые 1Сники даже это написать не в состоянии...
(12) Только ежели нет в названии разделителей. Через ПолноеНаименование() - но это не сам элемент!!! Это его наименование. А чтоб его найти - нужна уникальность - либо кода, либо наименования, с отсутствием, как я уже сказал в наименовании разделителей...
15 SnarkHunter
 
23.11.05
12:22
(11)Что поделаешь. Тупые 1Сники задают такие вопросы. от которых можно впасть только в шок...
16 ацкий
 
23.11.05
12:23
(15)следи за собой, будь осторожен
17 Рупор абсурда
 
23.11.05
12:27
(14) Учись:
ВерхнийРодитель=ЗначениеИзСтрокиВнутр(Шаблон("[ЗначениеВСтрокуВнутр(Спр"+СтрЗаменить(Формат("","С"+(Спр.Уровень()-1))," ",".Родитель")+")]"));
18 NS
 
23.11.05
12:39
(17) Въехал.
Спасибо.
19 Simod
 
23.11.05
12:51
(17) Прикольно, но по моему цикл будет быстрее. Надо проверить :-)
20 PVasili
 
23.11.05
12:52
(19) часто так и бывает красивый и краткий код работает на порядок тупого в лоб написанного.
21 Terv
 
23.11.05
12:56
(17) мдя круто,
за СтрЗаменить(Формат("","С"+(Спр.Уровень()-1))," ",".Родитель")+")]") , спасибо надо запомнить :)
22 GrayT
 
23.11.05
14:38
(17)Вай как харашо.....
23 Sirus Virus
 
23.11.05
14:39
(17) Бог программирования с нами :)) ура
24 Nag
 
23.11.05
14:41
А как получить полное дерево? :)
25 Рупор абсурда
 
23.11.05
14:52
(24) Тут много таких ..., но самые полные, по-моему, это СаШка и Алекс_Парен ...
26 skunk
 
23.11.05
14:54
забыл про блондина... точнее полосатого блондина
27 Nag
 
23.11.05
14:56
Смешно... Но вопрос заключался в том, чтобы показать все дерево номенклатуры
Типа:
Бытовая химия (группа)
Порошки стиральные (группа)
Импортные (группа)
Henkel (группа)
Порошок стиральный для автомат. машин 3 кг. (товар)
28 Рупор абсурда
 
23.11.05
14:56
(26) Ну, что ты ...
Ты уже не дерево ..., ты по уровню уже давно где-то среди высших приматов ...
29 Рупор абсурда
 
23.11.05
14:57
(27) Одной строчкой?
30 Nag
 
23.11.05
14:57
(29) Необязательно, просто наилучшее решение.
31 skunk
 
23.11.05
14:58
(28)это расценивать как поощрение
32 Рупор абсурда
 
23.11.05
15:02
(30) Скучное и пОшлое?
33 Широкий
 
23.11.05
15:02
Через полный код попробуй
34 LOD
 
23.11.05
15:03
(32) А ты это сам додумался или вместе с кем ? И долго думали
Супер !
Этож надо так мысль завернуть ...
Яб решил типовым ... и даже не задумался что можно в одну строчку
ЗначениеИзСтрокиВнутр(Шаблон("[ЗначениеВСтрокуВнутр(Спр"+СтрЗаменить(Формат("","С"+(Спр.Уровень()-1))," ",".Родитель")+")]"));
35 LOD
 
23.11.05
15:03
(34) + Аплодисменты
36 Nag
 
23.11.05
15:04
(33) Я знаю, как решить через полный код...
37 Рупор абсурда
 
23.11.05
15:08
(33,36) Так делают чайники ...
38 LOD
 
23.11.05
15:09
(37) ответь на (34)
39 Nag
 
23.11.05
15:12
(37) А как делают не чайники?
40 NS
 
23.11.05
15:12
Процедура получитьРодителя(род)
Если род.Родитель.Выбран()=1 тогда
    получитьРодителя(род.родитель);
КонецЕсли;
сообщить(род.наименование);
КонецПроцедуры
ПолучитьРодителя(спр.ТекущийЭлемент());
41 Рупор абсурда
 
23.11.05
15:17
(38) Я даже и не думал почти ...
Это решение пришло в голову почти сразу, как только решил выдумать какое-нибудь извращённое решение ...
42 LOD
 
23.11.05
15:28
(41) Достойно уважения !
Тут даже и говорить о таких решениях как в (40) неразумно
(40) А представь если он подумает над этим вариантом ... ;)
Вдруг напишет в одну строчку ? ;)))))))
43 Иде я
 
23.11.05
15:34
Род=?(Эл.Уровень()=1,Эл,?(Эл.Уровень()=2,Эл.Родитель,Эл.Уровень()=3,Эл.Родитель.Родитель,)));
44 Широкий
 
23.11.05
15:37
(43) Ну да ... тоже самое и рупор написал... (42) не забудь его добавить в книжку, кого не забыть поуважать
45 skunk
 
23.11.05
15:39
(43)а если не знать заранее количество родителей.
46 Широкий
 
23.11.05
15:40
(45) максимум 10
47 Рупор абсурда
 
23.11.05
15:41
(46) Спорнём смогу сделать 20? ...
48 LOD
 
23.11.05
15:42
(45) Вот в этом то и суть всей мысли  Рупор абсурда, он не упирается в этот критерий
(43) Это решение  равно по силе простому перебору
49 Широкий
 
23.11.05
15:44
(47) документировано вроде не больше 10 ... я не знаю как сделать 20 ... но думаю, что через дырки в 1с
50 ooki
 
23.11.05
15:45
можете закидать меня гнилыми помидорами, но я бы использовала код из (6, 40), не (17). Код должен быть прост и понятен тем, кто после меня будет работать с ним.
51 Иде я
 
23.11.05
15:46
Обычно вы знаете скока уровней у конкретного справочника  :)
52 Рупор абсурда
 
23.11.05
15:46
(49) Спорить не будешь?
53 LOD
 
23.11.05
15:46
(44) А ты, случаем не завидуешь ему ?
54 Широкий
 
23.11.05
15:47
(50) забавно, но я так тоже думаю..
(51) Претензии на универсальность
(52) Нет... не спорю, в чем не уверен
(53) Чему завидовать?
55 skunk
 
23.11.05
15:47
(50)а что в непонятного и сложного в (17)

(51)а завтра я решу изменить количества уровней справочника, или не я, а кто-то вместо меня ;))
56 Рупор абсурда
 
23.11.05
15:48
Мне решение в (43) нравится!
57 Иде я
 
23.11.05
15:49
Кстати (43) Можно расширитоь до упора
58 GrayT
 
23.11.05
15:50
(50)Немного утрируя - а если после тебя будут работать дауны?
59 Рупор абсурда
 
23.11.05
15:51
(50) Однострочные решения иногда бывают необходимы ...
Например, когда нельзя менять конфигурацию, но нужно вывести что-то на внешней печатной форме.
60 ooki
 
23.11.05
15:51
(55)понятно, но не наглядно
это как с обменом данными между двумя переменными. Можно написать наглядно, используя третью переменную. А можно не использовать. Но это не будет настолько просто и понятно. По крайней мере на первый взгляд.
61 ooki
 
23.11.05
15:52
(59)если действительно есть необходимость, то конечно
62 Рупор абсурда
 
23.11.05
15:54
(61) Ты права, (17) я написал больше для выпендрежу ...
63 ooki
 
23.11.05
15:58
(62)судя по откликам народа тебя тут и так уважают :) А вообще оригинальные решения всегда всем нравятся, даже если ими и не пользуются.
64 skunk
 
23.11.05
16:09
(60)не знаю... но всегда стараюсь максимально упростить код
65 Золушок
 
23.11.05
16:15
Могу заметить одно. Я предпочту Серегин, а не Лешкин, вариант. Ибо для дальнейшего сопровождения не только автором, но и другими специалистами, Серегин вариант предпочтительней на порядок.
66 skunk
 
23.11.05
16:22
(65)Сереги вариант можно было победить и без рекруссии
67 Guk
 
23.11.05
16:24
(66) А где в первом варианте рекурсия?...
68 skunk
 
23.11.05
16:26
(67)сорри ... я не сначала ветку смотрел... а открываю только последнии двадцать...
69 NS
 
23.11.05
16:26
(66) Тогда со стеком.
Без стека и рекурсии - 40 не делается. Ну, только ежели собирать строку...

род=ТекущийЭлемент();
стр=сокрлп(род.наименование);
Пока род.Родитель.Выбран()=1 цикл
 Род=Род.Родитель;
 стр=сокрлп(Род.Наименование)+разделительСтрок+стр;
КонецЦикла;
сообщить(стр);
70 Минона
 
23.11.05
16:33
2(69) А не проще стрЗаменить( ПолноеНаименование, "/", РазделительСтрок) ?
71 skunk
 
23.11.05
16:36
(69)почему... вариант в 6... работает
72 NS
 
23.11.05
16:36
(70) А ежели "/" в наименовании?
73 Рупор абсурда
 
23.11.05
16:44
(65) А если поставлю тебе задачу я?
74 Минона
 
23.11.05
16:48
2(72) тады лажа.
вот ведь, с пробелами гимор, со слешами лажа ..
75 Nag
 
23.11.05
17:12
Мда... Мое решение даже неудобно как то выставлять... Счас начнется критика, что это полный отстой и попытка почесать правое ухо левой ногой... Но я не гордый. Работает, и ладно. И потомки разберутся (надеюсь), код несложный...

Процедура Сформировать()
Товар = СоздатьОбъект("Справочник.Номенклатура");
Товар.НайтиПоКоду("00041515");
ПолныйКод = СокрЛП(Товар.ПолныйКод())+"/";
  Пока Найти(ПолныйКод, "/") <> 0 Цикл
  Код = Лев(ПолныйКод, Найти(ПолныйКод, "/") - 1);
  Товар.НайтиПоКоду(Код);
  Сообщить(Товар);
     Пока Лев(ПолныйКод, 1)<>"/" Цикл
       ПолныйКод=Сред(ПолныйКод, 2);
     КонецЦикла;
  ПолныйКод = Сред(ПолныйКод, 2);
  КонецЦикла;
КонецПроцедуры
76 Рупор абсурда
 
23.11.05
17:21
(75) Только он неуниверсальный ..., т.е. на некоторых справочниках может и не заработать вовсе ...
77 Nag
 
23.11.05
17:22
+(75) В общем то я уже как то высказывался на эту тему на сайте... Если вдруг надо скопировать справочник ТМЦ в некую копию справочника, но при этом копировать только то, что есть в наличии... Тогда сначала тупо очищается полностью весь копия-справочник, затем идет запрос к регистру остатка ТМЦ и при Ост > 0 создается новый элемент в копии справочника. Причем необходимо скопировать и структуру самого справочника ТМЦ ... Следовательно, надо сначала найти и сразу же создать каталог верхнего уровня, потом второго и т.д. до самого элемента ... писалось все это под конкретную контору с конкретным трудностями в базе...
78 Рупор абсурда
 
23.11.05
17:22
(75) Тебе нужно твёрдо усвоить, что делать так ни при каких обстоятельствах нельзя ...
79 Nag
 
23.11.05
17:23
(78) Почему?
80 skunk
 
23.11.05
17:24
(76)рискну предположить... не заработает на тех где CodeLength вернет 0... да?
81 Рупор абсурда
 
23.11.05
17:24
(79) Чтоб не попасться ...
82 Nag
 
23.11.05
17:26
(81) На грабли? :) А конкретнее, вдруг заказчик наступит и на меня обидится...
83 Рупор абсурда
 
23.11.05
17:26
(80) Да, например ...
Или на тех где отключен контроль уникальности, или на подчиненных где уникальность в пределах подчинения, или на глючных, где нарушена уникальность ...
84 Nag
 
23.11.05
17:28
(83) Ага... Уникальность... Вот об этом я и не подумал...
85 Nag
 
23.11.05
17:30
(80) Насчет вернет ПолныйКод = 0 Хм... Вложу защиту, что такой элемент вывалить в окно сообщений и послать юзверя исправлять данный баг.
Сенкс.
86 skunk
 
23.11.05
17:32
(83)то есть данное равенство верно Скунс = ВысшийПримат

(85)Вообщето это ДлинаКода
87 Рупор абсурда
 
23.11.05
17:32
(85) Он не про полный код, а про нулевую длину кода ..., т.е. про справочники вообше без кода ...
88 Nag
 
23.11.05
17:35
Ну... C аглицким не знаком и самонадеянно решил, что это полный код, спасибо за аккуратный щелчок по высоко задранному носу...    :)

Нулевая длина... Верно, это решение его не поддержит. Значица, будем посмотреть, когда возникнет аналогичная задача, вышеописанные решения...
89 Nag
 
23.11.05
17:39
А уникальность в пределах подчинения легко обойти с помощью ИспользоватьРодителя.
90 Рупор абсурда
 
23.11.05
17:41
(89) Кого?
91 Nag
 
23.11.05
17:45
Ну по данному решению сначала находится каталог верхнего уровня. Затем второго, и т.д. если искать по коду с флагом 1 внутри предидущего каталога...


НайтиПоКоду(<?>,);
Синтаксис:
НайтиПоКоду(<Код>,<ФлагПоиска>)
Назначение:
Найти элемент справочника по коду.
Возвращает: 1 - если действие выполнено;
0 - если действие не выполнено (элемент не найден).
Параметры:
<Код> - выражение со значением искомого кода,
<ФлагПоиска> - флаг поиска (необязателен):
 0 - поиск во всем справочнике вне зависимости от родителя;
 1 - поиск внутри установленного подчинения (родителя);
92 skunk
 
23.11.05
17:55
91) не понял
93 Guk
 
23.11.05
17:57
Мдя. Инженеры знаний. Кто третий эту ветку в БЗ добавит?...
94 fisher
 
23.11.05
18:07
Не пойму, с чего народ прется...
Наверное, уже стар стал. Мне почему-то нравятся наглядные и быстрые решения.
Лучше чем (6) тут, ИМХО, ничего не предумаешь.
ЗЫ. И вообще, если будет два варианта решения, одно из которых будет чуть менее производительно, но более наглядно, то я выберу его.
95 AAAChel
 
23.11.05
20:56
я тоже согласен, что (6) - понятное и лучшее и решение, и о какой производительности идет речь при 2-6 уровнях ? Это мгновения. Улучшать надо минуты, или хотя бы секунды. Я думаю, что у многих была эта "задачка" и большинство так и делают
96 Guk
 
23.11.05
21:06
(94) Ты я смотрю диалектики не понимаешь. Как в (6) каждый может. Ты попробуй как Рупор! Банальную задачу изъеппнуть так, что потом не все даже въехали, как это произошло, это талант надо иметь. Нужен ли такой талант? Не знаю.
Если бы я увидел такой код у подрядчика или своего подчиненного, то дал бы ему звизды. И не потому что я не понял код Рупора, а потому что я на работе, а не на разгадке шарад, когда мне приходится напрягать мосх, только для того, чтобы понять код для простейшей задачи...
97 Забыл
 
26.11.05
08:11
Подождите добавлять, пожалуйста. Я не понял, многие наверное тоже.
Раскладываю по частям:
п1 =Формат("","С"+(Спр.Уровень()-1));
п2 =СтрЗаменить(п1," ",".Родитель");
п3 =Шаблон("[ЗначениеВСтрокуВнутр(Спр"+п2+")]");
ВерхнийРодитель=ЗначениеИзСтрокиВнутр(п3);
Форматная строка возвращает пустую строку. Зачем она нужна?
98 skunk
 
26.11.05
08:53
попробуй без нее
99 Забыл
 
26.11.05
09:02
да я знаю что не работает. не врубаюсь как он наверх спрыгивает. объясните поподробнее.
100 Guk
 
26.11.05
09:03
100?...
101 skunk
 
26.11.05
09:05
101 - износ
102 Забыл
 
26.11.05
09:06
хорошо бы в базу знаний то с объяснением? как это работает.
103 skunk
 
26.11.05
09:09
грубо... но это работает вот так

Пока род.Родитель.Выбран()=1 цикл
 Род=Род.Родитель;
КонецЦикла;
104 Забыл
 
26.11.05
09:13
этот код понятен, прозрачен. Я не понял то что Рупор написал
105 Забыл
 
26.11.05
09:14
Например, можно ли этим методом не самый старший уровень определить а просто верхний
106 skunk
 
26.11.05
09:16
(104) приблизительно тоже... но в одну строку )))


(105)просто верхний можно определить по атрибуту Parent...
107 Забыл
 
26.11.05
09:18
skunk, будь человеком, объясни ЧТО формат возвращает. НЕ цитатой из СП.
108 Забыл
 
26.11.05
09:20
(106) второй по старшинству?
109 skunk
 
26.11.05
09:29
начни смотреть, что вернет ЗначениеВСтрокуВнутр
110 Забыл
 
26.11.05
09:36
(109) возврщает {"U","0","0","0","0","0",""}
111 Забыл
 
26.11.05
09:38
ай, случайно нажал (110). И что? Это уровни справочника?
112 skunk
 
26.11.05
09:40
ЗначениеИзСтрокиВнутр(ЗначениеВСтрокуВнутр(МойСпавочник)) - что получишь на выходе
113 Забыл
 
26.11.05
09:42
(112) МойСправочник. Или нет?
114 skunk
 
26.11.05
09:47
да... пока правильно ...

теперь, что бы МойСправочник был родителем верхнего уровня
115 skunk
 
26.11.05
09:47
правильно?
116 Забыл
 
26.11.05
09:51
Нужно выбирать Родителей в цикле до конца. Все равно не понял
117 skunk
 
26.11.05
09:55
ну грубо весь сотальной изврат сформирует строку

что-то типа

Спр.Родитель.Родитель.Родитель ........
118 Забыл
 
26.11.05
10:04
Идею понял. Реализацию нет. skunk, если пошло в базу знаний, неплохо бы разжевать. Вряд ли я один такой тупой. Почему у меня работает пошагово (97). Что возвращает Формат()
119 skunk
 
26.11.05
10:12
из меня плохой жеватель... тем более, часть фишки я сам не просекаю...

а формат в идеии ... вернет пустую строку...
120 Забыл
 
26.11.05
10:39
Формат возвращает пустую строку. Так зачем он нужен? Хотелось бы приоткрыть истыну.
121 skunk
 
26.11.05
10:44
это если смотреть явно... но ведь там стоит используеться еще и шаблон
122 Забыл
 
26.11.05
10:50
(121) Ха, вот об этом я думаю. Как тогда смотреть? Пустая строка она и есть. А без нее не работает.
123 skunk
 
26.11.05
11:03
не знаю... может сам Рупор захочет разжевать... но наколка тут именно с шаблоном
124 Забыл
 
26.11.05
11:03
Я не успокоюсь, пока не пойму. Не люблю что-то не понимать. Как же технично обходят вниманием эту ветку разные другие старожилы. Только Скунку не стремно признаться (119). Респект и уважуха Скунку.
125 skunk
 
26.11.05
11:11
стремно когда видно... не буду говорить что )))

просто мне самому интересно узать секрет данного фокуса... сижу кручу... верчу... и не пойму, где туплю
126 Забыл
 
26.11.05
11:12
(123) У Рупора частенько в кодах Шаблон какой-нибудь прикол делает. Шаблон() вообще классная функция. имхо в 1С две вещи которые мне очень нравятся и их нет в других языках -Шаблон() и ТЗ
127 skunk
 
26.11.05
11:15
(126)ТЗ ... можно реализовать...
128 Забыл
 
26.11.05
11:17
TStringList? уже реализовано. Ближе к делу.
129 skunk
 
26.11.05
11:24
(128)TStringList не много не то...
130 Забыл
 
26.11.05
11:27
(129) За это мне и нравится ТЗ. ;) а реализовывать ее зачем? Другие задачи-другие решения.
131 skunk
 
26.11.05
11:30
ладно уходим от темы... а то Рупор и не поймент, что от него хотели... толи реализовать ТЗ на сипе... то ли объяснить бестолковым в чем суть (верблюды) ... фишки шаблон... в данном примере
132 Забыл
 
26.11.05
11:34
(131) Согласен. Знаешь, перед тем как поднять эту ветку, я два дня думал. И не понял в чем фишка Шаблона(). Я короче буду ее поднимать, пока кто-нибудь не признается в чем прикол (17).
133 skunk
 
26.11.05
11:37
(132)а я поробую у Рупора спросить... может захочет ответить
134 GrayT
 
26.11.05
11:41
(133)Хочешь сказать, что не въехал в 17?
135 skunk
 
26.11.05
11:44
точнее хочу сказать не могу вкурить как он раскрутил Спр.Родитель... до нужного Родителя
136 Guk
 
26.11.05
11:45
Код Рупора достаточно понятен. Для меня по крайней мере. Но, см. (96)...
137 Забыл
 
26.11.05
11:49
(136) Многоуважаемый!!! Объясните нам бестолковым. Люблю разгадывать шарады... Но сдаюсь. имхо: Рупор-извращенец от 1С
138 GrayT
 
26.11.05
11:49
Сперва накидал форматом столько пробелов сколько уровне, Стр заменить заменила пробелы на ".Родитель". Шпблон позволил расчитать строку динамически, но он возвращает строку, а нужен был объект. Поэтому Рупор вернул внутреннее представление (как строка), а потом из внутреннего представления получил объект.
Вот как он до этого додумался - это да.... Согласен - см 96
139 Забыл
 
26.11.05
11:58
Снимаю шляпу. Но Рупор -извращенец. Ему наверное защиту конфы не нужно делать - все равно такой код понять не каждому.
140 GrayT
 
26.11.05
12:03
Однажды при обсуждении защиты конфигураций Рупор брякнул - я и штатными средствами замучу код так, что фиг кто въдет. Знаешь - я ему верю :))))
141 skunk
 
26.11.05
12:05
я за это думал... но видать я точно примат...

message(strlen(format("", "C" + (Level() - 1)))); возвращает 0
message(strlen(format("", "C" + (CurrentItem().Level() - 1))));возвращает 0
message(strlen(strreplace(format("", "C" + (Level() - 1)), " ", ".Родитель"))); возвращает 0
message(strlen(strreplace(format("", "C" + (CurrentItem().Level() - 1)), " ", ".Родитель"))); возвращает 0
142 skunk
 
26.11.05
12:06
и все таки она вертиться.... ((((
143 skunk
 
26.11.05
12:08
(140)как ни странно ... я тоже... верю
144 Забыл
 
26.11.05
12:37
Инженеры знаний! Добавьте (138) в страницу знаний. И (140) -на самое видное место
145 GrayT
 
26.11.05
12:45
Опа, вот это косяк - пометил 138, а галки на все встали :(
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.