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

28.01.17

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

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

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

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 руб.

02.09.2020    119957    656    389    

701

Для чего используют конструкцию запроса "ГДЕ ЛОЖЬ" в СКД на примере конфигурации 1С:ERP

Запросы СКД Платформа 1С v8.3 Запросы Система компоновки данных 1С:ERP Управление предприятием 2 Бесплатно (free)

В типовых конфигурациях разработчики компании 1С иногда используют в отчетах, построенных на СКД, такую конструкцию, как "ГДЕ ЛОЖЬ". Такая конструкция говорит о том, что данные в запросе не будут получены совсем. Для чего же нужен тогда запрос?

13.02.2024    5622    KawaNoNeko    23    

23

Набор-объект для СКД по тексту или запросу

Запросы СКД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    1964    2    Yashazz    0    

29

Запрос 1С copilot

Инструментарий разработчика Запросы Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Пишем на человеческом языке, что нам надо, и получаем текст запроса на языке 1С. Используются большие языковые модели (LLM GPT) от OpenAI или Яндекс на выбор.

5 стартмани

15.01.2024    6094    29    mkalimulin    23    

48

PrintWizard: поддержка представлений ЗУП в конструкторе

Инструментарий разработчика Запросы Платформа 1С v8.3 Бесплатно (free)

Одной из интересных задач, стоящих в процессе разработки, была поддержка механизма представлений в ЗУП. Но не просто возможность исполнения запросов с ними. Основная проблема была в том, чтобы с ними было удобно работать, а именно: создавать, модифицировать и отлаживать. Кратко о том, что в итоге получилось...

14.12.2023    1714    vandalsvq    7    

28

Объектная модель запроса "Схема запроса" 2

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

Далеко уже не новый тип данных "Схема запроса". Статья о том, как использовать его "попроще". Примеры создания текста запроса с нуля и изменение имеющегося запроса.

06.12.2023    5286    user1923546    26    

43

Начните уже использовать хранилище запросов

HighLoad оптимизация Запросы

Очень немногие из тех, кто занимается поддержкой MS SQL, работают с хранилищем запросов. А ведь хранилище запросов – это очень удобный, мощный и, главное, бесплатный инструмент, позволяющий быстро найти и локализовать проблему производительности и потребления ресурсов запросами. В статье расскажем о том, как использовать хранилище запросов в MS SQL и какие плюсы и минусы у него есть.

11.10.2023    15959    skovpin_sa    14    

98
Отзывы
17. ildarovich 7846 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 однотипных фрагментов в предлагаемый пакетный запрос.
Приведенный запрос - это не запрос в цикле. Он строится не динамически, а может быть записан полностью заранее. Его можно использовать на любом этапе более сложного запроса. И по структуре он достаточно прост.
krv2k; STivO; PrinzOfMunchen; Somebody1; MRAK; Il; json; +7 Ответить
Остальные комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. jobkostya1c_ERP 100 05.08.15 07:17 Сейчас в теме
Что-то сильно просто. Такие задачи дают на собеседованиях в крутые фирмы. Из разряда "По регистру Счета учета номенклатуры (УТ, БП) для списка входной номенклатуры если не указаны счета смотреть счета по группе номенклатуры и так до самого верха".
Самое веселое, что если даже такие задачи на фрилансе или в ИТ-отделе редко попадаются все-равно для быстроты решаются кодом. Запросом - надо как-то склеивать или специально искать - только если оправдано по большой загрузке. И так по всем случаям.
Также часть в практике задача получения всех подчиненных документов или документов-оснований. Вот эти примеры более полезны чтоб иметь библиотеку под рукой.
3. Lapitskiy 1057 05.08.15 08:08 Сейчас в теме
(1) kostyaomsk, точно, на собеседовании почему то всех интересует "виртуальный конь в вакууме"
14. json 3294 05.08.15 10:39 Сейчас в теме
(3) Lapitskiy, иногда задачи, которые дают на собеседовании пригождаются в реальной практике, а иногда на собеседовании дают задачки из практики
15. TODD22 18 05.08.15 11:58 Сейчас в теме
(14)
иногда задачи, которые дают на собеседовании пригождаются в реальной практике, а иногда на собеседовании дают задачки из практики

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


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

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

Решения с использованием встроенного языка очевидны, просьба их не предлагать.
17. ildarovich 7846 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 однотипных фрагментов в предлагаемый пакетный запрос.
Приведенный запрос - это не запрос в цикле. Он строится не динамически, а может быть записан полностью заранее. Его можно использовать на любом этапе более сложного запроса. И по структуре он достаточно прост.
krv2k; STivO; PrinzOfMunchen; Somebody1; MRAK; Il; json; +7 Ответить
18. json 3294 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 32 29.06.22 17:54 Сейчас в теме
(19)Если мы знаем количество уровней, то как вам такой вариант?
ВЫБРАТЬ
	ВложенныйЗапрос.Ссылка КАК Подразделения
ИЗ
	(ВЫБРАТЬ
		ПодразделенияКомпании.Ссылка КАК Ссылка
	ИЗ
		Справочник.ПодразделенияКомпании КАК ПодразделенияКомпании
	ГДЕ
		ПодразделенияКомпании.Ссылка = &Ссылка
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		ПодразделенияКомпании.Родитель
	ИЗ
		Справочник.ПодразделенияКомпании КАК ПодразделенияКомпании
	ГДЕ
		ПодразделенияКомпании.Ссылка = &Ссылка
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		ПодразделенияКомпании.Родитель.Родитель
	ИЗ
		Справочник.ПодразделенияКомпании КАК ПодразделенияКомпании
	ГДЕ
		ПодразделенияКомпании.Ссылка = &Ссылка) КАК ВложенныйЗапрос
ГДЕ
	ВложенныйЗапрос.Ссылка <> ЗНАЧЕНИЕ(Справочник.ПодразделенияКомпании.ПустаяСсылка)
Показать
Оставьте свое сообщение