Имя: Пароль:
1C
1С v8
Запрос к Иерархии справочника как сделать
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) оно?


ВЫбрать
  Т1.Ссылка как ПолеАЗнач1,
  Т2.Ссылка как ПолеBЗнач1,
  Т3.Ссылка как ПолеСЗнач1  
Из
  Справочник.Номенклатура как Т1,
  Справочник.Номенклатура как Т2,
  Справочник.Номенклатура как Т3
ГДЕ
  Т1.Ссылка в иерархии(&ГруппаПолеАЗнач1)
  и
  Т2.Ссылка в иерархии(&ГруппаПолеВЗнач1)
  и
  Т3.Ссылка в иерархии(&ГруппаПолеСЗнач1)
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 зато есть рекурсивные запросы, использующие обобщенные табличные выражения.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший