![]() |
![]() |
![]() |
|
Как в 1С получить вернюю папку-родителя номенклатуры | ☑ | ||
---|---|---|---|---|
0
KattyMix
20.05.11
✎
11:54
|
Есть список номенклатур,каждая номенклатура лежит в папке.
Например Питание-Тема-Каша.Необходимо вытащить верхнего родителя номенклатуры. Пробовала таким образом: Для каждого строкаТЧ из ЦеныПоставщиков цикл Если строкаТЧ.Номенклатура.Родитель.Родитель.Родитель = Справочники.Номенклатура.НайтиПоКоду("0000045647") Но мне этот метод не подходит-так как в списке номенклатур разное количество родителей у каждого элемента. |
|||
1
Asmody
20.05.11
✎
11:57
|
Функция ВерхнийРодитель(Ссылка)
Возврат ?(Ссылка.Родитель.Пустая(), Ссылка, ВерхнийРодитель(Ссылка.Родитель)); КонецФункции |
|||
2
luns
20.05.11
✎
12:08
|
можно запросом.
ВЫБРАТЬ Номенклатура.Ссылка ПОМЕСТИТЬ РодителиВерхнегоУровня ИЗ Справочник.Номенклатура КАК Номенклатура ГДЕ Номенклатура.Родитель.Ссылка ЕСТЬ NULL ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Номенклатура.Ссылка, РодителиВерхнегоУровня.Ссылка КАК Ссылка1 ИЗ Справочник.Номенклатура КАК Номенклатура ВНУТРЕННЕЕ СОЕДИНЕНИЕ РодителиВерхнегоУровня КАК РодителиВерхнегоУровня ПО (Номенклатура.Родитель = РодителиВерхнегоУровня.Ссылка ИЛИ Номенклатура.Родитель.Родитель = РодителиВерхнегоУровня.Ссылка ИЛИ Номенклатура.Родитель.Родитель.Родитель = РодителиВерхнегоУровня.Ссылка ИЛИ Номенклатура.Родитель.Родитель.Родитель.Родитель = РодителиВерхнегоУровня.Ссылка ИЛИ Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель = РодителиВерхнегоУровня.Ссылка) ГДЕ Номенклатура.Ссылка В(&СписокНоменклатур) это для 5 уровней. |
|||
3
Asmody
20.05.11
✎
12:21
|
(2) запросом это делается гораздо проще
|
|||
4
Reset
20.05.11
✎
12:27
|
Вариант:
Сообщить(Справочники.ИМЯСПРАВОЧНИКА.НайтиПоКоду(Лев(Ссылка.ПолныйКод(),Ссылка.Метаданные().ДлинаКода))); |
|||
5
Reset
20.05.11
✎
12:29
|
Почему пол мужской в профиле?
|
|||
6
luns
20.05.11
✎
12:40
|
(3) возможно. это я за минуту накидал. никогда такой задачи не возникало.
покажи кстати вариант. интересно. |
|||
7
Fragster
гуру
20.05.11
✎
12:40
|
||||
8
Ахиллес
20.05.11
✎
12:44
|
(4) Если вдруг код окажется числом, получишь граблями по лбу.
|
|||
9
Mitriy
20.05.11
✎
12:48
|
(8) кстати, интересно, точно будет ошибка, или скушает?... ты проверял?
|
|||
10
Asmody
20.05.11
✎
12:52
|
(8) даже если и текст, всё равно получит
|
|||
11
KattyMix
20.05.11
✎
12:54
|
(5)Потому что по умолчанию пол мужской...=)
Я нашла решение- СправочникРод = Строка.Номенклатура; Пока СправочникРод.Уровень() <> 0 цикл СправочникРод = СправочникРод.Родитель; Конеццикла; Если СправочникРод = Справочники.Номенклатура.НайтиПоКоду("0000045647") и т.д. |
|||
12
luns
20.05.11
✎
12:54
|
(7) скд не то. речь про запрос.
|
|||
13
Fragster
гуру
20.05.11
✎
12:55
|
(12) чем принципиально толичается СКД от запроса? в ТЗ ты результат все равно можешь выгрузить
|
|||
14
zbv
20.05.11
✎
12:55
|
(11) в ЛЧ еще есть место, где можно разместить фотку :)
|
|||
15
Адинэснег
20.05.11
✎
12:55
|
охохо...
|
|||
16
Fragster
гуру
20.05.11
✎
12:56
|
никогда так не делай:
Если СправочникРод = Справочники.Номенклатура.НайтиПоКоду("0000045647") |
|||
17
Адинэснег
20.05.11
✎
12:56
|
(10) Асмод в одинэснеки подался? оО
|
|||
18
KattyMix
20.05.11
✎
12:56
|
(16)Почему?Потому что код может измениться?
|
|||
19
wPa
20.05.11
✎
12:58
|
(18) хард-код = Табу
|
|||
20
luns
20.05.11
✎
12:59
|
(13) да ничем. вон в (1) уже есть ответ.
просто Asmody сказал что запросом можно. вот мне и интересно стало чисто технически именно запросом. |
|||
21
Fragster
гуру
20.05.11
✎
12:59
|
(18) алгоритмы конфигурации должна быть независима от данных, хранящихся в ней.
|
|||
22
Fragster
гуру
20.05.11
✎
12:59
|
*должны быть
|
|||
23
Asmody
20.05.11
✎
13:00
|
(20) подсказка в слове иерархия
|
|||
24
luns
20.05.11
✎
13:01
|
(23) не надо подсказок.
запости текст плиз тем паче что если он проще чем в (2) то будет небольшим |
|||
25
Ахиллес
20.05.11
✎
13:02
|
(9) полный код: 1/2/3
Длина кода 5. Найди родителя верхнего уровня. (16) Не мы такие, жизнь такая. Не всегда предопределённые значения удобно использовать. Просто надо помнить, что тут лежат грабли. Но то, что это авнокод это несомненно. |
|||
26
Mitriy
20.05.11
✎
13:06
|
(25) просто не пробовал на числовых кодах... может, там строку строит с нулями, откуда мне знать? А проверять в лом ))
|
|||
27
Fragster
гуру
20.05.11
✎
13:08
|
(23) типа выбрать с итогами по иерархии а в обходе результата обработать только первую строку? а если родителя надо получить для кучи номенкулатуры?
|
|||
28
Адинэснег
20.05.11
✎
13:09
|
+(27)А если номенклатуры 200к?)
|
|||
29
Ахиллес
20.05.11
✎
13:11
|
(26) Строка с ведущими нулями это когда тип - "строка", когда "число", тогда без ведущих нулей.
|
|||
30
Fragster
гуру
20.05.11
✎
13:11
|
(28) => (7), конечно тормозит, но типа работает быстрее, чем рекурсия по каждому элементу, или запрос с группировкой по иерархии.
|
|||
31
KattyMix
20.05.11
✎
13:12
|
Вот мне как раз для всех элементов справочника и надо было...
|
|||
32
Fragster
гуру
20.05.11
✎
13:13
|
(31) тогда почему фотка в личной карточке не заполнена?
|
|||
33
Septera
20.05.11
✎
13:13
|
Все просто, нижем приведу пример как получить главного родителя в справочнике:
Запрос = Новый Запрос;
|
|||
34
Fragster
гуру
20.05.11
✎
13:15
|
(33) а теперь для 2-х номенклатур то же самое.
|
|||
35
Reset
20.05.11
✎
13:15
|
(8) (10) С числовым кодом действительно не будет работать, так же, как и с кодом с нулевой длиной. А я писал что метод универсальный на все случаи? Для приведенного в (0) условия - метод полностью рабочий. Точнее, вариант метода. Сам использую в таких случаях вариант из (11).
|
|||
36
Адинэснег
20.05.11
✎
13:16
|
ВЫБРАТЬ
Номенклатура.Ссылка, ВЫБОР КОГДА Номенклатура.Родитель = &ПустаяСсылка ТОГДА &ПустаяСсылка ИНАЧЕ ВЫБОР КОГДА Номенклатура.Родитель.Родитель = &ПустаяСсылка ТОГДА Номенклатура.Родитель ИНАЧЕ ВЫБОР КОГДА Номенклатура.Родитель.Родитель.Родитель = &ПустаяСсылка ТОГДА Номенклатура.Родитель.Родитель ИНАЧЕ ВЫБОР КОГДА Номенклатура.Родитель.Родитель.Родитель.Родитель = &ПустаяСсылка ТОГДА Номенклатура.Родитель.Родитель.Родитель ИНАЧЕ ВЫБОР КОГДА Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель = &ПустаяСсылка ТОГДА Номенклатура.Родитель.Родитель.Родитель.Родитель ИНАЧЕ &ПустаяСсылка КОНЕЦ КОНЕЦ КОНЕЦ КОНЕЦ КОНЕЦ КАК ВерхнийУровень ИЗ Справочник.Номенклатура КАК Номенклатура ГДЕ (НЕ Номенклатура.ЭтоГруппа) |
|||
37
Ахиллес
20.05.11
✎
13:16
|
(33) Нафига тут
| Номенклатура.ПометкаУдаления = ЛОЖЬ А если мне надо помеченный на удаление элемент обработать? |
|||
38
KattyMix
20.05.11
✎
13:16
|
(32)какой-то не логичный вопрос...
интересует блондинка или нет?))) |
|||
39
nop
20.05.11
✎
13:16
|
(36) ужаснах. ВЫБОР - зло
|
|||
40
zbv
20.05.11
✎
13:17
|
(38) нет. Традиция такая есть на мисте.
|
|||
41
spiteful41
20.05.11
✎
13:17
|
(33)+100500
|
|||
42
Fragster
гуру
20.05.11
✎
13:17
|
(38) можно и так сказать... просто ускорит получение ответов в дальнейшем...
|
|||
43
zbv
20.05.11
✎
13:18
|
+ (42) и не будут засорять тему, сообщениями про фото. :)
|
|||
44
nop
20.05.11
✎
13:18
|
(34) продублировать текст запроса Н раз, используя ОБЪЕДИНИТЬ ?
|
|||
45
Адинэснег
20.05.11
✎
13:18
|
(41)(33) - 100500
вы чо запросы собрались в цикле крутить? |
|||
46
nop
20.05.11
✎
13:19
|
(45) можно в цикле составить текст, а потом выполнить 1 раз
|
|||
47
Fragster
гуру
20.05.11
✎
13:19
|
самый универсальный способ - в (7)
|
|||
48
smaharbA
20.05.11
✎
13:20
|
строкаТЧ.Номенклатура.ПолныйКод
|
|||
49
Адинэснег
20.05.11
✎
13:20
|
(46) ПЕРВЫЕ возратит родителя только для одной позиции.
А если я беру 5-7 тыщ позиций?) |
|||
50
Septera
20.05.11
✎
13:21
|
Способ в (33) Выигрывает в быстродействии у всех, готов сертификат на стол положить если это не так =)
|
|||
51
Fragster
гуру
20.05.11
✎
13:21
|
(48) не работает, если в коде есть /
|
|||
52
KattyMix
20.05.11
✎
13:21
|
А чем вам мой вариант не понравился?Он же короче ваших запросов...Просто прибавляю столько родителей,сколько мне надо...
СправочникРод = Строка.Номенклатура; Пока СправочникРод.Уровень() <> 0 цикл СправочникРод = СправочникРод.Родитель; Конеццикла; |
|||
53
nop
20.05.11
✎
13:21
|
(48) а если в наименованиях есть символ / ?
|
|||
54
Fragster
гуру
20.05.11
✎
13:22
|
(50) как получить для всего справочника?
ну и да, у меня нет сертификата, но сравни с (7) |
|||
55
nop
20.05.11
✎
13:22
|
(49) см (44)
|
|||
56
Fragster
гуру
20.05.11
✎
13:22
|
(52) медленный
|
|||
57
zbv
20.05.11
✎
13:23
|
для нескольких номенклатур. по скорости ХЗ.
ВЫБРАТЬ Номенклатура.Ссылка КАК Ссылка ИЗ Справочник.Номенклатура КАК Номенклатура ГДЕ Номенклатура.ПометкаУдаления = ЛОЖЬ И Номенклатура.Ссылка В(&Ссылка) ИТОГИ ПО Ссылка ТОЛЬКО ИЕРАРХИЯ |
|||
58
zbv
20.05.11
✎
13:24
|
+ (57) правда в какой папке, какая номенклатура видно не будет :)
|
|||
59
Fragster
гуру
20.05.11
✎
13:24
|
(57) а теперь - если номенклатуры в разных группах ?
|
|||
60
KattyMix
20.05.11
✎
13:24
|
какая тема оказывается популярная)))
|
|||
61
nop
20.05.11
✎
13:24
|
есть ещё вариант определить максимальную глубину вложености в справочнике единожды. После чего составлять динамически (программно) текст запроса типа (2) но не на 5 уровней, а на определенную ранее глубину вложености.
|
|||
62
Septera
20.05.11
✎
13:25
|
(49) тебе же сказали что можно составить запрос под твою задачу, не вижу проблемы в этом, пример который я привел в (33) универсален и работает очень быстро
|
|||
63
Fragster
гуру
20.05.11
✎
13:25
|
(61) ну, результирующий запрос будет быстрым, но вот получение максимального уровня может затянуться :)
|
|||
64
Fragster
гуру
20.05.11
✎
13:26
|
(62) запрос в цикле работает быстро?
|
|||
65
smaharbA
20.05.11
✎
13:26
|
(51) ну и чо
|
|||
66
smaharbA
20.05.11
✎
13:26
|
(53) пох
|
|||
67
Адинэснег
20.05.11
✎
13:27
|
(64) у него в базе 100 ном-х позиций :-D
|
|||
68
Fragster
гуру
20.05.11
✎
13:27
|
(65) если есть 2 группы верхнего уровня:
а а/а и искомая номенклаутра находится в "а/а", то анализ полного кода все равно вернет "а" |
|||
69
nop
20.05.11
✎
13:27
|
(63) но оно того стоит, 1 раз сделать определение в ПриНачалеРаботыСистемы(). Если конфу нельзя менять, и отчет внешний, тогда упс
|
|||
70
smaharbA
20.05.11
✎
13:28
|
да хоть три
|
|||
71
FN
20.05.11
✎
13:28
|
(0)
Если в 8-ке есть функция ПолныйКод() и коды уникальны по всем справочнику, то юзай Если Лев(строкаТЧ.ПолныйКод(),11)="0000045647/" тогда .... КонецЕсли |
|||
72
Fragster
гуру
20.05.11
✎
13:29
|
(69) ага, и еще подписку на "приЗаписи" справочника повесить, да :)))
|
|||
73
nop
20.05.11
✎
13:29
|
(71) фигня, если в коде есть /
|
|||
74
Fragster
гуру
20.05.11
✎
13:29
|
(71) ты чему учишь? сам же потом переделывать будешь.
|
|||
75
nop
20.05.11
✎
13:29
|
(72) затормозит запись
|
|||
76
KattyMix
20.05.11
✎
13:30
|
У меня вообще стоит 8.0...
|
|||
77
Адинэснег
20.05.11
✎
13:30
|
(71)
ИначеЕсли (УТебяКриваяРаспределенка И КодыЕбуцоКакХотят) Тогда СидиКури(); КонецЕсли |
|||
78
Fragster
гуру
20.05.11
✎
13:31
|
(75) там у объекта по моему есть Уровень(). а так - если в процессе сеанса работы изменится максимальная глубина - будет косяк. ну и каждый раз при запуске не надо будет пересчитывать...
|
|||
79
Fragster
гуру
20.05.11
✎
13:32
|
(76) тогда запрос в цикле из (33) будет быстрее твоего метода, но ты не парься, скорее всего это не будет основным источником тормозов :)
|
|||
80
Ткачев
20.05.11
✎
13:33
|
Если Не Ссылка.Пустая() Тогда
Справочники.СПРАВОЧНИК.НайтиПоКоду(Лев(Ссылка.ПолныйКод(), Найти(Ссылка.ПолныйКод(), "/")-1)) КонецЕсли; |
|||
81
nop
20.05.11
✎
13:33
|
(78) точно. Тогда можно в ПриЗаписи() справочника Уровень() максимальный сохранять в РС например.
|
|||
82
nop
20.05.11
✎
13:34
|
(80) Баян 1005500 раз. См (77)
|
|||
83
Septera
20.05.11
✎
13:34
|
Выборка программными средствами никога не выиграет у запроса, особенно на sql базах, потому что при переводе на Transact-SQL субд использует различные планировщики запросов, которые построят оптимальный вид запроса.
|
|||
84
zbv
20.05.11
✎
13:34
|
Кстати, а зачем собственно ?
|
|||
85
FN
20.05.11
✎
13:34
|
(73) "/" поставить в код платформа не даст (во всяком случае 7.7)
(74) да ладно - абсолютно рабочий подход. Главное прямо в коде не писать "0000045647/", а брать например из константы ПроверяемыйКод=Константа.НужнаяГруппа.ПолныйКод()+"/"; Если Лев(строкаТЧ.ПолныйКод(),11)=ПроверяемыйКод тогда |
|||
86
Fragster
гуру
20.05.11
✎
13:34
|
(81) и список элементов с максимальным уровнем :))
|
|||
87
Адинэснег
20.05.11
✎
13:35
|
v8: Голосуем за добавление фунции УникальныйИдентификатор в язык запросов
добавьте в петицию "Справочник.Ссылка.ВерхнийРодитель" |
|||
88
lxs
20.05.11
✎
13:36
|
(36) Строить такие этажи в запросе, тем более, когда количество уровней иерархии неограниченное - бред
|
|||
89
FN
20.05.11
✎
13:36
|
(85)+ на 7.7 это один из самых быстрых способов проверки вхождения элемента в группу
|
|||
90
nop
20.05.11
✎
13:37
|
(86) у меня есть предложение покруче тогда. Завести реквизит в этом же справочнике Уровень и писать в него Уровень(), по реквизиту индекс. Экономия и ускорение поиска на лицо
|
|||
91
Fragster
гуру
20.05.11
✎
13:44
|
(90) :)
|
|||
92
smaharbA
20.05.11
✎
13:45
|
балбесы
|
|||
93
Reset
20.05.11
✎
13:46
|
(90) Тогда уж сразу реквизит ВерхнийРодитель )
|
|||
94
smaharbA
20.05.11
✎
13:47
|
Справочники.Номенклатура.НайтиПоКоду(строкаТЧ.Номенклатура.ПолныйКод)
все |
|||
95
Ненавижу 1С
гуру
20.05.11
✎
13:49
|
в общем случае одним запросом (пакетом запросов) нельзя
|
|||
96
Фрэнки
20.05.11
✎
13:51
|
(95) если задавать список ссылок для которых нужно найти?
|
|||
97
Адинэснег
20.05.11
✎
13:51
|
(36) строй программно
|
|||
98
Адинэснег
20.05.11
✎
13:52
|
(97)->(88)
|
|||
99
Ненавижу 1С
гуру
20.05.11
✎
13:53
|
(96) именно
|
|||
100
Ненавижу 1С
гуру
20.05.11
✎
13:53
|
1с не дала альтернативного построения иерархии, а текущий слишком топорный
|
|||
101
Mitriy
20.05.11
✎
13:53
|
(94) прикольно... а с числовым кодом прокатит?
|
|||
102
Ненавижу 1С
гуру
20.05.11
✎
13:55
|
(101) нет числовых кодов
то что называется числовым кодом есть строка с ограничением на возможные значения |
|||
103
Mitriy
20.05.11
✎
13:57
|
(102) я не это спрашивал вроде ))
|
|||
104
Ненавижу 1С
гуру
20.05.11
✎
13:58
|
(103) а что? разверни мысль
|
|||
105
smaharbA
20.05.11
✎
13:58
|
(101) х.з. я восьмерку не знаю
(реально не кодил) |
|||
106
Fragster
гуру
20.05.11
✎
14:01
|
(94) не работает
|
|||
107
Fragster
гуру
20.05.11
✎
14:02
|
||||
108
Ахиллес
20.05.11
✎
14:03
|
(102) В смысле?
То есть можно писать .НайтиПоКоду(1) или .НайтиПоКоду("1") и пофигу ни настройки справочника? Любой вариант схавает? |
|||
109
Fragster
гуру
20.05.11
✎
14:04
|
(102) оно на чар, а децимал в базе, не?
|
|||
110
Mitriy
20.05.11
✎
14:06
|
(106) а у меня сработало...
|
|||
111
Mitriy
20.05.11
✎
14:07
|
(104) разворачиваю: прокатит ли метода в (94) в случае справочника с числовым кодом.
|
|||
112
Mitriy
20.05.11
✎
14:09
|
(110) правда, я в 8.2 смотрел...
|
|||
113
Aprobator
20.05.11
✎
14:11
|
впрочем вариант в (94) довести до ума, а именно с полного кода вычитать первую часть до / и поставить поиск по полному коду, то покошернее будет. |
|||
114
Попытка1С
20.05.11
✎
14:11
|
(94) Круто.
|
|||
115
Mitriy
20.05.11
✎
14:12
|
(113) зачем доводить до ума, если и так работает?
|
|||
116
Fragster
гуру
20.05.11
✎
14:13
|
(115) почему-то не всегда работает. ты на иерархии групп и элементов проверял?
|
|||
117
Mitriy
20.05.11
✎
14:14
|
(116) нет...
|
|||
118
Mitriy
20.05.11
✎
14:16
|
(117) тьфу ты... на иерархии элементов не проверял...
|
|||
119
Mitriy
20.05.11
✎
14:18
|
(118) проверил... работает...
|
|||
120
Mitriy
20.05.11
✎
14:19
|
Ном = Справочники.Номенклатура.НайтиПоКоду(ПолеВвода1.ПолныйКод());
Сообщить(Ном); Ном = Справочники.ПодразделенияОрганизаций.НайтиПоКоду(ПолеВвода1.ПолныйКод()); Сообщить(Ном); |
|||
121
smaharbA
20.05.11
✎
14:19
|
Есть еще старый простой метод, перебрать все верхнего + Принадлежит(Элементу)
в (94) конечно найдет тот у которого есть / если есть, а далее дело техники |
|||
122
Mitriy
20.05.11
✎
14:19
|
как часы...
|
|||
123
Aprobator
20.05.11
✎
14:20
|
в (113) ошибся.
так вроде правильнее. (119) тип кода справочника какой? |
|||
124
smaharbA
20.05.11
✎
14:24
|
(122) не совсем, если будут с / и без, найдет тот в котором есть / (вроде), но тут уже не сложно и выбрать из остатка по принадлежит и те у которых код с началом полученного полного совпадет
|
|||
125
Mitriy
20.05.11
✎
14:24
|
(123) строка, вестимо...
|
|||
126
Fragster
гуру
20.05.11
✎
14:26
|
а ты проверял до конца добив длину кода? или как у меня - не полностью выбрав длину у верхнего родителя? он по ходу в "НайтиПоКоду" криво обрезает - Лев(ДлинаКода) - ну и не находит в мною указанном случае
|
|||
127
ice777
20.05.11
✎
14:26
|
(123) и это быстрее найденного автором варианта? имхо, рекурсия еще медленней.
|
|||
128
Reset
20.05.11
✎
14:26
|
(116) Не работает в случае, если верхний код не полность заполнен. Этот вариант - фактически тот же, что мой, только строка автоматически обрезается по длине кода. Т.е. в этом случае будет искать с огрызком кода 2го уровня.
|
|||
129
Сам такой
20.05.11
✎
14:27
|
Эх давно это было.
Функция ПолучитьВерхнегоРодителя(ЭлементФ) Если НЕ ЗначениеЗаполнено(ЭлементФ.Родитель) Тогда Возврат ЭлементФ; Иначе Возврат ПолучитьВерхнегоРодителя(ЭлементФ.Родитель); КонецЕсли; КонецФункции |
|||
130
Reset
20.05.11
✎
14:28
|
(129) два или три разу уже было в этой теме, вкл 1й пост
|
|||
131
smaharbA
20.05.11
✎
14:28
|
(129) см первый пост
|
|||
132
vmv
20.05.11
✎
14:28
|
Проще всего, конечно, запросом по иерархии без возни с СКД и гигантскими запросам.
из моих нетленок ) // // Ссылка: // - ссылка на иерархический объект // - массив ссылок на иерархический объект // - список значений ссылок на на иерархический объект // // ОбходРезультатаЗапроса: // "Прямой" : При таком способе обход осуществляется без группировок и иерархии. Т.е. получаем таблицу значений // "ПоГруппировкам" : Обход записей результата запроса по группировкам. Т.е. получаем дерево групп в иерархии группировок запроса. // "ПоГруппировкамСИерархией": Обход записей результата запроса по группировкам с учетом иерархии. Т.е. получаем дерево групп строго соответвествующее иерархии групп // Функция ПолучитьВышестоящихРодителейДляСсылки(Ссылка, ОбходРезультата = "Прямой") Экспорт Перем ПолноеИмяТаблицы, ТекстЗапроса, Запрос, РезультатЗапроса; // Определим имя таблицы Если ТипЗнч(Ссылка) = Тип("Массив") Тогда Если Не Ссылка.Количество() Тогда Если ВРег(ОбходРезультата) = "Прямой" Тогда Возврат Новый ТаблицаЗначений; Иначе Возврат Новый ДеревоЗначений; КонецЕсли; КонецЕсли; ПолноеИмяТаблицы = AddМетаданные.ИмяТаблицыПоСсылке(Ссылка[0], Истина); ИначеЕсли ТипЗнч(Ссылка) = Тип("СписокЗначений") Тогда Если Не Ссылка.Количество() Тогда Если ВРег(ОбходРезультата) = "Прямой" Тогда Возврат Новый ТаблицаЗначений; Иначе Возврат Новый ДеревоЗначений; КонецЕсли; КонецЕсли; ПолноеИмяТаблицы = AddМетаданные.ИмяТаблицыПоСсылке(Ссылка[0].Значение, Истина); Иначе ПолноеИмяТаблицы = AddМетаданные.ИмяТаблицыПоСсылке(Ссылка, Истина); КонецЕсли; ТекстЗапроса = "ВЫБРАТЬ РАЗЛИЧНЫЕ | ТаблицаОбъекта.Код КАК Код, | ТаблицаОбъекта.Ссылка КАК Ссылка, | ТаблицаОбъекта.Родитель КАК РодительСсылок |ИЗ | " + ПолноеИмяТаблицы + " КАК ТаблицаОбъекта"; ТекстЗапроса = ТекстЗапроса + " |ГДЕ | ТаблицаОбъекта.Ссылка В (&Ссылка) |ИТОГИ ПО | Ссылка ТОЛЬКО ИЕРАРХИЯ"; Запрос = Новый Запрос; // Установка параметров запроса Запрос.УстановитьПараметр("Ссылка", Ссылка); // Получение результата Запрос.Текст = ТекстЗапроса; РезультатЗапроса = Запрос.Выполнить(); // Возврат выборки групп Возврат РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса[ОбходРезультата]); КонецФункции Функция ИмяТаблицыПоСсылке(Ссылка, ПолноеИмя=Истина) Экспорт ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗнч(Ссылка)); Если ПолноеИмя Тогда Возврат ОбъектМетаданных.ПолноеИмя(); Иначе Возврат ОбъектМетаданных.Имя; КонецЕсли; КонецФункции |
|||
133
Сам такой
20.05.11
✎
14:29
|
теперь три или четыре включая пост 129.
|
|||
134
smaharbA
20.05.11
✎
14:34
|
а после обсуждают "гомнокод", практически любой так называемый "гомнокод" при светлой памяти и чистом взгляде максимально рационален в отличие от тех кто его так называет
|
|||
135
Fragster
гуру
20.05.11
✎
14:36
|
(134) дада, код кристально чист, но если код заполнен не на всю длину - то это проблема данных, а не кода.
|
|||
136
vmv
20.05.11
✎
14:40
|
(134)
1. Одной вещью, которую мы узнали за все эти годы, было то, что многие люди просто копируют код, даже не понимая, что он делает(с)Реймонд Чен, Microsoft 2. 90% кода в интернете - го..но(с)Колумб) 3. Моё определение "говна" может не совпадать с вашим. (С) Ларри Остерман.) |
|||
137
smaharbA
20.05.11
✎
14:52
|
(135) тебе надо весь расписать ?
(136) в сад |
|||
138
smaharbA
20.05.11
✎
14:52
|
это и есть что NS называет "кодеры"
|
|||
139
smaharbA
20.05.11
✎
14:53
|
+ программистами вам никогда не быть
|
|||
140
Reset
20.05.11
✎
14:56
|
(0) (11) Кстати, если задачей является не определение верхнего родителя, а является ли конкретный родитель таковым (как можно подумать из того, что у тебя в примерах в конце идет проверка на равенство), возможен вариант:
Для каждого строкаТЧ из ЦеныПоставщиков цикл Если строкаТЧ.Номенклатура.ПринадлежитЭлементу(СсылкаНаПроверяемогоРодителя) |
|||
141
Fragster
гуру
20.05.11
✎
16:35
|
(137) код из (94) не работает, если длина кода верхнего элемента меньше длины кода в метаданных, факт.
|
|||
142
Fragster
гуру
20.05.11
✎
16:36
|
ну и да - говнокод - это в том числе использование недокументированных возможностей.
|
|||
143
Дикообразко
20.05.11
✎
16:39
|
||||
144
Дикообразко
20.05.11
✎
16:41
|
ВерхнийРодитель=ЗначениеИзСтрокиВнутр(Шаблон("[ЗначениеВСтрокуВнутр(Спр"+СтрЗаменить(Формат("","С"+(Спр.Уровень()-1))," ",".Родитель")+")]"));
(с) Рупор абсурда эхх... времена :) |
|||
145
smaharbA
20.05.11
✎
16:44
|
(141) дак тебе не кто не запрещает проверять на вхождение
Вот еще гомнокод (на восьмерке кодю со вчерашнего дня, если считать кодинием вчерашний код универсальной функции для работы с ооо, жкк всякие и сп не читал до)
|
|||
146
smaharbA
20.05.11
✎
16:44
|
Рупор - голова !
|
|||
147
Fragster
гуру
20.05.11
✎
16:45
|
(145) если код не во всю длину и в нем есть "/", то не работает
|
|||
148
Fragster
гуру
20.05.11
✎
16:46
|
а, не, вру
|
|||
149
Fragster
гуру
20.05.11
✎
16:47
|
но вообще - адский ад
|
|||
150
smaharbA
20.05.11
✎
17:33
|
+(146) как всегда Рупору решпект, ну и Дикообразке
Сообщить(Вычислить("Элемент"+СтрЗаменить(Формат(0,"ЧВН=;ЧЦ="+(Элемент.Уровень())+";ЧГ=0;ЧН="),"0",".Родитель"))); |
|||
151
Fragster
гуру
20.05.11
✎
17:36
|
крута!
|
|||
152
Fragster
гуру
20.05.11
✎
17:36
|
настоящая пятница здесь
|
|||
153
Fragster
гуру
20.05.11
✎
17:38
|
правда это медленнее запроса из (33) :)
|
|||
154
Лефмихалыч
20.05.11
✎
17:39
|
да вы здесь все упоротые!
|
|||
155
Лефмихалыч
20.05.11
✎
17:39
|
+(154) правильный ответ (1)
|
|||
156
Дикообразко
20.05.11
✎
20:03
|
(153) тут цель была не в быстроте :))
(150) а я поленился на 8ку перекладываться, респект тебе :) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |