Имя: Пароль:
1C
1С v8
Иерархия в табличном поле, данными является табличная часть
,
0 Invis91
 
20.04.12
23:00
Всем добрый вечер. Подскажите пожалуйста, вот есть у меня табличная часть с реквизитам Родитель и Номенклатура,оба типа СправочникСсылка.Номенклатура, как сделать так, чтобы в связанном с табличной частью табличном поле отобразить иерархию по родителям. ну на всякий случай пример:
+ родитель1
 - номенклатура1
 - номенклатура2
+ родитель2
 - номенклатура3
 - номенклатура4
1 ProProg
 
20.04.12
23:00
юзай дерево
2 ProProg
 
20.04.12
23:02
на форму вешаешь дерево которой заполняешь табличной частью измененйи в дереве также обратно фиксируешь в табличную часть. Работа непростая с нулевыми знаниями
3 zak555
 
20.04.12
23:04
ТЧ чего ?
4 Invis91
 
20.04.12
23:06
Табличная часть справочника
5 le_
 
20.04.12
23:07
(0) Если это не собственное дерево, а иерархия из справочника, то строится оч. просто запросом.
6 Invis91
 
20.04.12
23:13
Да, знаний, к сожалению, не так много, пока только учусь, вроде со всем сам разбирался, но тут конечно в ступор попал. По поводу запроса думал уже, но там тоже не очень простая реализация будет при добавлении/удалении элемента.
7 Злобный Фей
 
20.04.12
23:24
(6) при добавлении/удалении элемента ничего делать не надо.
8 Invis91
 
21.04.12
00:26
Я немного неправильно наверно написал, напишу еще раз более конкретно. Есть 2ух уровневый иерархический справочник "Разделы номенклатуры"(1ый уровень раздел,2ой - подраздел), вида:
+Вентиляция
 - Холод
 - Кондиционирование
+Холодильное оборудование
 - Холод
 - Электрика

Дело в том, что в форме элемента справочника "Номенклатура", нужно указать к каком подразделу/подразделам, конкретная номенклатура относится, и так как вы видите, в данном примере подраздел "Холод" есть как в первом, так и во втором разделе, и вследствие этого, мне необходимо сделать отображение по иерархии в форме справочника "Номенклатура", дабы наглядно было видно что к чему.
Я не прошу указывать мне точных алгоритмов, сам стараюсь во всем разбираться, но тут не получается, прошу лишь указать мне ход мысли, в какую сторону двигаться для решения этой проблемы. Заранее спасибо.
9 le_
 
21.04.12
00:45
(8) В справочник номенклатуры можно добавить ТЧ "Разделы", которую заполнять разделами, без родителей. Например, у элемента справочника Номенклатура1 в ТЧ будет Электрика и Кондиционирование.

На форме будет табличное поле с типом дерево значений, которое будет строиться запросом:
ВЫБРАТЬ
   РазделыНоменклатуры.Ссылка Как Раздел
ИЗ
   Справочник.РазделыНоменклатуры КАК РазделыНоменклатуры
ГДЕ
   РазделыНоменклатуры.Ссылка В(&ВыбранныеРазделы)
УПОРЯДОЧИТЬ ПО
   РазделыНоменклатуры.Ссылка ИЕРАРХИЯ
АВТОУПОРЯДОЧИВАНИЕ


Параметр в запрос устанавливается так:
Запрос.УстановитьПараметр("ВыбранныеРазделы", ЭлемНоменклатура1.Разделы.ВыгрузитьКолонку("Раздел"));//раздел - это единственный реквизит в ТЧ "Разделы"

Выводится дерево оч. просто:
Дерево = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);

После удаления или добавления элементов в ТЧ "Разделы" перестраиваешь дерево запросом.
При добавлении элемента в дерево, добавляешь его в ТЧ.
10 Invis91
 
21.04.12
00:56
(9) Спасибо большое, le_, теперь понял вроде)
11 Invis91
 
21.04.12
21:19
ВЫБРАТЬ
   РазделыНоменклатуры.Ссылка Как Раздел
ИЗ
   Справочник.РазделыНоменклатуры КАК РазделыНоменклатуры
ГДЕ
   РазделыНоменклатуры.Ссылка В(&ВыбранныеРазделы)
УПОРЯДОЧИТЬ ПО
   РазделыНоменклатуры.Ссылка ИЕРАРХИЯ
АВТОУПОРЯДОЧИВАНИЕ

В результате на выходе получаю лишь выбранные подразделы без иерархии, родителей не получаю. Как всегда с примером для наглядности:

Вход:
Справочник.РазделыНоменклатуры:
+Вентиляция
 - Холод
 - Кондиционирование
+Холодильное оборудование
 - Холод
 - Электрика

В данном случае параметр "Выбранные разделы" = "Кондиционирование"

Выход:
Кондиционирование
12 ProProg
 
21.04.12
21:22
пипец. ты скажи слепой? признайся

УПОРЯДОЧИТЬ ПО
   РазделыНоменклатуры.Ссылка ИЕРАРХИЯ

или читать не умеешь? вот что ты написал? прочитай сто раз и вдумайся
13 Invis91
 
21.04.12
21:56
наверно еще и тупой, потому что проблему я вижу в том, что я в запросе не выбираю родителей, а вследствие этого они не выводятся и никакой иерархии, соответственно, нет.
14 Maniac
 
21.04.12
22:01
нужно СГРУППИРОВАТЬ ПО а не УПОРЯДОЧИТЬ
15 Maniac
 
21.04.12
22:02
плюс ИТОГИ ПО
16 Maniac
 
21.04.12
22:02
и вот в итогах есть ИЕРАРХИЯ
17 le_
 
21.04.12
22:03
(13) Все дело в обходе результата запроса.
18 le_
 
21.04.12
22:07
(15) Здесь можно обойтись без итогов.
19 le_
 
21.04.12
22:08
+(17)(13) Если проверяешь запрос в консоли, вывод сделай не в список, а в дерево.
20 Invis91
 
21.04.12
22:13
Спасибо, Maniac. le_, а причем здесь обход результатов, если в результате выполнения запроса, я самой иерархии не получаю. Да, я в консоль именно в дерево и выгружаю.
21 le_
 
21.04.12
22:19
(20) Слово ИЕРАРХИЯ в запросе (9) по-твоему, для красоты вставлено?
22 Invis91
 
21.04.12
22:29
Да я понимаю, просто если я конкретно не выбираю родителей, а я их конкретно не выбираю, то ниче я собсна не получу, ну да ладно.
23 le_
 
21.04.12
22:35
(22) А в справочнике РазделыНоменклатуры иерархия элементов или групп и элементов?
24 Maniac
 
21.04.12
22:40
еще раз чтобы етбя было как ты хочешь дерево надо делать ИТОГИ ПО
25 Maniac
 
21.04.12
22:41
только ИТОГИ ПО могу выводить иерархию в нужном виде.
26 Maniac
 
21.04.12
22:44
это единственным метод который выводит в запросе группы справочника!
27 GoldenCalf
 
21.04.12
22:47
(26) Ложь
28 Maniac
 
21.04.12
22:48
(27) меня не интересуют посты без аргументов. хочешь доказать обратное - конкретно пиши.
29 Maniac
 
21.04.12
22:50
без итогов ПО в котором доступен метод ИЕРАРХИЯ любые запросы работают прямолинейно и выводят только записи таблиц данных в которых содержаться только элементы. Чтобы программа выводила иерархию (т/е/ добавляла в результат запроса еще и группы соответствующего справочника) это единственный метод. Хочешь доказать обратное - докажи!
30 Maniac
 
21.04.12
22:51
можно конечно еще сделать в запросе переменные типа через точку 7Родитель и делать сгруппировать НО это будет неправильным подходом для многоуровневого справочника с разным количеством групп разных элементов!
31 le_
 
21.04.12
22:52
(29) Справочник номенклатуры есть в базе?
Выполни запрос:
ВЫБРАТЬ
   Номенклатура.Ссылка  
ИЗ
   Справочник.Номенклатура КАК Номенклатура

УПОРЯДОЧИТЬ ПО
   Ссылка ИЕРАРХИЯ
32 Maniac
 
21.04.12
22:54
(31) епона мать. в сабже речь не сказана о справочнике. а о табличной части, в которой я на сто процентов верен еще есть числовые показатели и прочая лабуда и без итогов никак не обойтись. неужели сложно так догадаться.
33 GoldenCalf
 
21.04.12
22:54
(29)
ВЫБРАТЬ
   Номенклатура.Ссылка КАК Ссылка,
   Номенклатура.ЭтоГруппа
ИЗ
   Справочник.Номенклатура КАК Номенклатура

Результат
Ссылка            ЭтоГруппа
Новая группа    истина
Новая услуга    ложь
Новый товар    ложь
34 GoldenCalf
 
21.04.12
22:55
(32) в (26) ты сам пишешь про справочник
35 Maniac
 
21.04.12
22:55
(33) иди отдыхай. у тебя полная фуйня. это не дерево
36 Maniac
 
21.04.12
22:56
(34) справочник как одна из части данных запроса.
37 le_
 
21.04.12
22:59
В (9) действительно есть косяк ) Группы по условию не пройдут.
Итоги - да, покажут группы.
38 GoldenCalf
 
21.04.12
22:59
Это был ответ на (26). Я сказал что это не правда. Привел пример. Теперь ты начал отмазываться
39 Maniac
 
21.04.12
23:00
когда вы уже научитесь задачи воспринимать как следует а не с примитивной стороны. и за этого вашего примитива у людей ничерта и не получается. потому что до конца задачу воспринимать не желаете. Я сразу например понял что речь идет о построенни дерева с данными а не тупой выборки справочника. Убиваете и свое время и автор ничерта понять не моет почему все не так.
40 Maniac
 
21.04.12
23:02
(38) какая нафиг отмазка. ты решил влезть не пытаясь ни на каплю вникнуть в сабж. впрочем читай (39)
41 Maniac
 
21.04.12
23:09
(38) правда в том что ты потратил мое время на читание твоего обвинения в лжи, когда в действительности сам понес ересь. Всю тему 20 раз было сказано - нужно ДЕРЕВО а ты влез с нулывыми знаниями элементарных вещей.
42 Maniac
 
21.04.12
23:15
(0) ктстати заранее предупреждаю (прдвижу) следующую твою проблему!!! Если ты будешь выгружать запрос в дерево? а именно только так и не иначе ты получишь ДЕРЕВО в нем на последнем уровне строк дерева будут идти детальные записи. а это значит что если ты хочешь в форме увидеть это дерево то в нем будет идти еще один + который будет дубливароть две строки. Это особенность!
Чтобы убрать эти строки понадобится специальный рекурсивный обход дерева полученного из запроса для построения нормального дерева на форме.
Этто еще добавит код в котором нужно знать как сделат рекурсивный обход дерева. Но это даже плюс. Потому что в случае еще дополнительных расчетов или условий которые произойдут в обходе можно будет добавлять еще какие то свои расчеты специфические которые можно будет выполнять программно.
43 Maniac
 
21.04.12
23:19
+(42) причем эта проблема ОТСУТСТВУЕТ если речь идет об 82 на управляемых формах и запрос был получае программно при помощи СКД и программно выгружен в дерево. Тюкю в СКД группировки и значение иерархии не нужно задавать в запросе и там отсутствует понятие ИТОГИ ПО. группировки и ерархия задаются в самом СКД и выгрузка такого запроса в дерево происходит без детальных записей (т/е/ не будет задвоения нижних уровней по каждой строке).
Впрочем я думаю все чт оя описал никому нихрена из тех кто в этой ветке учавствовал даже неизвестно по прчине недостаточного уровня знаний.
44 Invis91
 
21.04.12
23:24
Ого, тут дискуссия)(22) Извиняюсь, что сразу не сказал - иерархия элементов.
ну в общем, после метода проб и ошибок, на выходе получил единственный работающий вариант:

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

Чтобы был такой же функционал с УПОРЯДОЧИТЬ ПО, как я понимаю, необходимо явно выбирать группы и элементы этой самой иерархии. А с ИТОГИ ПО ТОЛЬКО ИЕРАРХИЯ, необходимо выбрать лишь один элемент какого-нибудь уровня иерархии, вобщем в моем случае намного удобней. Всем спасибо.
45 le_
 
21.04.12
23:28
(43) Вот вариант без дублирования элементов в дереве. (!)Только для справочника с известным количеством уровней. Для задачи Invis91 вполне сгодится. Здесь не нужно будет обходить дерево.

ВЫБРАТЬ
   Вложенный.Ссылка
ИЗ
   (ВЫБРАТЬ
       Номенклатура.Ссылка КАК Ссылка
   ИЗ
       Справочник.Номенклатура КАК Номенклатура
   ГДЕ
       Номенклатура.Ссылка В(&Список)
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       Номенклатура.Родитель
   ИЗ
       Справочник.Номенклатура КАК Номенклатура
   ГДЕ
       Номенклатура.Ссылка В(&Список)) КАК Вложенный

УПОРЯДОЧИТЬ ПО
   Вложенный.Ссылка ИЕРАРХИЯ
46 Invis91
 
21.04.12
23:28
(42) а может просто добавить после ИТОГИ ПО взамен ключевого слово ИЕРАРХИЯ, кл.слово ТОЛЬКО ИЕРАРХИЯ, если я правильно понял. Да, вначале была такая проблема, но после добавления ТОЛЬКО ИЕРАРХИЯ - исчезла
47 le_
 
21.04.12
23:31
(46) Если бы у тебя был справочник с иерархией групп это не прокатило бы...
48 Maniac
 
21.04.12
23:33
(44) уПОРЯДОЧИТЬ ПО не делает никакого дерева. эио метод сортировки!! Т7к если ты будешь делать запрос по обычному справочнику - запрос сделает обращение к базе и выведет все элементы справочника в результат запроса (все группы и элементы) но это не будет ИЕРАРХИЕЙ и ДЕРЕВОМ. он тупо выведет все как есть в таблицах базы данных. метод УПОРЯДОЧИТЬ ПО тупо просто сделает сортировку как она у тебя выглядит в справочнике - НО это не будет ДЕРЕВОМ. это просто окажется таблицей в которой в действительности все будет упорядочено НО ты никогда не получишь дерева с плюсиками и минусиками. Это будет обыяная таблица значений в которой будут конечно будут папки и элементы но это будет просто упорядоченной таблицей и не более.
49 Invis91
 
21.04.12
23:35
(47)хм, да, согласен, не прокатило бы
50 Maniac
 
21.04.12
23:36
(45) для простых задач может быть.. хотя надо смотреть на замеры. Для сложных задач (у меня например есть запрос по 10 регистрам в результате которого формируется дерево с полным перечнем всех данных и еще кучи наворотов. включая то что мне рекусрия потом в любом случае необходимо из за количества нстроек пользовтеля которые он может задавать при расчетах и которые в запрос просто вообще никак не воткнуть.
51 Invis91
 
21.04.12
23:39
Спасибо всем, ребят, что помогли) У самого бы заняло это куда больше времени)
52 Maniac
 
21.04.12
23:41
Опят таки логически - если зачем то понадобилось дерево на форме - я уверен на 100 процентов что не просто так. Кому то и зачем то это понадобилось для работы! а это значит кто то и что то будет делать в ней. И в любом случае все что будет связано с работой пользователя с работйо в дереве неизбежно приведет в рекурсиям.
53 le_
 
21.04.12
23:41
(48) А вот это уже неправда.
Пример:
Процедура КнопкаВыполнитьНажатие(Кнопка)
   Массив = Новый Массив;
   Массив.Добавить(Справочники.Номенклатура.НайтиПоНаименованию("test", Истина));
   Запрос = Новый Запрос("ВЫБРАТЬ
                         |    Вложенный.Ссылка
                         |ИЗ
                         |    (ВЫБРАТЬ
                         |        Номенклатура.Ссылка КАК Ссылка
                         |    ИЗ
                         |        Справочник.Номенклатура КАК Номенклатура
                         |    ГДЕ
                         |        Номенклатура.Ссылка В(&Список)
                         |    
                         |    ОБЪЕДИНИТЬ ВСЕ
                         |    
                         |    ВЫБРАТЬ
                         |        Номенклатура.Родитель
                         |    ИЗ
                         |        Справочник.Номенклатура КАК Номенклатура
                         |    ГДЕ
                         |        Номенклатура.Ссылка В(&Список)) КАК Вложенный
                         |
                         |УПОРЯДОЧИТЬ ПО
                         |    Вложенный.Ссылка ИЕРАРХИЯ");
   Запрос.УстановитьПараметр("Список", Массив);
   Дерево = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
   Дерево.ВыбратьСтроку();
КонецПроцедуры


(50) Замеры замерами, а дерево обходить не нужно. В обоих запросах объединения установлены параметры. Отработает довольно быстро.
54 Maniac
 
21.04.12
23:41
(51) я думаю что ты сейчас решаил тольк процентов 20 того что еще потом навешается с этими деревьями.
55 le_
 
21.04.12
23:43
(52) Я делал подобное просто для представления данных в дереве. Пользователям так проще было ориентироваться. Ничего особенного они с ним не делали, только добавляли/удаляли элементы, которые хранились в ТЧ.
56 Maniac
 
21.04.12
23:43
(53) у тебя простой запрос. не хочу уже делать усложнений. реально тема надоела) как и сама 1С)) пора отдыхать.
Но могу скзать что вряд ли я буду такую конструкцию использовать т/к/ у меня задачи все равно в стократном размере сложнее
57 le_
 
21.04.12
23:45
(56) Конечно, к разным задачам разный подход. Не спорю.
58 Maniac
 
21.04.12
23:45
у номенклатуры никогда не бывает одного уровня. а это онсоновй справочник по кторому 99.99 процентов работы приходится делаьт всем 1Сникам вместе взятым.
59 le_
 
21.04.12
23:47
(58) Здесь я справочник номенклатуры использовал только потому, что он в большинстве типовых есть и любой сможет проверить примеры.
60 Maniac
 
21.04.12
23:51
(59) Давай отдыхать) Удачи)
61 Invis91
 
24.04.12
17:16
Так, задача усложнилась, вот, например, есть у меня справочник "Номенклатура", в ТЧ "Разделы" у Справочника записаны все подразделы (разделы мы берем из СправочникСсылка.РазделыНоменклатуры), к которым принадлежит Номенклатура.

Справочник.РазделыНоменклатуры:
+Вентиляция
 - Холод
 - Кондиционирование
+Холодильное оборудование
 - Холод
 - Электрика

Номенклатура "Кондиционер Toshiba"
ТЧ "Разделы:
Кондиционирование
Электрика

Так вот, необходимо, чтобы в созданной мною обработке, при добавлении в Табличное Поле "Обработка"(тип Дерево Значений) номенклатуры, добавлялась и вся иерархия разделов, ну вот пример:


Табличное Поле "Обработка"
+ Вентиляция
 -Кондиционирование
   -Кондиционер Toshiba
+Холодильное  Оборудование
 -Электрика
   -Кондиционер Toshiba
62 Invis91
 
24.04.12
17:21
Как добавить иерархию разделов, в этой теме уже написали, но как к этой иерархии, добавить еще один уровень и отображать там Номенклатуру, которая относится к данному подразделу - вот это действительно проблема, ничего путного в голову не приходит. Если только программно добавлять к подразделам подчиненные записи в дереве
63 le_
 
24.04.12
17:37
(62) А не проще вместо справочника "Разделы номенклатуры" завести группы в справочнике "Номенклатура"?
64 Invis91
 
24.04.12
17:42
(63) К сожалению нет, группы используются для другой цели, необходимо функционал именно со справочником "Разделы Номенклатуры". Были бы просто группы - было бы конечно намного проще)
65 le_
 
24.04.12
17:54
(62) Можно делать запрос к ТЧ разделов, выбирать разделы и ссылку на саму номенклатуру и добавить ее (ссылку) в итоги.
66 Invis91
 
24.04.12
18:22
Сделал так(Оборудование - ТП Дерево Значений), немного кривовато, но пока что первый вариант:

Процедура Кнопка1Нажатие(Элемент)
   ФормаВыбора = Справочники.Номенклатура.ПолучитьФормуВыбора();
   Значение = ФормаВыбора.ОткрытьМодально();
   Запрос = Новый Запрос;
   Запрос.Текст = "
   |ВЫБРАТЬ
   |   НоменклатураРазделыНоменклатуры.РазделНоменклатуры КАК Раздел,  
   |    НоменклатураРазделыНоменклатуры.Ссылка КАК Номенклатура
   |    
   |ИЗ
   |    Справочник.Номенклатура.РазделыНоменклатуры КАК НоменклатураРазделыНоменклатуры
   |ГДЕ
   |    НоменклатураРазделыНоменклатуры.Ссылка = &Номенклатура
   |ИТОГИ ПО Раздел ТОЛЬКО ИЕРАРХИЯ
   |";
   Запрос.УстановитьПараметр("Номенклатура",    Значение);     //Номенклатура
   РезультатЗапроса = Запрос.Выполнить();
   ВыборкаРазделов = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
   Пока ВыборкаРазделов.Следующий() Цикл
       
       Строка = Оборудование.Строки.Добавить();
       Строка.Наименование = ВыборкаРазделов.Раздел;
       Выборка = ВыборкаРазделов.Выбрать();
       
       Пока Выборка.Следующий() Цикл
           СтрокаПодраздела = Строка.Строки.Добавить();
           СтрокаПодраздела.Наименование = Выборка.Раздел;
           СтрокаНоменклатуры = СтрокаПодраздела.Строки.Добавить();
           СтрокаНоменклатуры.Наименование = Выборка.Номенклатура;
       КонецЦикла;
       
   КонецЦикла;    
   
   
КонецПроцедуры