Мои шаблоны. Нахождение всех родителей в запросе

28.01.17

Разработка - Запросы

Серия универсальных заготовок для повторного использования. Публикую скорее для себя, чтобы были под рукой. Однако буду рад, если кто-нибудь найдет их полезными для себя

Часто требуется получить всех родителей для группы элементов. Не люблю использовать циклы и рекурсию без крайней необходмости. Давно хотелось найти универсальный способ, желательно через запрос. 

Решение с сайта 1с обладает существенным ограничением: нужно заранее знать количество уровней. 

Первый способ лишен этого недостатка, однако имеет другие:

1. Результат запроса нельзя выгрузить во временную таблицу, т.к. запрос строится по итогам

2. В результирующем запросе присутствуют задублированные строки, поэтому нужно выполнять дополнительную обработку, чтобы устранить этот эффект.

Однако, я часто использую именно этот способ, за неимением более простого решения. Он подходит для небольших по размеру иерархических справочников.

ВЫБРАТЬ 
    Склады.Ссылка КАК Ссылка,
    Склады.Ссылка.Ссылка КАК Родитель
ИЗ
    Справочник.Склады КАК Склады
ИТОГИ ПО
    Ссылка,
    Родитель ИЕРАРХИЯ

Второй способ является модификацией метода, предложенного 1с. Недостатком этого метода:

1. Низкая производительность, т.к. выполняется большое количество соединений, а также используется условие ИЛИ

2. Жестко задается количество уровней

Поэтому он также подходит только для справочников с небольшим количеством элементов

ВЫБРАТЬ
	Склады.Ссылка КАК Склад,
	СкладыИерархия.Ссылка КАК Родитель
ИЗ Справочник.Склады КАК Склады
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Склады КАК СкладыИерархия
	ПО  СкладыИерархия.Ссылка = Склады.Ссылка
	ИЛИ СкладыИерархия.Ссылка = Склады.Родитель
	ИЛИ СкладыИерархия.Ссылка = Склады.Родитель.Родитель
	ИЛИ СкладыИерархия.Ссылка = Склады.Родитель.Родитель.Родитель
	ИЛИ СкладыИерархия.Ссылка = Склады.Родитель.Родитель.Родитель.Родитель
	ИЛИ СкладыИерархия.Ссылка = Склады.Родитель.Родитель.Родитель.Родитель.Родитель
	ИЛИ СкладыИерархия.Ссылка = Склады.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель
	ИЛИ СкладыИерархия.Ссылка = Склады.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель.Родитель

запрос шаблон заготовка универсальный прием

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

12000 руб.

02.09.2020    169274    937    403    

905

Запросы Программист Бесплатно (free)

Увидел cheatsheet по SQL и захотелось нарисовать подобное, но про запросы.

18.10.2024    11394    sergey279    18    

65

Запросы Программист Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    6338    XilDen    36    

83

Запросы Программист Запросы Бесплатно (free)

Отлаживая взаимодействие с базой данных, мы регулярно сталкиваемся с зависающими или подозрительно долго выполняющимися обращениями, негативно влияющими на производительность. О том, как в PostgreSQL выявить подозрительные запросы, основываясь на доступной о них информации, расскажем в статье.

16.08.2024    9068    user1840182    5    

28

Математика и алгоритмы Запросы Программист Платформа 1С v8.3 Запросы Бесплатно (free)

Рассмотрим быстрый алгоритм поиска дублей с использованием hash функции по набору полей шапки и табличных частей.

08.07.2024    2727    ivanov660    9    

22

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    10219    implecs_team    6    

48

Запросы Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Часто поступают задачи по произвольному распределению общих сумм. После распределения иногда пропадают копейки. Суть решения добавить АвтоНомерЗаписи() в ВТ распределения, и далее используя функции МАКСИМУМ или МИНИМУМ можем положить разницу копеек в первую или последнюю строку знаменателя распределения.

11.04.2024    3623    andrey_sag    10    

38
Отзывы
17. ildarovich 7939 05.08.15 20:32 Сейчас в теме
(16) в комментарии (5) вам правильно ответили, где можно посмотреть возможное решение. Это, например, статья "Транзитивное замыкание запросом".

Если вы уже видели эту статью или статью Уровни, глубина, прародители, циклы и аналоги запросом, но не посчитали приведенное там решение подходящим, то, возможно, вас смутило то, что там приведены не сами запросы, а функции для их построения. Но на самом деле я предполагал очевидным то, что вместо функции можно использовать заранее построенный ей запрос.

Например, для справочника "Номенклатура" по принципам, описанным в статье, можно использовать запрос:
ВЫБРАТЬ
	Номенклатура.Родитель КАК НачалоДуги,
	Номенклатура.Ссылка КАК КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины1
ИЗ
	Справочник.Номенклатура КАК Номенклатура
ГДЕ
	Номенклатура.Родитель <> ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	Номенклатура.Ссылка,
	Номенклатура.Ссылка
ИЗ
	Справочник.Номенклатура КАК Номенклатура
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
	ПерваяДуга.НачалоДуги,
	ВтораяДуга.КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины2
ИЗ
	ЗамыканияДлины1 КАК ПерваяДуга
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины1 КАК ВтораяДуга
		ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
	ПерваяДуга.НачалоДуги,
	ВтораяДуга.КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины4
ИЗ
	ЗамыканияДлины2 КАК ПерваяДуга
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины2 КАК ВтораяДуга
		ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
	ПерваяДуга.НачалоДуги,
	ВтораяДуга.КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины8
ИЗ
	ЗамыканияДлины4 КАК ПерваяДуга
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины4 КАК ВтораяДуга
		ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
	ПерваяДуга.НачалоДуги,
	ВтораяДуга.КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины16
ИЗ
	ЗамыканияДлины8 КАК ПерваяДуга
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины8 КАК ВтораяДуга
		ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
	ПерваяДуга.НачалоДуги,
	ВтораяДуга.КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины32
ИЗ
	ЗамыканияДлины16 КАК ПерваяДуга
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины16 КАК ВтораяДуга
		ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Замыкания.НачалоДуги КАК Предок,
	Замыкания.КонецДуги КАК Потомок
ИЗ
	ЗамыканияДлины32 КАК Замыкания
ГДЕ
	Замыкания.НачалоДуги <> Замыкания.КонецДуги
Показать


Здесь предполагается, что справочник "Номенклатура" имеет НЕ БОЛЕЕ 32-х уровней вложенности (в жизни вряд ли бывают справочники большей глубины вложенности). А повторяющихся фрагментов в запросе всего 5! Если вдруг уровней больше, до тысячи, например, то можно добавить еще всего 5 однотипных фрагментов в предлагаемый пакетный запрос.
Приведенный запрос - это не запрос в цикле. Он строится не динамически, а может быть записан полностью заранее. Его можно использовать на любом этапе более сложного запроса. И по структуре он достаточно прост.
EvgeTrofi; гвость; krv2k; STivO; PrinzOfMunchen; Somebody1; MRAK; Il; json; +9 Ответить
Остальные комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. jobkostya1c_ERP 100 05.08.15 07:17 Сейчас в теме
Что-то сильно просто. Такие задачи дают на собеседованиях в крутые фирмы. Из разряда "По регистру Счета учета номенклатуры (УТ, БП) для списка входной номенклатуры если не указаны счета смотреть счета по группе номенклатуры и так до самого верха".
Самое веселое, что если даже такие задачи на фрилансе или в ИТ-отделе редко попадаются все-равно для быстроты решаются кодом. Запросом - надо как-то склеивать или специально искать - только если оправдано по большой загрузке. И так по всем случаям.
Также часть в практике задача получения всех подчиненных документов или документов-оснований. Вот эти примеры более полезны чтоб иметь библиотеку под рукой.
3. Lapitskiy 1061 05.08.15 08:08 Сейчас в теме
(1) kostyaomsk, точно, на собеседовании почему то всех интересует "виртуальный конь в вакууме"
14. json 3357 05.08.15 10:39 Сейчас в теме
(3) Lapitskiy, иногда задачи, которые дают на собеседовании пригождаются в реальной практике, а иногда на собеседовании дают задачки из практики
15. TODD22 20 05.08.15 11:58 Сейчас в теме
(14)
иногда задачи, которые дают на собеседовании пригождаются в реальной практике, а иногда на собеседовании дают задачки из практики

Нужно оценивать общий уровень а не умение решать одну задачу которая "иногда пригождается". Для всего с приставкой "иногда" есть гугл.
MaxTolya; +1 Ответить
2. jobkostya1c_ERP 100 05.08.15 07:22 Сейчас в теме
К тому же конструкция запроса В ИЕРАРХИИ(&параметр) сама очень не оптимально. Используется только для простоты.
4. wolfsoft 2421 05.08.15 08:24 Сейчас в теме
Решение с сайта 1с обладает существенным ограничением: нужно заранее знать количество уровней.


Как бы нет. Просто выборка идёт по 5 уровней, но само количество уровней не ограничено. Другое дело, что запрос в цикле.
6. Steelvan 307 05.08.15 09:39 Сейчас в теме
// По входящей ссылке формирует дерево подчиненных объектов из элементов Дерева процесов.
/
/
Процедура СформироватьДеревоОбъектаСПодчиненными(ДеревоОбъектаСПодчиненными = Неопределено, СсылкаВладельца, тзИсточник = Неопределено) Экспорт
	
	// Создание возвращаемого дерева
	Если ДеревоОбъектаСПодчиненными = Неопределено тогда
		ДеревоОбъектаСПодчиненными  = Новый ДеревоЗначений;
		ДеревоОбъектаСПодчиненными.Колонки.Добавить("СсылкаЭлемента");
		ДеревоОбъектаСПодчиненными.Колонки.Добавить("Наименование");
		ДеревоОбъектаСПодчиненными.Колонки.Добавить("СтрокаНавигационнойСсылкиНаКартинку");
	КонецЕсли;
	
	// Получение данных для исходной строки
	Если тзИсточник = Неопределено Тогда
		
		// Получаю тз, отсортированную по номерам из регистра сведений
		лпЗапросЭлементов					   	  = Новый Запрос;
		лпЗапросЭлементов.Текст = "ВЫБРАТЬ
		|	осЭлементыДереваПроцессов.СсылкаВладельца,
		|	осЭлементыДереваПроцессов.Ссылка КАК СсылкаЭлемента,
		|	осЭлементыДереваПроцессов.Ссылка.Наименование КАК Наименование,
		|	осЭлементыДереваПроцессов.КартинкаЭлемента.СтрокаНавигационнойСсылкиНаКартинку КАК СтрокаНавигационнойСсылкиНаКартинку
		|ИЗ
		|	Справочник.осЭлементыДереваПроцессов КАК осЭлементыДереваПроцессов
		|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.осНумерацияЭлементовДП КАК осНумерацияЭлементовДП
		|		ПО (осНумерацияЭлементовДП.СсылкаЭлемента = осЭлементыДереваПроцессов.Ссылка)
		|			И (осНумерацияЭлементовДП.СсылкаВладельца = осЭлементыДереваПроцессов.СсылкаВладельца)
		|ГДЕ
		|	осЭлементыДереваПроцессов.ПометкаУдаления = ЛОЖЬ
		|
		|ДЛЯ ИЗМЕНЕНИЯ
		|	Справочник.осЭлементыДереваПроцессов,
		|	РегистрСведений.осНумерацияЭлементовДП
		|
		|УПОРЯДОЧИТЬ ПО
		|	осНумерацияЭлементовДП.НомерПорядка";
		тзИсточник = лпЗапросЭлементов.Выполнить().Выгрузить();
	КонецЕсли;
	
	// Добавление строки в возвращаемое дерево
	СтрокаСсылкиЭлементаВтзИсточник = тзИсточник.Найти(СсылкаВладельца, "СсылкаЭлемента");
	Если СтрокаСсылкиЭлементаВтзИсточник <> Неопределено тогда
		НоваяСтрокаДерева = ДеревоОбъектаСПодчиненными.Строки.Добавить();
		ЗаполнитьЗначенияСвойств(НоваяСтрокаДерева, СтрокаСсылкиЭлементаВтзИсточник);
	КонецЕсли;
	
	// Поиск подчиненных строк
	мПодчиненныеСтрокиВтзИсточник = тзИсточник.НайтиСтроки(Новый Структура("СсылкаВладельца", СсылкаВладельца));
	Для каждого ТекПодчиненнаяСтрока из мПодчиненныеСтрокиВтзИсточник Цикл
		СсылкаПодчиненногоЭлемента = ТекПодчиненнаяСтрока.СсылкаЭлемента;
		СформироватьДеревоОбъектаСПодчиненными(НоваяСтрокаДерева, СсылкаПодчиненногоЭлемента, тзИсточник);
	КонецЦикла;
	
КонецПроцедуры
Показать
7. Steelvan 307 05.08.15 09:42 Сейчас в теме
Пример получения дерева. В качестве группирующего поля для дерева используется СсылкаВладельца. На порядок быстрее чем &ВИерархии. Работает без заранее определенного количества уровней.
8. CherAl 05.08.15 10:02 Сейчас в теме
А такой вариант?
Родитель = Объект.СсылкаНаОбъект.Родитель;
	Пока Родитель <> Справочники[Родитель.метаданные().Имя].ПустаяСсылка() Цикл
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = (Строка(Родитель));
		Сообщение.Сообщить();
		Родитель = Родитель.Родитель; 
	КонецЦикла;
10. insurgut 208 05.08.15 10:09 Сейчас в теме
(8) CherAl, приведу простой пример, в обработке заполняется 100 000 строк. При заполнении было условие "Если НЕ РезультатЗапроса.Номенклатура.ЭтоГруппа Тогда"... В итоге обработка открывалась несколько минут. Если в запросе сразу поставить это условие - то секунды.
11. json 3357 05.08.15 10:21 Сейчас в теме
(10) insurgut, согласен. Но в статье я указал, что метод "подходит для небольших по размеру иерархических справочников."
12. json 3357 05.08.15 10:23 Сейчас в теме
(8) CherAl, пусть в справочнике 100 элементов и 5 уровней иерархии. Сколько будет обращений к базе с Вашим вариантом?
9. insurgut 208 05.08.15 10:07 Сейчас в теме
Запрос выдает дважды сам элемент, так что хотя бы так:
ВЫБРАТЬ
	Склады.Ссылка.Ссылка КАК Родитель
ИЗ
	Справочник.Склады КАК Склады
ГДЕ
	Склады.Ссылка = &МойСклад
ИТОГИ ПО
	Родитель ТОЛЬКО ИЕРАРХИЯ
aleksey2; +1 Ответить
13. json 3357 05.08.15 10:24 Сейчас в теме
(9) insurgut, это просто заготовка. Никто не запрещает накладывать фильтры
16. json 3357 05.08.15 16:47 Сейчас в теме
Всем большое спасибо за критику.

Может ли кто-нибудь подсказать вариант, чтобы данная задача решалась исключительно средствами запросов с возможностью помещения результата во временную таблицу. Например, это было бы очень полезно для формирования отчетов на СКД.

Решения с использованием встроенного языка очевидны, просьба их не предлагать.
17. ildarovich 7939 05.08.15 20:32 Сейчас в теме
(16) в комментарии (5) вам правильно ответили, где можно посмотреть возможное решение. Это, например, статья "Транзитивное замыкание запросом".

Если вы уже видели эту статью или статью Уровни, глубина, прародители, циклы и аналоги запросом, но не посчитали приведенное там решение подходящим, то, возможно, вас смутило то, что там приведены не сами запросы, а функции для их построения. Но на самом деле я предполагал очевидным то, что вместо функции можно использовать заранее построенный ей запрос.

Например, для справочника "Номенклатура" по принципам, описанным в статье, можно использовать запрос:
ВЫБРАТЬ
	Номенклатура.Родитель КАК НачалоДуги,
	Номенклатура.Ссылка КАК КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины1
ИЗ
	Справочник.Номенклатура КАК Номенклатура
ГДЕ
	Номенклатура.Родитель <> ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	Номенклатура.Ссылка,
	Номенклатура.Ссылка
ИЗ
	Справочник.Номенклатура КАК Номенклатура
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
	ПерваяДуга.НачалоДуги,
	ВтораяДуга.КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины2
ИЗ
	ЗамыканияДлины1 КАК ПерваяДуга
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины1 КАК ВтораяДуга
		ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
	ПерваяДуга.НачалоДуги,
	ВтораяДуга.КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины4
ИЗ
	ЗамыканияДлины2 КАК ПерваяДуга
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины2 КАК ВтораяДуга
		ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
	ПерваяДуга.НачалоДуги,
	ВтораяДуга.КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины8
ИЗ
	ЗамыканияДлины4 КАК ПерваяДуга
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины4 КАК ВтораяДуга
		ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
	ПерваяДуга.НачалоДуги,
	ВтораяДуга.КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины16
ИЗ
	ЗамыканияДлины8 КАК ПерваяДуга
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины8 КАК ВтораяДуга
		ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
	ПерваяДуга.НачалоДуги,
	ВтораяДуга.КонецДуги
ПОМЕСТИТЬ ЗамыканияДлины32
ИЗ
	ЗамыканияДлины16 КАК ПерваяДуга
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины16 КАК ВтораяДуга
		ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Замыкания.НачалоДуги КАК Предок,
	Замыкания.КонецДуги КАК Потомок
ИЗ
	ЗамыканияДлины32 КАК Замыкания
ГДЕ
	Замыкания.НачалоДуги <> Замыкания.КонецДуги
Показать


Здесь предполагается, что справочник "Номенклатура" имеет НЕ БОЛЕЕ 32-х уровней вложенности (в жизни вряд ли бывают справочники большей глубины вложенности). А повторяющихся фрагментов в запросе всего 5! Если вдруг уровней больше, до тысячи, например, то можно добавить еще всего 5 однотипных фрагментов в предлагаемый пакетный запрос.
Приведенный запрос - это не запрос в цикле. Он строится не динамически, а может быть записан полностью заранее. Его можно использовать на любом этапе более сложного запроса. И по структуре он достаточно прост.
EvgeTrofi; гвость; krv2k; STivO; PrinzOfMunchen; Somebody1; MRAK; Il; json; +9 Ответить
18. json 3357 05.08.15 23:34 Сейчас в теме
(17) ildarovich, интересный прием. В виде запроса идея намного прозрачнее. Большой плюс, что обращение к самому справочнику только в самом первом запросе, остальное - переливание между временными таблицами.
19. Smilk 25.02.19 11:39 Сейчас в теме
Вот функция которая возвращает текст самостоятельного запроса, или для вставки в другой запрос. Запрос принимает массив ссылок или врем таблицу с ссылками на элементы справочников, добавляет элементы и их родителей в результирующую таблицу. Уровень иерархии так же можно выбрать. Функцию не тестил...

//berezin p.u 25.02.19
Функция ПолучитьТекстЗапроса_Услуги_и_их_Родители(ИмяСправочника="", УровеньВложенности = 2, ИмяВремТаблицыИсточникаСсылок="", ДляИспользованияВДругомЗапросе = Ложь, МассивСсылок = Неопределено) Экспорт
	
	ВТ = "ВТ";
	Если ЗначениеЗаполнено(ИмяВремТаблицыИсточникаСсылок) Тогда
		ВТ = ИмяВремТаблицыИсточникаСсылок;
	КонецЕсли;
	
	Начало = "ВЫБРАТЬ Ссылка ПОМЕСТИТЬ ВТ ИЗ Справочник.Номенклатура
	|ГДЕ Ссылка В(&МассивСсылок);"+Символы.ПС;
	
	Середина = "ВЫБРАТЬ " +ВТ+ "#1.Ссылка ПОМЕСТИТЬ " +ВТ+"#2 ИЗ " +ВТ+"#1
	|ОБЪЕДИНИТЬ		   
	|ВЫБРАТЬ Родитель ИЗ " +ВТ+"#1 
	|ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура ПО " +ВТ+"#1.Ссылка = Номенклатура.Ссылка
	|ГДЕ Родитель <> ЗНАЧЕНИЕ(СПравочник.Номенклатура.ПустаяСсылка);"+Символы.ПС;
	
	УничтожениеТаблицы = "УНИЧТОЖИТЬ "+ВТ+"#1;"+Символы.ПС;
	
	//*****************************************************************************
	Если ЗначениеЗаполнено(ИмяСправочника) Тогда	
		Начало   = СтрЗаменить(Начало,   "Номенклатура", ИмяСправочника);
		Середина = СтрЗаменить(Середина, "Номенклатура", ИмяСправочника);	
	КонецЕсли;	
	//*****************************************************************************
	Запрос = Новый Запрос();                 
	
	Если ДляИспользованияВДругомЗапросе Тогда			
		Сч = 0;	
	Иначе
		Массив = ?(ТипЗнч(МассивСсылок)=Тип("Массив"), МассивСсылок, Новый Массив);
		Запрос.Текст = Начало;
		Запрос.УстановитьПараметр("МассивСсылок", Массив);				
		Сч = 1;	
	КонецЕсли;					
	
	Пока Сч < УровеньВложенности Цикл
		
		Если Не ДляИспользованияВДругомЗапросе И Сч = УровеньВложенности Тогда
			СтрокаПоиска = "ПОМЕСТИТЬ "+ВТ+(Сч+1);
			Середина = СтрЗаменить(Середина, СтрокаПоиска, "");                		
		КонецЕсли;
		
		Запрос.Текст = Запрос.Текст + СтрЗаменить(СтрЗаменить(Середина, "#1", ?(Сч=0, "", Сч)), "#2", Сч+1);										    
		
		Если Сч > 0 Тогда 
			Запрос.Текст = Запрос.Текст + СтрЗаменить(УничтожениеТаблицы, "#1", Сч);
		КонецЕсли;
		
		Сч = Сч+1;
		
	КонецЦикла;	
	

Возврат Запрос.Текст;

	
КонецФункции
Показать
20. dakork 36 29.06.22 17:54 Сейчас в теме
(19)Если мы знаем количество уровней, то как вам такой вариант?
ВЫБРАТЬ
	ВложенныйЗапрос.Ссылка КАК Подразделения
ИЗ
	(ВЫБРАТЬ
		ПодразделенияКомпании.Ссылка КАК Ссылка
	ИЗ
		Справочник.ПодразделенияКомпании КАК ПодразделенияКомпании
	ГДЕ
		ПодразделенияКомпании.Ссылка = &Ссылка
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		ПодразделенияКомпании.Родитель
	ИЗ
		Справочник.ПодразделенияКомпании КАК ПодразделенияКомпании
	ГДЕ
		ПодразделенияКомпании.Ссылка = &Ссылка
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		ПодразделенияКомпании.Родитель.Родитель
	ИЗ
		Справочник.ПодразделенияКомпании КАК ПодразделенияКомпании
	ГДЕ
		ПодразделенияКомпании.Ссылка = &Ссылка) КАК ВложенныйЗапрос
ГДЕ
	ВложенныйЗапрос.Ссылка <> ЗНАЧЕНИЕ(Справочник.ПодразделенияКомпании.ПустаяСсылка)
Показать
Оставьте свое сообщение