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 Цикл
           
КонтрагентСсылка = Выборка[НомерКолонки];
            Если
КонтрагентСсылка = Справочники.Контрагенты.ПустаяСсылка() Тогда
                Прервать;
            Иначе
               
Сообщить("Родитель элемента "+КонтрагентСсылка);
            КонецЕсли;
        КонецЦикла;

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

    КонецЦикла;

КонецПроцедуры
Получить всех родителей элемента (Экспортная) в 1С 8.3:
// Возвращает всех родителей элемента, согласно рекомендациям на ИТС:
// см. https://its.1c.ru/db/metod8dev/content/2659/hdoc
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/14
//
// Параметры:
//  Ссылка  - СправочникСсылка, ПланВидовХарактеристикСсылка - Ссылка на элемент, родителей которого нужно найти
//  КоличествоВыбираемыхЗаПорцию  - Число - Количество выбираемых родителей за одно выполнение запроса.
//        Используется минимальное число из переданного и ограничения количества уровней в конфигураторе
//
// Возвращаемое значение:
//   Массив из СправочникСсылка, ПланВидовХарактеристикСсылка - массив с родителями элемента
//
// Пример:
//
//   Результат = РодителиЭлемента(ЭлементБазы);
//   //Результат - массив с ссылками на родителей элемента
//
Функция РодителиЭлемента(Знач Ссылка, Знач КоличествоВыбираемыхЗаПорцию = 5) Экспорт

   РодителиЭлемента = Новый Массив; // Массив из см. РодителиЭлемента.Ссылка
   Если НЕ ЗначениеЗаполнено(Ссылка) Тогда
       Возврат РодителиЭлемента;
   КонецЕсли;

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

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

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

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

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

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

   КонецЦикла;

   Возврат РодителиЭлемента;

КонецФункции
// MIT License
// Copyright (c) 2024 SeiOkami
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files
// (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,
// merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
0
комментарии
____________________
Copyright©, «Программист 1С в г.Минске», 11.03.2021
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Яндекс.Метрика
Защищенное соединение ssl
visa
mastercard
Maestro
Яндекс деньги
Назад к содержимому