|   |   | 
| 
 | Запрос к Иерархии справочника как сделать | ☑ | ||
|---|---|---|---|---|
| 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 зато есть рекурсивные запросы, использующие обобщенные табличные выражения.     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |