СКД: Получить родителя первого уровня

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

Функция ВерхнийРодитель(Ссылка)  Экспорт   //получаем верхнее подразделение
	Возврат ?(Ссылка.Родитель.Пустая(), Ссылка, ВерхнийРодитель(Ссылка.Родитель));
КонецФункции
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
9. dabu-dabu 294 25.05.22 16:48 Сейчас в теме +0.05 $m
(5) Ну так я и написал код для экспортной процедуры запускаемой из СКД.

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

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

Но требует ограничения уровней и по скорости может быть не очень
One_Assembler; starik-2005; +2 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user5300 1025 25.05.22 15:05 Сейчас в теме
Выбранные поля - Системные поля "Уровень" и "УровеньВГруппировке"
6. One_Assembler 25.05.22 16:25 Сейчас в теме
(2) Как это применить? Мне то наименование (ссылка) нужно и по нему сгруппировать, А цифорки уровня, мне как то не помогают.
7. user5300 1025 25.05.22 16:30 Сейчас в теме
(6) С вычисляемыми полями можно покрутить :

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


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

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


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

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

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


Спасибо, но....
У меня тупо СКД. Если бы просто в коде у меня бы и функция работала.
9. dabu-dabu 294 25.05.22 16:48 Сейчас в теме +0.05 $m
(5) Ну так я и написал код для экспортной процедуры запускаемой из СКД.

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

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

Но требует ограничения уровней и по скорости может быть не очень
One_Assembler; starik-2005; +2 Ответить
10. One_Assembler 25.05.22 17:27 Сейчас в теме
(9)
ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)


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

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот