Можно как то в "вычисляемом поле" получить верхний уровень?
Мою экспортную функцию не хавает.........ОШИБКА - "Значение не является значением объектного типа (Родитель)"
В запросе у меня вроде ссылка, откуда и пихаю её в выражение вычисляемого поля.

```1c
    Функция ВерхнийРодитель(Ссылка) Экспорт //получаем верхнее подразделение
    Возврат ?(Ссылка.Родитель.Пустая(), Ссылка, ВерхнийРодитель(Ссылка.Родитель));
    КонецФункции
```
---
Ну так я и написал код для экспортной процедуры запускаемой из СКД.

Можно конечно в выражении СКД или просто в запросе написать что-то вроде:

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

Но требует ограничения уровней и по скорости может быть не очень
---
Выбранные поля - Системные поля "Уровень" и "УровеньВГруппировке"
---
Как это применить? Мне то наименование (ссылка) нужно и по нему сгруппировать, А цифорки уровня, мне как то не помогают.
---
С вычисляемыми полями можно покрутить :

Выбор когда УровеньВГруппировке = 1 Тогда
Ссылка
Иначе
Ссылка.Родитель
конец

Вообще какая стоит задача? Более подробно опишите
---
Сгруппировать подразделения верхнего уровня, в них вложения подразделений. Уровни просто везде разные.

Мой запрос СКД.

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

Но, вообще лучше не рекурсией, а запросом:

```1c
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("Ссылка", Ссылка);
    Запрос.Текст = "ВЫБРАТЬ
    | Номенклатура.Ссылка КАК Ссылка
    |ИЗ
    | Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    | Номенклатура.Ссылка = &Ссылка
    |ИТОГИ ПО
    | Ссылка ТОЛЬКО ИЕРАРХИЯ";

    Результат = Запрос.Выполнить();
    Если Выборка.Следующий() и НЕ Выборка.Ссылка.Пустая() Тогда
    Возврат Выборка.Ссылка;
    Иначе
    Возврат Ссылка
    КонецЕсли;
```
---
Но, вообще лучше не рекурсией, а запросом:

Спасибо, но....
У меня тупо СКД. Если бы просто в коде у меня бы и функция работала.
---
Ну так я и написал код для экспортной процедуры запускаемой из СКД.

Можно конечно в выражении СКД или просто в запросе написать что-то вроде:

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

Но требует ограничения уровней и по скорости может быть не очень
---
ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)

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