Запрос из справочника с выборкой подчиненых элементов

1. sCHTASS 49 24.10.12 13:05 Сейчас в теме
Есть запрос, который показывает принадлежность отдела к департаменту в структуре:

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


Подскажите, можно ли как его перестроить, чтобы избавиться от
Отделы.Родитель...Родитель = Депатрамент.Ссылка
? Хочется раз и на всегда составить вечный запрос, который бы не зависел от уровня вложенности справочника.
+
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. taiba 87 24.10.12 13:45 Сейчас в теме
Выбрать
   Справочник.ПодразделенияКомпании.Ссылка

Где 
   Справочник.ПодразделенияКомпании.Ссылка В ИЕРАРХИИ (&Департамент)
perepetulichka; titakovserg; +2
3. DrDrey 24.10.12 13:45 Сейчас в теме
Не совсем понятен вопрос!
Если нужно выбрать по элементы справочника по типу реквизита справочника то можно как вариант использовать метод Выразить в запросе: ВЫРАЗИТЬ(Отделы.Депатрамент.Ссылка КАК Справочник.Депатрамент) КАК Депатрамент..

если отобрать по отбору то условие ГДЕ

Поясните для чего будет использоваться результат запроса? Что хотите в результате...
+
4. titakovserg 24.10.12 15:13 Сейчас в теме
(3) DrDrey, я думаю, что sCHTASS хочет выбрать все дочерние элементы всех уровней для определенного элемента справочника. Вот пример как это приблизительно можно сделать (работоспособность не проверял)
Процедура ВзятьДочерние(Родитель, уровень, ТабЗнач) 
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	Подразделения.Ссылка КАК Ссылка
		|ИЗ
		|	Справочник.Подразделения КАК Подразделения
		|ГДЕ
		|	Подразделения.Родитель = &Родитель";
    Запрос.УстановитьПараметр("Родитель",Родитель);
	Выборка = Запрос.Выполнить().Выбрать();
	пока Выборка.Следующий() Цикл 		
		НовСтр = ТабЗнач.Добавить();
		НовСтр.Подразделение = Выборка.ссылка;
		НовСтр.уровеньВложенности = уровень;
		ВзятьДочерние(Выборка.ссылка, уровень+1, ТабЗнач);
	КонецЦикла;
	
КонецПроцедуры
//**вызов процедуры котоая выберет все дочерние элементы и сохранит для *****
ВзятьДочерние(Родитель, 1, ТабЗнач); //если нужно вернять дочерние элементы для всех элементов справочника в качестве родителя укажи пустую ссылку
//*******

Показать


P. S. taiba уже ответил на вопрос
+
5. sCHTASS 49 24.10.12 15:58 Сейчас в теме
(3) Поясню задачу. Есть структура конторы, состоящая из департаментов. Департаменты состоят в свою очередь из отделов. Отделы могут в себя включать группы, службы. Те в свою очередь могут еще на что-нить ветвиться. Так вот мне нужно получить в запросе таблицу соотношения департамент - его подчиненная структурная единица. Пример таблицы:

"Департамент 1" - "Отдел 1-1" (входит в состав "Департамент 1")
"Департамент 1" - "Служба 1-1-1" (входит в состав "Отдел 1-1")
"Департамент 1" - "Служба 1-1-2" (входит в состав "Отдел 1-1")
"Департамент 1" - "Группа 1-1-2-1" (входит в состав "Служба 1-1-2")
"Департамент 2" - "Отдел 2-1" (входит в состав "Департамент 2")
...
"Департамент N" - "Отдел N-1" (входит в состав "Департамент N")

(4) Интересует реализация именно в запросе.
+
6. sCHTASS 49 24.10.12 16:01 Сейчас в теме
Текущая реализация запроса работает, но хочется универсальности. А то вдруг через год или два еще один уровень в структуре организации
+
8. taiba 87 24.10.12 16:59 Сейчас в теме
(6) sCHTASS, В приведенном вами запросе такой результат невозможен, т.к. стоит условие ГДЕ. Вы формулируйте задание правильно, тогда и желаемый ответ скорее прийдёт :)
+
9. logos 210 24.10.12 17:02 Сейчас в теме
(6) sCHTASS, Спасли бы Вас common table expressions, если бы 1С их умел, но увы увы. Сам решал эту проблему только фиксацией глубины иерархии, как и Вы.
+
10. taiba 87 24.10.12 18:27 Сейчас в теме
(6) sCHTASS, собственно простой запрос такое не может. Может либо код процедуры, запрос вызывающей, либо СКД (http://infostart.ru/public/84547/ )
+
7. ИльяЕвгеньевич 24.10.12 16:16 Сейчас в теме
обычно помогало "УПОРЯДОЧИТЬ ПО Ссылка ИЕРАРХИЯ"
или итоги с иерархией
taiba; +1
11. sCHTASS 49 25.10.12 14:58 Сейчас в теме
Все спасибо. Придется оставить запрос как есть.
+
12. invertercant 22 25.10.12 15:29 Сейчас в теме
Делал аналогичную ситуацию приведу пример как есть.

	Запрос = новый запрос;
	Запрос.Текст ="ВЫБРАТЬ
	              |	ПодразделенияОрганизаций.Ссылка КАК Подразделение,
	              |	ПодразделенияОрганизаций.Код КАК Код,
	              |	ПодразделенияОрганизаций.КодВнутр
	              |ИЗ
	              |	Справочник.ПодразделенияОрганизаций КАК ПодразделенияОрганизаций
	              |ГДЕ
	              |	ПодразделенияОрганизаций.Владелец = &Владелец
	              |	И ПодразделенияОрганизаций.ПометкаУдаления = ЛОЖЬ
	              |
	              |УПОРЯДОЧИТЬ ПО
	              |	Код ИЕРАРХИЯ";
				  
	 Запрос.УстановитьПараметр("Владелец", Организация);
	 Обход = ОбходРезультатаЗапроса.ПоГруппировкамСИерархией;
	 ДеревоЗначений = Запрос.Выполнить().Выгрузить(Обход);
Показать


Только в результате дальше мы работаем не с таблицей а с деревом значений.
+
13. YODDHA 49 25.10.12 16:30 Сейчас в теме
добрый день, я услышал что именно в запросе, вот вариант где ну почти в запросе,
все таки используется процедура, в общем посмотрите
http://infostart.ru/public/102086/
+
14. ildarovich 7861 27.10.12 20:41 Сейчас в теме
15. hornet_X 1 19.11.15 08:43 Сейчас в теме
16. SIMatveev@1cbit.ru 26.02.19 12:52 Сейчас в теме
Мне поставили задачу выбрать три уровня вложенности товаров.
Вот как написала запрос:

ВЫБРАТЬ
	ТоварыНаСкладахОстатки.Номенклатура.Код КАК НоменклатураКод,
	ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
	
	выбор когда ТоварыНаСкладахОстатки.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) тогда
		  	ТоварыНаСкладахОстатки.Номенклатура.Родитель.Родитель.Родитель.Родитель
		  когда ТоварыНаСкладахОстатки.Номенклатура.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) тогда
		  	ТоварыНаСкладахОстатки.Номенклатура.Родитель.Родитель.Родитель
		  когда ТоварыНаСкладахОстатки.Номенклатура.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) тогда
		  	ТоварыНаСкладахОстатки.Номенклатура.Родитель.Родитель
		  когда ТоварыНаСкладахОстатки.Номенклатура.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) тогда
		  	ТоварыНаСкладахОстатки.Номенклатура.Родитель
		  иначе ТоварыНаСкладахОстатки.Номенклатура.Родитель.Родитель.Родитель.Родитель.родитель
	конец как Группа1,
	
	выбор когда ТоварыНаСкладахОстатки.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) тогда
		  	ТоварыНаСкладахОстатки.Номенклатура.Родитель.Родитель.Родитель
		  когда ТоварыНаСкладахОстатки.Номенклатура.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) тогда
		  	ТоварыНаСкладахОстатки.Номенклатура.Родитель.Родитель
		  когда ТоварыНаСкладахОстатки.Номенклатура.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) тогда
		  	ТоварыНаСкладахОстатки.Номенклатура.Родитель
		  иначе ТоварыНаСкладахОстатки.Номенклатура.Родитель.Родитель.Родитель.Родитель
	конец как Группа2,
	
	выбор когда ТоварыНаСкладахОстатки.Номенклатура.Родитель.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) тогда
		  	ТоварыНаСкладахОстатки.Номенклатура.Родитель.Родитель
		  когда ТоварыНаСкладахОстатки.Номенклатура.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) тогда
		  	ТоварыНаСкладахОстатки.Номенклатура.Родитель
		  иначе ТоварыНаСкладахОстатки.Номенклатура.Родитель.Родитель.Родитель
	конец как Группа3
		  	

ИЗ
	РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаПо, ) КАК ТоварыНаСкладахОстатки
ГДЕ
	ТоварыНаСкладахОстатки.Склад = &Склад
Показать
+
19. YODDHA 49 27.02.19 14:52 Сейчас в теме
написал выше

а судя по этой записи то вообще достаточно условия
(16) [IS-QUOTE]ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаПо, ) КАК ТоварыНаСкладахОстатки[/


вот этого условия, если четвертый родитель не пустой, то такой товар вам не нужен
Где ТоварыНаСкладахОстатки.Номенклатура.Родитель.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
+
17. YODDHA 49 27.02.19 14:46 Сейчас в теме
ВЫБРАТЬ
	Номенклатура.Ссылка,
	Номенклатура.Родитель,
	Номенклатура.Родитель.Родитель,
	Номенклатура.Родитель.Родитель.Родитель
ПОМЕСТИТЬ Товар
ИЗ
	Справочник.Номенклатура КАК Номенклатура
ГДЕ
	НЕ Номенклатура.ЭтоГруппа
	И Номенклатура.Родитель.Родитель.Родитель.Родитель.Ссылка = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
Показать


на мой вкус этого будет достаточно
+
18. YODDHA 49 27.02.19 14:48 Сейчас в теме
та номенклатура, над которой будет, более трех родителей, будет отсекаться, и так же не будут отбираться группы сами по себе, только в составе товара
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот