gifts2017

Получение первого уровня иерархии справочника (департамента/верхней группы)

Опубликовал Alexander Shvets (Alexander.Shvets) в раздел Обработки - Обработка справочников

Получение первого уровня иерархии справочника (департамента/верхней группы) одним запросом. Произвольный справочник / произвольное значение / произвольная конфигурация. Обработка опирается только на метаданные.

Как-то задался целью получить первый уровень иерархии справочника (департамента/верхней группы) одним запросом, без обхода в цикле и без получения родителя, пока не получим пустую ссылку.

В результате написал эту обработку. Со временем она обросла "плюшками" и стала годной для публикации ) .

Возможна работа под произвольной конфигурацией (типы элементов формы: строка и произвольная ссылка).
Сообщение о верхнем элементе содержит ссылку объекта. (Клик-клик для открытия) 

Обработка опирается только на метаданные. При открытии получает список справочников.

&НаСервере
Функция ПолучитьСписокСправочников()
	
	МассивВозврата = Новый Массив;
	
	Для Каждого МетаданныеСправочник Из Метаданные.Справочники Цикл
		МассивВозврата.Добавить(МетаданныеСправочник.Имя);
	КонецЦикла;
	
	Возврат МассивВозврата;
	
КонецФункции

При выборе справочника - предлагает выбрать значение для обработки.

&НаКлиенте
Процедура ИмяСправочникаПриИзменении(Элемент)
	
	Если ИмяСправочника <> "" Тогда
		ОписаниеТипа = Новый ОписаниеТипов("СправочникСсылка."+ИмяСправочника); 
		Элементы.ПроверяемоеЗначение.ОграничениеТипа = ОписаниеТипа; 
		ПроверяемоеЗначение = ОписаниеТипа.ПривестиЗначение(); 
	Иначе
		ПроверяемоеЗначение = Неопределено;
	КонецЕсли;

КонецПроцедуры

Результат - получение врхней иерархии и сообщение с ссылкой на группу.

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

 Обработка переделана под платформу 8.3.7.1759. Но сам код работает и на платформе 8.2

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
ОпределитьПервыйУровеньИерархии
.epf 6,75Kb
05.01.16
0
.epf 1.0 6,75Kb 0 Скачать

См. также

Contragent+ 5.0 от 2 500
Подписаться Добавить вознаграждение

Комментарии

1. Ярослав Радкевич (WKBAPKA) 06.01.16 18:07
А что, условие

ГДЕ
     Родитель = ЗНАЧЕНИЕ(Справочники.МойСправочник.ПустаяСсылка)


уже не работает?
2. Alexandr Kuritsyn (hibico) 11.01.16 12:23
Думаю, так корректнее будет:
ЗапросПоИерархии.Текст = "ВЫБРАТЬ
                             |    Справочник.Ссылка КАК Ссылка
                             |ИЗ
                             |    Справочник."+ИмяСправочника+" КАК Справочник
                             |ГДЕ
                             |    Справочник.Ссылка = &ПроверяемоеЗначение
                             |ИТОГИ ПО
                             |    Ссылка ТОЛЬКО ИЕРАРХИЯ";
...Показать Скрыть
3. Alexander Shvets (Alexander.Shvets) 11.01.16 16:00
(1) WKBAPKA, А если уровней иерархии 15? И у разных элементах их может быть как 3 так и 8... Данное выражение уместно лишь при одинаковой глубине иерархии у всех элементах.

В случае тех же департаментов структура древовидная, с разными уровнями иерархии.
4. Alexander Shvets (Alexander.Shvets) 11.01.16 16:08
(2) hibico, Да, если мы решили идти только вверх. В случае необходимости получения нижних элементов (подчиненных), то можно оставить "В ИЕРАРХИИ"(если в запросе мы дальше будем работать со всей структурой).

Например нам нужно нарисовать блок-схему одного подразделения. "В ИЕРАРХИИ" Вернет все значения, относящиеся к нему. Сравнение с ссылкой вернет только все, что "сверху". Вот и все отличие.

В любом случае предоставил механизм, а как его крутить - решать вам =)))
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа