|
Запрос к Иерархии справочника как сделать | ☑ | ||
---|---|---|---|---|
0
IgorRst78
23.10.17
✎
13:15
|
Прошу помочь в таком вопросе.
Есть таблица вида: ------------------------------------------- | ПолеА_Знач1 | ПолеB_Знач1 | ПолеC_Знач1 | | ПолеА_Знач2 | ПолеB_Знач2 | ПолеC_Знач2 | ..... ------------------------------------------- Проблема в том, что ПолеА_Знач1 и ПолеА_Знач2 это группы. И надо размножить значения этого поля, на подчиненные элементы. При этом значения полей B и C у каждого входящего элемента должно быть таким же как у корневой папки. Никак не пойму как сделать. Кто подскажет? |
|||
1
silent person
23.10.17
✎
13:25
|
тебе родительские папки получить надо чтоли ?
https://its.1c.ru/db/metod8dev/content/2659/hdoc Получение всех родителей элемента В языке запросов не предусмотрено специальных средств для получения всех родителей элемента. Для выполнения задачи можно воспользоваться иерархическими итогами, однако получение иерархических итогов оптимизировано для построения итогов большого количества записей, и не вполне эффективно для получения родителей одного элемента. Для более эффективного получения всех родительских записей элемента, рекомендуется перебирать в цикле его родителей небольшими порциями. Пример: Пример: ТекущийЭлементНоменклатуры = ЭлементНоменклатура; Запрос = Новый Запрос("ВЫБРАТЬ | Номенклатура.Родитель, | Номенклатура.Родитель.Родитель, | Номенклатура.Родитель.Родитель.Родитель, | Номенклатура.Родитель.Родитель.Родитель.Родитель, | Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель |ИЗ | Справочник.Номенклатура КАК Номенклатура | |ГДЕ | Номенклатура.Ссылка = &ТекущийЭлементНоменклатуры"; Пока Истина Цикл Запрос.УстановитьПараметр("ТекущийЭлементНоменклатуры", ТекущийЭлементНоменклатуры); Результат = Запрос.Выполнить(); Если Результат.Пустой() Тогда Прервать; КонецЕсли; Выборка = Результат.Выбрать(); Выборка.Следующий(); Для НомерКолонки = 0 По Результат.Колонки.Количество() - 1 Цикл ТекущийЭлементНоменклатуры = Выборка[НомерКолонки]; Если ТекущийЭлементНоменклатуры = Справочники.Номенклатура.ПустаяСсылка() Тогда Прервать; Иначе Сообщить(ТекущийЭлементНоменклатуры); КонецЕсли; КонецЦикла; Если ТекущийЭлементНоменклатуры = Справочники.Номенклатура.ПустаяСсылка() Тогда Прервать; КонецЕсли; КонецЦикла; В данном примере в окно служебных сообщений выводятся все родители для ссылки, записанной в переменную ЭлементНоменклатура. В цикле выбирается по 5 родителей ссылки. Если число уровней в справочнике ограничено и невелико, то возможно получение всех родителей одним запросом без цикла. |
|||
2
IgorRst78
23.10.17
✎
13:28
|
(1)не - не папки - а все входящие элементы.
И ЗАПРОСОМ. В цикле - то просто! Но я не хочу |
|||
3
Mr_Best
23.10.17
✎
13:29
|
(0) в запросе выбираешь все записи ПолеА и к этой таблице присоединяешь левым соединением данные из таблицы "Таблица вида" по владельцу
|
|||
4
IgorRst78
23.10.17
✎
13:33
|
(3)я чую что должно быть левое соединение, но не пойму, как соединить по владельцу.
так как там разный уровень иерархии. |
|||
5
Mr_Best
23.10.17
✎
13:35
|
(4) с разным уровнем намучаешься, переделай этот регистр или создай дополнительный где храни подготовленные данные
|
|||
6
arsik
гуру
23.10.17
✎
13:36
|
(4) Тебе же показали все. Вот это в условие пихни:
| Номенклатура.Родитель,
|
|||
8
Лефмихалыч
23.10.17
✎
13:39
|
(0) оно?
|
|||
9
Лефмихалыч
23.10.17
✎
13:40
|
только это будет дохренища строк, ибо декартово. У тебя ж в топике не задано условий, по которым строки из этих трех множеств соединять...
|
|||
10
IgorRst78
23.10.17
✎
13:53
|
(9)Это я уже все понял. намучался реально.
Задача тупая - надо сделать хранилище настроек неких, где пользователь может и группы и элементы указывать и пустые поля - для всех. придется все же в цикле перебирать. так очевидно проще |
|||
11
IgorRst78
23.10.17
✎
13:53
|
(5)не получится - типовой справочник.
|
|||
12
Лефмихалыч
23.10.17
✎
13:56
|
(10) 1С не умеет по иерархии соединять. Так что тут без циклов не обойдешься
|
|||
13
Ildarovich
23.10.17
✎
15:03
|
(0) Если еще не видели статью http://catalog.mista.ru/public/158512/ , то почитайте ее. Метод применим к вашей задаче. Смысл в том, чтобы получить для каждого элемента справочника родителя, потом родителя родителя, потом .. очень быстро всех "транзитивных" родителей. Повторением (три-четыре раза) одного простого запроса. А когда все родители будут получены, легко найти все входящие в группу элементы.
(8) в иерархии - это на самом деле запрос в цикле. Можно почитать здесь: http://1clancer.ru/article/operator_v_ierarkhii_v_zaprose_764 (12) умеет (не напрямую) .. при желании обойтись можно |
|||
14
youalex
23.10.17
✎
16:01
|
Можно сделать служебный РС, в котором разворачивать иерархию в подписке ПриЗаписи
Типа такого: Измерения:Элемент, Уровень(число), Ресурс: Родитель. |
|||
15
arsik
гуру
23.10.17
✎
17:05
|
(12) Умеет. Но только зависит от максимального уровня справочника. Но это намного быстрее работает, чем циклами.
|
|||
16
программистище
23.10.17
✎
17:08
|
(10) сделай отборы компоновкой (там и иерархия возможна)
с иерархией не получится |
|||
18
Лефмихалыч
24.10.17
✎
20:58
|
(13) "умеет" - это когда
"ПО Право.Ссылка в ИЕРАРХИИ (Лево.Группа)" все остальное - это "не умеет" |
|||
19
Ildarovich
24.10.17
✎
23:12
|
(18) Было бы наивным ждать этого от языка запросов 1С, если этого нет в T-SQL.
В ИЕРАРХИИ смотрится инородно. На мой взгляд, эта конструкция - методологическая ошибка. Лучше бы заменить ее использование служебными реквизитами иерархического справочника типа полного пути (hierarchyid) или списком родителей или left - right (вложенные множества). Решение по ссылке из (13) опирается на одно из таких возможных решений (списки родителей). Которые не пишутся в базу, а строятся на лету перед выполнение отчета. |
|||
20
Tateossian
25.10.17
✎
01:33
|
(19) В TSQL зато есть рекурсивные запросы, использующие обобщенные табличные выражения.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |