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