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