gifts2017

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

Опубликовал Андрей Захаров (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 1
.png 8,35Kb
25.07.13
1
.png 8,35Kb Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

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