1С 8.3 Получение родителей элемента - Программист 1С Минск. Автоматизация бизнеса.

Перейти к контенту

1С 8.3 Получение родителей элемента

Данные > Примеры кода 1С > 1С 8.3 Справочники
Перейти в раздел примеры кода 1С 8.3:
Получение родителей элемента Справочника или Плана видов характеристик в 1С 8.3:
&НаСервере
Функция ПолучениеВсехРодителейЭлемента(ЭлементСсылка, Знач КолВыбЗаОперацию = 10)

   
// ЭлементСсылка - СправочникСсылка, ПланВидовХарактеристикСсылка - Ссылка на элемент, родителей которого нужно найти
    // КолВыбЗаОперацию - Количество выбираемых родителей за одно выполнение функции запроса
   
РодителиЭлемента = Новый Массив;
    Если НЕ
ЗначениеЗаполнено(ЭлементСсылка) Тогда
        Возврат
РодителиЭлемента;
    КонецЕсли;

   
МетаданныеЭл = ЭлементСсылка.Метаданные();
    Если
МетаданныеЭл.ОграничиватьКоличествоУровней Тогда
       
// Минимальное количество или из переданного или из ограничения количества уровней метаданных
       
КолВыбЗаОперацию = Мин(КолВыбЗаОперацию, МетаданныеЭл.КоличествоУровней);
    КонецЕсли;

   
МассивПолей = Новый Массив;
   
ВыбПоле = "Родитель";
    Для
НомерРодителя = 1 По КолВыбЗаОперацию Цикл
       
МассивПолей.Добавить(ВыбПоле);
       
ВыбПоле = ВыбПоле + ".Родитель";
    КонецЦикла;

   
ТекстЗапроса = "ВЫБРАТЬ %1 ИЗ %2 ГДЕ Ссылка = &ТекЭлемент";
   
ТекстЗапроса = СтрШаблон(ТекстЗапроса, СтрСоединить(МассивПолей, ","), МетаданныеЭл.ПолноеИмя());

   
Запрос = Новый Запрос(ТекстЗапроса);
   
ТекЭлемент = ЭлементСсылка;
    Пока
ЗначениеЗаполнено(ТекЭлемент) Цикл

       
Запрос.УстановитьПараметр("ТекЭлемент", ТекЭлемент);
       
Результат = Запрос.Выполнить();
        Если
Результат.Пустой() Тогда
            Прервать;
        КонецЕсли;

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

    КонецЦикла;

   
// Возвращаем Массив[СправочникСсылка, ПланВидовХарактеристикСсылка] со всеми родителями элемента
   
Возврат РодителиЭлемента;

КонецФункции
Получение запросом родителей элемента справочника в 1С 8.3:
&НаСервере
Процедура ПолучениеЗапросомРодителейЭлементаСправочника(СсылкаНаКонтрагента)

   
КонтрагентСсылка=СсылкаНаКонтрагента;
   
// Специальных средств для получения родителей элементов справочника в запросе нет,
    // поэтому целесообразно родителей перебирать в цикле
    // На примере справочника контрагентов с макс.глубиной 10 вложений
   
Запрос = Новый Запрос("ВЫБРАТЬ
    |   Контрагент.Родитель,
    |   Контрагент.Родитель.Родитель,
    |   Контрагент.Родитель.Родитель.Родитель,
    |   Контрагент.Родитель.Родитель.Родитель.Родитель,
    |   Контрагент.Родитель.Родитель.Родитель.Родитель.Родитель,
    |   Контрагент.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель,
    |   Контрагент.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель,
    |   Контрагент.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель,
    |   Контрагент.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель,
    |   Контрагент.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель,
    |ИЗ
    |   Справочник.Контрагенты КАК Контрагент
    |ГДЕ
    |   Контрагент.Ссылка = &КонтрагентСсылка"
);

    Пока Истина Цикл

       
Запрос.УстановитьПараметр("КонтрагентСсылка", КонтрагентСсылка);
       
Результат = Запрос.Выполнить();
        Если
Результат.Пустой() Тогда
            Прервать;
        КонецЕсли;

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

        Если
КонтрагентСсылка = Справочники.Контрагенты.ПустаяСсылка() Тогда
            Прервать;
        КонецЕсли;

    КонецЦикла;

КонецПроцедуры
0
комментарии
____________________
Copyright©, «Программист 1С в г.Минске», 11.03.2021
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Яндекс.Метрика
Защищенное соединение ssl
visa
mastercard
Maestro
Яндекс деньги
Назад к содержимому