Вход | Регистрация

1С:Предприятие ::

Метки: 

Запрос к Иерархии справочника как сделать

Я
   IgorRst78
 
23.10.17 - 13:15
Прошу помочь в таком вопросе.
Есть таблица вида:
-------------------------------------------
| ПолеА_Знач1 | ПолеB_Знач1 | ПолеC_Знач1 |
| ПолеА_Знач2 | ПолеB_Знач2 | ПолеC_Знач2 |
.....
-------------------------------------------

Проблема в том, что ПолеА_Знач1 и ПолеА_Знач2 это группы.
И надо размножить значения этого поля, на подчиненные элементы. При этом значения полей B и C у каждого входящего элемента должно быть таким же как у корневой папки.
Никак не пойму как сделать.
Кто подскажет?
 
 
   silent person
 
1 - 23.10.17 - 13:25
тебе родительские папки получить надо чтоли ?

https://its.1c.ru/db/metod8dev/content/2659/hdoc

Получение всех родителей элемента

В языке запросов не предусмотрено специальных средств для получения всех родителей элемента. Для выполнения задачи можно воспользоваться иерархическими итогами, однако получение иерархических итогов оптимизировано для построения итогов большого количества записей, и не вполне эффективно для получения родителей одного элемента. Для более эффективного получения всех родительских записей элемента, рекомендуется перебирать в цикле его родителей небольшими порциями. Пример:

Пример:

ТекущийЭлементНоменклатуры = ЭлементНоменклатура;

Запрос = Новый Запрос("ВЫБРАТЬ 
                      | Номенклатура.Родитель, 
                      | Номенклатура.Родитель.Родитель, 
                      | Номенклатура.Родитель.Родитель.Родитель, 
                      | Номенклатура.Родитель.Родитель.Родитель.Родитель, 
                      | Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель 
                      |ИЗ 
                      | Справочник.Номенклатура КАК Номенклатура 
                      |
                      |ГДЕ 
                      | Номенклатура.Ссылка = &ТекущийЭлементНоменклатуры";

Пока Истина Цикл
    Запрос.УстановитьПараметр("ТекущийЭлементНоменклатуры", ТекущийЭлементНоменклатуры); 
    Результат = Запрос.Выполнить(); 
    Если Результат.Пустой() Тогда 
        Прервать; 
    КонецЕсли; 
    Выборка = Результат.Выбрать(); 
    Выборка.Следующий(); 
    Для НомерКолонки = 0 По Результат.Колонки.Количество() - 1 Цикл 
        ТекущийЭлементНоменклатуры = Выборка[НомерКолонки]; 
        Если ТекущийЭлементНоменклатуры = Справочники.Номенклатура.ПустаяСсылка() Тогда 
            Прервать; 
        Иначе 
            Сообщить(ТекущийЭлементНоменклатуры); 
        КонецЕсли; 
    КонецЦикла; 

    Если ТекущийЭлементНоменклатуры = Справочники.Номенклатура.ПустаяСсылка() Тогда 
        Прервать; 
    КонецЕсли;
КонецЦикла;

В данном примере в окно служебных сообщений выводятся все родители для ссылки, записанной в переменную ЭлементНоменклатура. В цикле выбирается по 5 родителей ссылки.

Если число уровней в справочнике ограничено и невелико, то возможно получение всех родителей одним запросом без цикла.
   IgorRst78
 
2 - 23.10.17 - 13:28
(1)не - не папки - а все входящие элементы.
И ЗАПРОСОМ.
В цикле - то просто! Но я не хочу
   Mr_Best
 
3 - 23.10.17 - 13:29
(0) в запросе выбираешь все записи ПолеА и к этой таблице присоединяешь левым соединением данные из таблицы "Таблица вида" по владельцу
   IgorRst78
 
4 - 23.10.17 - 13:33
(3)я чую что должно быть левое соединение, но не пойму, как соединить по владельцу.
так как там разный уровень иерархии.
   Mr_Best
 
5 - 23.10.17 - 13:35
(4) с разным уровнем намучаешься, переделай этот регистр или создай дополнительный где храни подготовленные данные
   arsik
 
6 - 23.10.17 - 13:36
(4) Тебе же показали все. Вот это в условие пихни:
| Номенклатура.Родитель, 
| Номенклатура.Родитель.Родитель, 
| Номенклатура.Родитель.Родитель.Родитель, 
| Номенклатура.Родитель.Родитель.Родитель.Родитель, 
| Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель 

   Лефмихалыч
 
8 - 23.10.17 - 13:39
(0) оно?

ВЫбрать 
  Т1.Ссылка как ПолеАЗнач1, 
  Т2.Ссылка как ПолеBЗнач1, 
  Т3.Ссылка как ПолеСЗнач1   
Из
  Справочник.Номенклатура как Т1, 
  Справочник.Номенклатура как Т2, 
  Справочник.Номенклатура как Т3 
ГДЕ
  Т1.Ссылка в иерархии(&ГруппаПолеАЗнач1) 
  и 
  Т2.Ссылка в иерархии(&ГруппаПолеВЗнач1) 
  и 
  Т3.Ссылка в иерархии(&ГруппаПолеСЗнач1)

   Лефмихалыч
 
9 - 23.10.17 - 13:40
только это будет дохренища строк, ибо декартово. У тебя ж в топике не задано условий, по которым строки из этих трех множеств соединять...
   IgorRst78
 
10 - 23.10.17 - 13:53
(9)Это я уже все понял. намучался реально.
Задача тупая - надо сделать хранилище настроек неких, где пользователь может и группы и элементы указывать и пустые поля - для всех.

придется все же в цикле перебирать.
так очевидно проще
 
 Рекламное место пустует
   IgorRst78
 
11 - 23.10.17 - 13:53
(5)не получится - типовой справочник.
   Лефмихалыч
 
12 - 23.10.17 - 13:56
(10) 1С не умеет по иерархии соединять. Так что тут без циклов не обойдешься
   Ildarovich
 
13 - 23.10.17 - 15:03
(0) Если еще не видели статью http://catalog.mista.ru/public/158512/ , то почитайте ее. Метод применим к вашей задаче. Смысл в том, чтобы получить для каждого элемента справочника родителя, потом родителя родителя, потом .. очень быстро всех "транзитивных" родителей. Повторением (три-четыре раза) одного простого запроса. А когда все родители будут получены, легко найти все входящие в группу элементы.
(8) в иерархии - это на самом деле запрос в цикле. Можно почитать здесь: http://1clancer.ru/article/operator_v_ierarkhii_v_zaprose_764
(12) умеет (не напрямую) .. при желании обойтись можно
   youalex
 
14 - 23.10.17 - 16:01
Можно сделать служебный РС, в котором разворачивать иерархию в подписке ПриЗаписи
Типа такого: Измерения:Элемент, Уровень(число),  Ресурс:
Родитель.
   arsik
 
15 - 23.10.17 - 17:05
(12) Умеет. Но только зависит от максимального уровня справочника. Но это намного быстрее работает, чем циклами.
ВЫБРАТЬ
    тНастроек.ГруппаНоменклатуры,
    тНастроек.Цвет,
    тНастроек.Серия
ПОМЕСТИТЬ втНастройки
ИЗ
    тНастроек КАК тНастроек
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    втНастройки.ГруппаНоменклатуры,
    втНастройки.Цвет,
    втНастройки.Серия,
    Номенклатура.Ссылка
ИЗ
    втНастройки КАК втНастройки
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
        ПО (втНастройки.ГруппаНоменклатуры = Номенклатура.Ссылка
                ИЛИ втНастройки.ГруппаНоменклатуры = Номенклатура.Родитель
                ИЛИ втНастройки.ГруппаНоменклатуры = Номенклатура.Родитель.Родитель.Родитель
                ИЛИ втНастройки.ГруппаНоменклатуры = Номенклатура.Родитель.Родитель.Родитель.Родитель
                ИЛИ втНастройки.ГруппаНоменклатуры = Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель
                ИЛИ втНастройки.ГруппаНоменклатуры = Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель
                ИЛИ втНастройки.ГруппаНоменклатуры = Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель
                ИЛИ втНастройки.ГруппаНоменклатуры = Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель
                ИЛИ втНастройки.ГруппаНоменклатуры = Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель
                ИЛИ втНастройки.ГруппаНоменклатуры = Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель
                ИЛИ втНастройки.ГруппаНоменклатуры = Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель)
            И (втНастройки.Цвет = Номенклатура.Цвет)
            И (втНастройки.Серия = Номенклатура.СерияТорговойМарки)

   программистище
 
16 - 23.10.17 - 17:08
(10) сделай отборы компоновкой (там и иерархия возможна)
с иерархией не получится
   Лефмихалыч
 
18 - 24.10.17 - 20:58
(13) "умеет" - это когда 
"ПО Право.Ссылка в ИЕРАРХИИ (Лево.Группа)"

все остальное - это "не умеет"
   Ildarovich
 
19 - 24.10.17 - 23:12
(18) Было бы наивным ждать этого от языка запросов 1С, если этого нет в T-SQL.

В ИЕРАРХИИ смотрится инородно. На мой взгляд, эта конструкция - методологическая ошибка.

Лучше бы заменить ее использование служебными реквизитами иерархического справочника типа полного пути (hierarchyid) или списком родителей или left - right (вложенные множества). Решение по ссылке из (13) опирается на одно из таких возможных решений (списки родителей). Которые не пишутся в базу, а строятся на лету перед выполнение отчета.
   Tateossian
 
20 - 25.10.17 - 01:33
(19) В TSQL зато есть рекурсивные запросы, использующие обобщенные табличные выражения.


Список тем форума
Рекламное место пустует Рекламное место пустует
Закон Брукера: Даже маленькая практика стоит большой теории.
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует