Уровни иерархии предков элементов справочника запросом

Опубликовал Андрей Захаров (zaxarovsky) в раздел Программирование - Практика программирования

Предлагаю вниманию случай использования методики, описанной автором    ildarovich [http://infostart.ru/profile/28527/] в статье [http://infostart.ru/public/160707/]
Одним пакетным запросом для каждого элемента справочника выводятся уровни всех его предков.

 Используйте такую функцию, чтобы получить нижеприведенную таблицу.

Функция УровниПрародителей(ИмяСправочника, МаксимальнаяДлинаПути) Экспорт

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

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

	//Все предки
    Эпилог1 = "ВЫБРАТЬ НачалоДуги Предок, КонецДуги Потомок Поместить Предки ИЗ ЗамыканияДлины#2
            | ГДЕ НачалоДуги <> КонецДуги ;";
			
	//Уровни групп-предков		
    Эпилог2 = "ВЫБРАТЬ КОЛИЧЕСТВО(НачалоДуги) - 1 Предок, КонецДуги Потомок Поместить Уровни ИЗ ЗамыканияДлины#2 СГРУППИРОВАТЬ ПО КонецДуги;";

    Итог = "Выбрать Предки.Предок Как Предок, Уровни.Предок Как Уровень,  Предки.Потомок Как Потомок  Из Предки Как Предки 
            | ЛЕВОЕ СОЕДИНЕНИЕ   Уровни Как Уровни По Предки.Предок = Уровни.Потомок 
            | ГДЕ Предки.Потомок.ЭтоГруппа = Ложь 
			| Упорядочить По Предки.Потомок.Наименование, Уровни.Предок 
            | ";
	
    Запрос = Новый Запрос(СтрЗаменить(Пролог, "Номенклатура", ИмяСправочника));

    МаксимальнаяДлинаЗамыканий = 1;

    Пока МаксимальнаяДлинаЗамыканий < МаксимальнаяДлинаПути Цикл

        Запрос.Текст = Запрос.Текст + СтрЗаменить(СтрЗаменить(Рефрен, "#1", Формат(МаксимальнаяДлинаЗамыканий, "ЧГ=0")), "#2", Формат(2 * МаксимальнаяДлинаЗамыканий, "ЧГ=0"));

        МаксимальнаяДлинаЗамыканий = 2 * МаксимальнаяДлинаЗамыканий

    КонецЦикла;

    Запрос.Текст = Запрос.Текст + СтрЗаменить(Эпилог1, "#2", Формат(МаксимальнаяДлинаЗамыканий, "ЧГ=0"));
	
	Запрос.Текст = Запрос.Текст + СтрЗаменить(Эпилог2, "#2", Формат(МаксимальнаяДлинаЗамыканий, "ЧГ=0"));
	
	Запрос.Текст = Запрос.Текст + Итог;

    Возврат Запрос.Выполнить().Выгрузить()

КонецФункции



Спасибо  ildarovich за великолепную реализацию результатов теории графов  с использованием языка запросов 1С! (См. [http://infostart.ru/public/160707/])



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

Наименование Файл Версия Размер
Уровни0.png
.png 8,35Kb
25.07.13
1
.png 8,35Kb 1 Скачать

См. также

Добавить вознаграждение
Комментарии
1. al petrov (petrov_al) 10 26.07.13 16:01 Сейчас в теме
Это выложенная перепечатка или тут есть что то новое?
2. Андрей Захаров (zaxarovsky) 91 26.07.13 16:25 Сейчас в теме
тут написана новая функция на основе компиляции двух примеров из статей ildarovich.
мне нужно было получить таблицу именно такой структуры как здесь показано на картинке.