gifts2017

Разузловка номенклатуры запросом по спецификации

Опубликовал Evgeniy Nikolaenko (DrBlack) в раздел Программирование - Практика программирования

Разузловка номенклатуры предназначена только для наглядного просмотра (имеет возможность нескольких вариантов вывода). Сам процесс разузловки реализован одним запросом к БД, что позволяет выигрывать в скорости дабы не раздражать пользователя. Возможно вам необходим только код запроса, я его опубликовал ниже.

Поставленные цели при разработке ланной обработки:
- наглядный просмотр что и из чего состоит и нет-ли зацикливания;
- увеличение быстродействия процесса разузловки.

Плюсы и минусы обработки:
- заранее не известно какую вложенность запроса необходимо использовать;
+ быстродействие "на лицо" ввиду всего одного обращения к БД.

Для тех, кого интересует только сам запрос, вот код формирования запроса, он не сложен:

Функция СформироватьТекстЗапросаПоВложенностиСпецификаций()
    
    ТекстЗапроса = 
    "ВЫБРАТЬ
    |   1 КАК Уровень,
    |   СпецификацииУровень1.Номенклатура КАК Номенклатура,
    |   СпецификацииВыпускУровень1.Номенклатура КАК НоменклатураРодитель,
    |   СпецификацииУровень1.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    |   ОсновныеСпецификации.СпецификацияНоменклатуры КАК СпецификацияНоменклатуры,
    |   &Спецификация КАК СпецификацияНоменклатурыРодитель,
    |   СпецификацииУровень1.Количество КАК Количество,
	|   СпецификацииУровень1.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	|   СпецификацииВыпускУровень1.Количество КАК КоличествоВыпуск,
	|   СпецификацииВыпускУровень1.ЕдиницаИзмерения КАК ЕдиницаИзмеренияВыпуск,
    |   &КоличествоЕд КАК КоличествоРодитель,
    |   ЗНАЧЕНИЕ(Справочник.ЕдиницыИзмерения.ПустаяСсылка) КАК ЕдиницаИзмеренияРодитель,
    |   СпецификацииУровень1.Количество / СпецификацииВыпускУровень1.Количество КАК Коэффициент,
    |   ВЫРАЗИТЬ(СпецификацииУровень1.Количество / СпецификацииВыпускУровень1.Количество * &КоличествоЕд КАК ЧИСЛО(15,3)) КАК КоличествоИтого
	|ПОМЕСТИТЬ ВТ_Уровень1
    |ИЗ
    |   Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК СпецификацииУровень1
    |       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОсновныеСпецификацииНоменклатуры.СрезПоследних(&НаДату, ) КАК ОсновныеСпецификации
    |       ПО СпецификацииУровень1.Номенклатура = ОсновныеСпецификации.Номенклатура
    |           И СпецификацииУровень1.ХарактеристикаНоменклатуры = ОсновныеСпецификации.ХарактеристикаНоменклатуры
    |           И (ОсновныеСпецификации.Подразделение = ЗНАЧЕНИЕ(Справочник.Подразделения.ПустаяСсылка))
    |       ПОЛНОЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры.ВыходныеИзделия КАК СпецификацииВыпускУровень1
    |   	ПО СпецификацииУровень1.Ссылка = СпецификацииВыпускУровень1.Ссылка
    |   		И (СпецификацииВыпускУровень1.НомерСтроки = 1)
    |ГДЕ
    |   СпецификацииУровень1.Ссылка = &Спецификация
    |   И СпецификацииВыпускУровень1.Ссылка = &Спецификация";
    
    Для Сч = 2 По КоличествоУровней Цикл
        
        ТекстЗапроса = ТекстЗапроса + Символы.ПС + 
        ";
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |	%ТекУровень% КАК Уровень,
        |	СпецификацииУровень%ТекУровень%.Номенклатура КАК Номенклатура,
        |	ВТ_Уровень%ПредУровень%.Номенклатура КАК НоменклатураРодитель,
        |	СпецификацииУровень%ТекУровень%.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
        |	ОсновныеСпецификации.СпецификацияНоменклатуры КАК СпецификацияНоменклатуры,
        |	ВТ_Уровень%ПредУровень%.СпецификацияНоменклатуры КАК СпецификацияНоменклатурыРодитель,
        |	ВТ_Уровень%ПредУровень%.КоличествоИтого КАК КоличествоРодитель,
        |	ВТ_Уровень%ПредУровень%.ЕдиницаИзмерения КАК ЕдиницаИзмеренияРодитель,
        |	СпецификацииУровень%ТекУровень%.Количество КАК Количество,
        |	СпецификацииУровень%ТекУровень%.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
    	|	СпецификацииВыпускУровень%ТекУровень%.Количество КАК КоличествоВыпуск,
    	|	СпецификацииВыпускУровень%ТекУровень%.ЕдиницаИзмерения КАК ЕдиницаИзмеренияВыпуск,
        |   СпецификацииУровень%ТекУровень%.Количество / СпецификацииВыпускУровень%ТекУровень%.Количество КАК Коэффициент,
        |   ВЫРАЗИТЬ(СпецификацииУровень%ТекУровень%.Количество / СпецификацииВыпускУровень%ТекУровень%.Количество * ВТ_Уровень%ПредУровень%.КоличествоИтого КАК ЧИСЛО(15,3)) КАК КоличествоИтого
        |ПОМЕСТИТЬ ВТ_Уровень%ТекУровень%
        |ИЗ
        |	ВТ_Уровень%ПредУровень% КАК ВТ_Уровень%ПредУровень%
        |		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК СпецификацииУровень%ТекУровень%
        |			ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОсновныеСпецификацииНоменклатуры.СрезПоследних(&НаДату, ) КАК ОсновныеСпецификации
        |			ПО СпецификацииУровень%ТекУровень%.Номенклатура = ОсновныеСпецификации.Номенклатура
        |				И СпецификацииУровень%ТекУровень%.ХарактеристикаНоменклатуры = ОсновныеСпецификации.ХарактеристикаНоменклатуры
        |				И (ОсновныеСпецификации.Подразделение = ЗНАЧЕНИЕ(Справочник.Подразделения.ПустаяСсылка))
        |		ПО ВТ_Уровень%ПредУровень%.СпецификацияНоменклатуры = СпецификацииУровень%ТекУровень%.Ссылка
        |       ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СпецификацииНоменклатуры.ВыходныеИзделия КАК СпецификацииВыпускУровень%ТекУровень%
        |   	ПО ВТ_Уровень%ПредУровень%.СпецификацияНоменклатуры = СпецификацииВыпускУровень%ТекУровень%.Ссылка
        |			И ВТ_Уровень%ПредУровень%.Номенклатура = СпецификацииВыпускУровень%ТекУровень%.Номенклатура";
        
        ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "%ТекУровень%",  Сч);
        ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "%ПредУровень%", Сч-1);
        
    КонецЦикла;
    
    ТекстЗапроса = ТекстЗапроса + Символы.ПС +
    ";
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |	ВТ_Уровень1.Уровень КАК Уровень,
    |	ВТ_Уровень1.Номенклатура КАК Номенклатура,
    |   ВТ_Уровень1.НоменклатураРодитель КАК НоменклатураРодитель,
    |	ВТ_Уровень1.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    |	ВТ_Уровень1.СпецификацияНоменклатуры КАК СпецификацияНоменклатуры,
    |	ВТ_Уровень1.СпецификацияНоменклатурыРодитель КАК СпецификацияНоменклатурыРодитель,
    |   ВТ_Уровень1.Количество КАК Количество,
    |   ВТ_Уровень1.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
    |   ВТ_Уровень1.КоличествоРодитель КАК КоличествоРодитель,
    |   ВТ_Уровень1.ЕдиницаИзмеренияРодитель КАК ЕдиницаИзмеренияРодитель,
    |   ВТ_Уровень1.КоличествоВыпуск КАК КоличествоВыпуск,
	|   ВТ_Уровень1.ЕдиницаИзмеренияВыпуск КАК ЕдиницаИзмеренияВыпуск,
    |   ВТ_Уровень1.Коэффициент КАК Коэффициент,
    |   ВТ_Уровень1.КоличествоИтого КАК КоличествоИтого
    |ПОМЕСТИТЬ ВТ_Итоговая
    |ИЗ
    |	ВТ_Уровень1 КАК ВТ_Уровень1";
    
    Для Сч = 2 По КоличествоУровней Цикл
        
        ТекстЗапроса = ТекстЗапроса + Символы.ПС +
        "ОБЪЕДИНИТЬ ВСЕ
        |ВЫБРАТЬ
        |	ВТ_Уровень%ТекУровень%.Уровень,
        |	ВТ_Уровень%ТекУровень%.Номенклатура,
        |   ВТ_Уровень%ТекУровень%.НоменклатураРодитель,
        |	ВТ_Уровень%ТекУровень%.ХарактеристикаНоменклатуры,
        |	ВТ_Уровень%ТекУровень%.СпецификацияНоменклатуры,
        |	ВТ_Уровень%ТекУровень%.СпецификацияНоменклатурыРодитель,
        |	ВТ_Уровень%ТекУровень%.Количество,
        |	ВТ_Уровень%ТекУровень%.ЕдиницаИзмерения,
        |	ВТ_Уровень%ТекУровень%.КоличествоРодитель,
        |	ВТ_Уровень%ТекУровень%.ЕдиницаИзмеренияРодитель,
        |	ВТ_Уровень%ТекУровень%.КоличествоВыпуск,
        |	ВТ_Уровень%ТекУровень%.ЕдиницаИзмеренияВыпуск,
        |	ВТ_Уровень%ТекУровень%.Коэффициент,
        |	ВТ_Уровень%ТекУровень%.КоличествоИтого
        |ИЗ
        |	ВТ_Уровень%ТекУровень% КАК ВТ_Уровень%ТекУровень%
        |ГДЕ
        |	НЕ ВТ_Уровень%ТекУровень%.Номенклатура ЕСТЬ NULL";
        ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "%ТекУровень%",  Сч);
        
    КонецЦикла;
    
     ТекстЗапроса = ТекстЗапроса + Символы.ПС +
    ";
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ РАЗЛИЧНЫЕ
    |	ВТ_Итоговая.Уровень КАК Уровень,
    |	ВТ_Итоговая.Номенклатура КАК Номенклатура,
    |	ВТ_Итоговая.Номенклатура.Наименование КАК НоменклатураНаименование,
    |   ВТ_Итоговая.НоменклатураРодитель КАК НоменклатураРодитель,
    |	ВТ_Итоговая.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    |	ВТ_Итоговая.СпецификацияНоменклатуры КАК СпецификацияНоменклатуры,
    |	ВТ_Итоговая.СпецификацияНоменклатурыРодитель КАК СпецификацияНоменклатурыРодитель,
    |	ВТ_Итоговая.Количество КАК Количество,
    |	ВТ_Итоговая.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
    |	ВТ_Итоговая.КоличествоРодитель КАК КоличествоРодитель,
    |	ВТ_Итоговая.ЕдиницаИзмеренияРодитель КАК ЕдиницаИзмеренияРодитель,
    |   ВТ_Итоговая.КоличествоВыпуск КАК КоличествоВыпуск,
	|   ВТ_Итоговая.ЕдиницаИзмеренияВыпуск КАК ЕдиницаИзмеренияВыпуск,
    |   ВЫРАЗИТЬ(ВТ_Итоговая.Коэффициент КАК ЧИСЛО(15,4)) КАК Коэффициент,
    |   ВТ_Итоговая.КоличествоИтого КАК КоличествоИтого,
    |   ВЫБОР КОГДА ВТ_Итоговая.Номенклатура.ВидВоспроизводства = ЗНАЧЕНИЕ(Перечисление.ВидыВоспроизводстваНоменклатуры.ПустаяСсылка) ТОГДА ЗНАЧЕНИЕ(Перечисление.ВидыВоспроизводстваНоменклатуры.Закупка) ИНАЧЕ ВТ_Итоговая.Номенклатура.ВидВоспроизводства КОНЕЦ КАК ВидВоспроизводства,
    |   Представление(ВЫБОР КОГДА ВТ_Итоговая.Номенклатура.ВидВоспроизводства = ЗНАЧЕНИЕ(Перечисление.ВидыВоспроизводстваНоменклатуры.ПустаяСсылка) ТОГДА ЗНАЧЕНИЕ(Перечисление.ВидыВоспроизводстваНоменклатуры.Закупка) ИНАЧЕ ВТ_Итоговая.Номенклатура.ВидВоспроизводства КОНЕЦ) КАК ВидВоспроизводстваПредставление,
    |	Представление(ВТ_Итоговая.Номенклатура) КАК НоменклатураПредставление,
    |	Представление(ВТ_Итоговая.НоменклатураРодитель) КАК НоменклатураРодительПредставление,
    |	Представление(ВТ_Итоговая.ХарактеристикаНоменклатуры) КАК ХарактеристикаНоменклатурыПредставление,
    |	Представление(ВТ_Итоговая.СпецификацияНоменклатуры) КАК СпецификацияНоменклатурыПредставление,
    |	Представление(ВТ_Итоговая.ЕдиницаИзмерения) КАК ЕдиницаИзмеренияПредставление,
    |	Представление(ВТ_Итоговая.ЕдиницаИзмеренияРодитель) КАК ЕдиницаИзмеренияРодительПредставление,
    |	Представление(ВТ_Итоговая.ЕдиницаИзмеренияВыпуск) КАК ЕдиницаИзмеренияВыпускПредставление
    |ИЗ
    |	ВТ_Итоговая КАК ВТ_Итоговая";
    ТекстЗапроса = ТекстЗапроса + Символы.ПС + "УПОРЯДОЧИТЬ ПО Уровень, НоменклатураНаименование";
    
    Возврат ТекстЗапроса;

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

 

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

Наименование Файл Версия Размер Кол. Скачив.
Разузловка номенклатуры
.epf 26,29Kb
26.07.16
9
.epf 26,29Kb 9 Скачать

См. также

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

Комментарии

1. Evgeny Sergeev (sea123) 27.07.16 10:56
Мне кажется, что запрос не растаскивает узлы.
2. Evgeniy Nikolaenko (DrBlack) 27.07.16 13:58
(1) sea123, уважаемый, перед тем как писать своё мнение, вы хоть бы попробовали выполнить запрос или вникнуть в суть запроса (который я выложил).
Только потом, когда у вас придет понимание, с удовольствием послушаю конструктивную критику, а так - ваш коммент ниочём
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа