1С 8.3 Получение родителей элемента
Данные > Примеры кода 1С > 1С 8.3 Справочники
Перейти в раздел примеры кода 1С 8.3:
- 1С 8.3 Планы видов характеристик
Получение родителей элемента Справочника или Плана видов характеристик в 1С 8.3:
&НаСервере
Функция ПолучениеВсехРодителейЭлемента(ЭлементСсылка, Знач КолВыбЗаОперацию = 10)
// ЭлементСсылка - СправочникСсылка, ПланВидовХарактеристикСсылка - Ссылка на элемент, родителей которого нужно найти
// КолВыбЗаОперацию - Количество выбираемых родителей за одно выполнение функции запроса
РодителиЭлемента = Новый Массив;
Если НЕ ЗначениеЗаполнено(ЭлементСсылка) Тогда
Возврат РодителиЭлемента;
КонецЕсли;
МетаданныеЭл = ЭлементСсылка.Метаданные();
Если МетаданныеЭл.ОграничиватьКоличествоУровней Тогда
// Минимальное количество или из переданного или из ограничения количества уровней метаданных
КолВыбЗаОперацию = Мин(КолВыбЗаОперацию, МетаданныеЭл.КоличествоУровней);
КонецЕсли;
МассивПолей = Новый Массив;
ВыбПоле = "Родитель";
Для НомерРодителя = 1 По КолВыбЗаОперацию Цикл
МассивПолей.Добавить(ВыбПоле);
ВыбПоле = ВыбПоле + ".Родитель";
КонецЦикла;
ТекстЗапроса = "ВЫБРАТЬ %1 ИЗ %2 ГДЕ Ссылка = &ТекЭлемент";
ТекстЗапроса = СтрШаблон(ТекстЗапроса, СтрСоединить(МассивПолей, ","), МетаданныеЭл.ПолноеИмя());
Запрос = Новый Запрос(ТекстЗапроса);
ТекЭлемент = ЭлементСсылка;
Пока ЗначениеЗаполнено(ТекЭлемент) Цикл
Запрос.УстановитьПараметр("ТекЭлемент", ТекЭлемент);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Прервать;
КонецЕсли;
Выборка = Результат.Выбрать();
Выборка.Следующий();
Для НомерКолонки = 0 По Результат.Колонки.Количество() - 1 Цикл
ТекЭлемент = Выборка[НомерКолонки];
Если ЗначениеЗаполнено(ТекЭлемент) Тогда
РодителиЭлемента.Добавить(ТекЭлемент);
Иначе
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
// Возвращаем Массив[СправочникСсылка, ПланВидовХарактеристикСсылка] со всеми родителями элемента
Возврат РодителиЭлемента;
КонецФункции
Функция ПолучениеВсехРодителейЭлемента(ЭлементСсылка, Знач КолВыбЗаОперацию = 10)
// ЭлементСсылка - СправочникСсылка, ПланВидовХарактеристикСсылка - Ссылка на элемент, родителей которого нужно найти
// КолВыбЗаОперацию - Количество выбираемых родителей за одно выполнение функции запроса
РодителиЭлемента = Новый Массив;
Если НЕ ЗначениеЗаполнено(ЭлементСсылка) Тогда
Возврат РодителиЭлемента;
КонецЕсли;
МетаданныеЭл = ЭлементСсылка.Метаданные();
Если МетаданныеЭл.ОграничиватьКоличествоУровней Тогда
// Минимальное количество или из переданного или из ограничения количества уровней метаданных
КолВыбЗаОперацию = Мин(КолВыбЗаОперацию, МетаданныеЭл.КоличествоУровней);
КонецЕсли;
МассивПолей = Новый Массив;
ВыбПоле = "Родитель";
Для НомерРодителя = 1 По КолВыбЗаОперацию Цикл
МассивПолей.Добавить(ВыбПоле);
ВыбПоле = ВыбПоле + ".Родитель";
КонецЦикла;
ТекстЗапроса = "ВЫБРАТЬ %1 ИЗ %2 ГДЕ Ссылка = &ТекЭлемент";
ТекстЗапроса = СтрШаблон(ТекстЗапроса, СтрСоединить(МассивПолей, ","), МетаданныеЭл.ПолноеИмя());
Запрос = Новый Запрос(ТекстЗапроса);
ТекЭлемент = ЭлементСсылка;
Пока ЗначениеЗаполнено(ТекЭлемент) Цикл
Запрос.УстановитьПараметр("ТекЭлемент", ТекЭлемент);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Прервать;
КонецЕсли;
Выборка = Результат.Выбрать();
Выборка.Следующий();
Для НомерКолонки = 0 По Результат.Колонки.Количество() - 1 Цикл
ТекЭлемент = Выборка[НомерКолонки];
Если ЗначениеЗаполнено(ТекЭлемент) Тогда
РодителиЭлемента.Добавить(ТекЭлемент);
Иначе
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
// Возвращаем Массив[СправочникСсылка, ПланВидовХарактеристикСсылка] со всеми родителями элемента
Возврат РодителиЭлемента;
КонецФункции
Получение запросом родителей элемента справочника в 1С 8.3:
&НаСервере
Процедура ПолучениеЗапросомРодителейЭлементаСправочника(СсылкаНаКонтрагента)
КонтрагентСсылка=СсылкаНаКонтрагента;
// Специальных средств для получения родителей элементов справочника в запросе нет,
// поэтому целесообразно родителей перебирать в цикле
// На примере справочника контрагентов с макс.глубиной 10 вложений
Запрос = Новый Запрос("ВЫБРАТЬ
| Контрагент.Родитель,
| Контрагент.Родитель.Родитель,
| Контрагент.Родитель.Родитель.Родитель,
| Контрагент.Родитель.Родитель.Родитель.Родитель,
| Контрагент.Родитель.Родитель.Родитель.Родитель.Родитель,
| Контрагент.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель,
| Контрагент.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель,
| Контрагент.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель,
| Контрагент.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель,
| Контрагент.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель,
|ИЗ
| Справочник.Контрагенты КАК Контрагент
|ГДЕ
| Контрагент.Ссылка = &КонтрагентСсылка");
Пока Истина Цикл
Запрос.УстановитьПараметр("КонтрагентСсылка", КонтрагентСсылка);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Прервать;
КонецЕсли;
Выборка = Результат.Выбрать();
Выборка.Следующий();
Для НомерКолонки = 0 По Результат.Колонки.Количество() - 1 Цикл
КонтрагентСсылка = Выборка[НомерКолонки];
Если КонтрагентСсылка = Справочники.Контрагенты.ПустаяСсылка() Тогда
Прервать;
Иначе
Сообщить("Родитель элемента "+КонтрагентСсылка);
КонецЕсли;
КонецЦикла;
Если КонтрагентСсылка = Справочники.Контрагенты.ПустаяСсылка() Тогда
Прервать;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ПолучениеЗапросомРодителейЭлементаСправочника(СсылкаНаКонтрагента)
КонтрагентСсылка=СсылкаНаКонтрагента;
// Специальных средств для получения родителей элементов справочника в запросе нет,
// поэтому целесообразно родителей перебирать в цикле
// На примере справочника контрагентов с макс.глубиной 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.
// см. 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
комментарии
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник