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

```1c
    ВЫБРАТЬ
    лк_ПравилаПечатиМаркЛиста.ВидДокумента КАК ВидДокумента,
    лк_ПравилаПечатиМаркЛиста.Контрагент КАК Контрагент,
    лк_ПравилаПечатиМаркЛиста.ТранзСклад КАК ТранзСклад,
    1 КАК Поле1
    ИЗ
    РегистрСведений.лк_ПравилаПечатиМаркЛиста КАК лк_ПравилаПечатиМаркЛиста
    ГДЕ
    лк_ПравилаПечатиМаркЛиста.ВидДокумента = &ПарамВид
    И &ПарамКлиент В иерархии (лк_ПравилаПечатиМаркЛиста.Контрагент)
```

Ошибка:
Неверные параметры "В ИЕРАРХИИ"
И &ПарамКлиент В иерархии (<<?>>лк_ПравилаПечатиМаркЛиста.Контрагент)
---
Получать всех родителей элемента - только рекурсией.
Обычный иерархический запрос с этим тоже справится.

```1c
    Выбрать
    Т.Ссылка
    Из Справочник.Контрагенты
    Где
    Т.Ссылка = &МояСсылка
    Итоги по
    Иерархия
```
---
Ага, всегда забываю про эту возможность.....Только, однако

```1c
    .....
    ИТОГИ ПО
    ССЫЛКА ТОЛЬКО ИЕРАРХИЯ
```
---
Насколько понял вопрос и если ничего не поменялось, то просто - никак, должна быть табличка: какой элемент, в какую группу входит
---
Уберите значения групп, вместо них укажите конкретные элементы, входящие в эти группы - т.е. размножьте записи в регистре
Это единственно правильное решение будет в данном случае.
---
это уже костыль.
неужели нормального решения нет?
вчера тоже ломал голову над подобной проблемой. временно сделал через рекурсию(благо данных оч мало).
---
Ну в бухгалтерии счета учета номенклатуры же как-то сделали и я не видел там в регистре много записей
---
оно там еще объектным способом ПринадлежитЭлементу() обрабатывается, не?
---
Вроде бы как результат запроса выгружается в таблицу и потом эта таблица обрабатывается.
По скорости выполнения конечно с запросом не сравнится, но похоже нет другого выбора.
---
Не. там(можно посмотреть в БухгалтерскийУчетПереопределяемый.ПолучитьСчетаУчетаСпискаНоменклатуры) если есть группы в РС СчетаУчетаНоменклатуры, то сначала строится иерархия
//Если есть группы номенклатуры в счетах учета, построим иерархию номенклатуры
В моем случае геморно городить монстра. Оставлю рекурсией)
---
Ну это и есть объектная обработка. ТС спрашивает про запрос. Запросом такой финт ушами не провернуть, если не будет зараннее сформированного списка входимостей элементов в группы всех уровней, т.е.

```1c
    И &ПарамКлиент В (лк_ПравилаПечатиМаркЛиста.Контрагент)
```

или

```1c
    И &ПарамКлиент В (Выбрать Ссылка ИЗ.....)
```

сделать можно
---
А чего бы не пойти на оборот?
Взять значение параметра &ПарамКлиент, взять всех его родителей.
Засунуть все это в массив.
И в параметре &ПарамКлиент будет массив ссылок (нужное значение и все его родители).
Далее в запросе условие будет простое:

```1c
    И лк_ПравилаПечатиМаркЛиста.Контрагент В (&ПарамКлиент)
```
---
Я об этом и сказал в (4), что просто - не получится
---
Вы предлагаете получать детальные элементы групп, указанные в регистре, я предлагаю наоборот - в параметре указывать возможные значения групп.
Это несколько проще, все-таки.
---
Да я понял, что вы предлагаете.
Получать всех родителей элемента - только рекурсией.
---
Получать всех родителей элемента - только рекурсией.
Обычный иерархический запрос с этим тоже справится.

```1c
    Выбрать
    Т.Ссылка
    Из Справочник.Контрагенты
    Где
    Т.Ссылка = &МояСсылка
    Итоги по
    Иерархия
```
---
Ага, всегда забываю про эту возможность.....Только, однако

```1c
    .....
    ИТОГИ ПО
    ССЫЛКА ТОЛЬКО ИЕРАРХИЯ
```
---
Согласен =)
---
В таком случае, запрос можно превратить в:

```1c
    ВЫбрать Ссылка ПОМЕСТИТЬ ВТ_Родители ИЗ Справочник.Контрагенты ГДЕ Ссылка = &ПарамКлиент ИТОГИ ПО ССЫЛКА ТОЛЬКО ИЕРАРХИЯ
    ;
    ВЫБРАТЬ
    лк_ПравилаПечатиМаркЛиста.ВидДокумента КАК ВидДокумента,
    лк_ПравилаПечатиМаркЛиста.Контрагент КАК Контрагент,
    лк_ПравилаПечатиМаркЛиста.ТранзСклад КАК ТранзСклад,
    1 КАК Поле1
    ИЗ
    РегистрСведений.лк_ПравилаПечатиМаркЛиста КАК лк_ПравилаПечатиМаркЛиста
    ГДЕ
    лк_ПравилаПечатиМаркЛиста.ВидДокумента = &ПарамВид
    И лк_ПравилаПечатиМаркЛиста.Контрагент В (Выбрать Ссылка Из ВТ_Родители))
```
---
Нет, так не заработает.
Во временной таблице нельзя использовать ИТОГИ.
Получение родителей контрагента - на это отдельный запрос, который надо обработать до запроса к регистру.
---
Точно, забыл.
---
(22) Спасибо за подсказку.
так и сделаю
---
в бух примерно так и делается. только нужно еще учитывать, что в РС может быть не одна подходящая запись, т.е. надо еще учитывать уровень, чтобы запись элемента была в приоритете, потом первого родителя и т.д.
короче чистым запросом получается никак.
---
если про ошибку в условии запроса, то правильно так

```1c
    И лк_ПравилаПечатиМаркЛиста.Контрагент В ИЕРАРХИИ (&ПарамКлиент)
```

а если речь идет о проверке, группа это или элемент, то следует проверять на

```1c
    И лк_ПравилаПечатиМаркЛиста.Контрагент.ЭтоГруппа
```
 а дальше по необходимости = или <> Истина
---
А если разбить условие, то что будет говорить?:
ВЫБОР КОГДА лк_ПравилаПечатиМаркЛиста.Контрагент.ЭтоГруппа
ТОГДА &ПарамКлиент В иерархии (лк_ПравилаПечатиМаркЛиста.Контрагент)
ИНАЧЕ &ПарамКлиент = лк_ПравилаПечатиМаркЛиста.Контрагент
КОНЕЦ
---
туже самую ошибку и выдаст
потому что сначала что сравниваем, а потом с чем сравниваем
правильно будет так

```1c
    ВЫБОР КОГДА лк_ПравилаПечатиМаркЛиста.Контрагент.ЭтоГруппа
    ТОГДА лк_ПравилаПечатиМаркЛиста.Контрагент В иерархии (&ПарамКлиентГруппы)
    ИНАЧЕ лк_ПравилаПечатиМаркЛиста.Контрагент = &ПарамКлиентЭлемент
    КОНЕЦ
```
---
Либо я неправильно вопрос понял, либо вы. У автора лк_ПравилаПечатиМаркЛиста.Контрагент может быть как контрагентом, так и группой и смотреть нужно не куда он входит, а кто в него входит.
---
совершенно верно.
в РС измерение содержит ГРУППУ, и если нужный контрагент входит в эту группу - нужно вернуть эту запись РС.
---
Эээээ.....В Иерархии и для элемента и для группы отработает без ошибок.
---
Умная книга рекомендует:

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

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

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

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