Имя: Пароль:
1C
1С v8
Получить Верхнего родителя справочника
☑
0 Pusto32
 
09.11.26
✎
09:25
Помню в 7.7 видел:
ЗначениеИзСтрокиВнутр(Шаблон("[ЗначениеВСтрокуВнутр(Номенклатура"+СтрЗаменить(Формат("","С"+(Номенклатура.Уровень()-2))," ",".Родитель")+")]")).

а как в 8.3 можно было бы получить что-то подобное?
1 maxab72
 
09.11.26
✎
09:36
Можно, через ПолныйКод()
2 Мультук
 
гуру
09.11.26
✎
09:37
Без понятия, как работает (и работает ли) ваш волшебный код

В 8.3 нужно прочитать вот это "Транзитивное замыкание запросом"

https://infostart.ru/1c/articles/160707/

Функции ПолучитьВерхнегоРодителя(ссылкаНоменклатура) там нет,
но удочку вам дадут.

Если вы никуда не спишите, то тривиальная рекурсия пишется за 5 мин, но работает медленно.
3 Волшебник
 
09.11.26
✎
09:40
Функция РодительВерхнегоУровня(ссылка)
   а = ссылка.Родитель;
   Пока НЕ а.Родитель.Пустая() Цикл
	  а = а.Родитель;
   КонецЦикла;
   Возврат а;
КонецФункции
4 maxab72
 
09.11.26
✎
10:00
(3) С циклами это прошлый век...

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

КонецФункции