Поставленные цели при разработке ланной обработки:
- наглядный просмотр что и из чего состоит и нет-ли зацикливания;
- увеличение быстродействия процесса разузловки.
Плюсы и минусы обработки:
- заранее не известно какую вложенность запроса необходимо использовать;
+ быстродействие "на лицо" ввиду всего одного обращения к БД.
Для тех, кого интересует только сам запрос, вот код формирования запроса, он не сложен:
Функция СформироватьТекстЗапросаПоВложенностиСпецификаций()
ТекстЗапроса =
"ВЫБРАТЬ
| 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)) КАК Коэффициент,
| ВТ_Итоговая.КоличествоИтого КАК КоличествоИтого,
| ВЫБОР КОГДА ВТ_Итоговая.Номенклатура.ВидВоспроизводства = ЗНАЧЕНИЕ(Перечисление.ВидыВоспроизводстваНоменклатуры.ПустаяСсылка) ТОГДА ЗНАЧЕНИЕ(Перечисление.ВидыВоспроизводстваНоменклатуры.Закупка) ИНАЧЕ ВТ_Итоговая.Номенклатура.ВидВоспроизводства КОНЕЦ КАК ВидВоспроизводства,
| Представление(ВЫБОР КОГДА ВТ_Итоговая.Номенклатура.ВидВоспроизводства = ЗНАЧЕНИЕ(Перечисление.ВидыВоспроизводстваНоменклатуры.ПустаяСсылка) ТОГДА ЗНАЧЕНИЕ(Перечисление.ВидыВоспроизводстваНоменклатуры.Закупка) ИНАЧЕ ВТ_Итоговая.Номенклатура.ВидВоспроизводства КОНЕЦ) КАК ВидВоспроизводстваПредставление,
| Представление(ВТ_Итоговая.Номенклатура) КАК НоменклатураПредставление,
| Представление(ВТ_Итоговая.НоменклатураРодитель) КАК НоменклатураРодительПредставление,
| Представление(ВТ_Итоговая.ХарактеристикаНоменклатуры) КАК ХарактеристикаНоменклатурыПредставление,
| Представление(ВТ_Итоговая.СпецификацияНоменклатуры) КАК СпецификацияНоменклатурыПредставление,
| Представление(ВТ_Итоговая.ЕдиницаИзмерения) КАК ЕдиницаИзмеренияПредставление,
| Представление(ВТ_Итоговая.ЕдиницаИзмеренияРодитель) КАК ЕдиницаИзмеренияРодительПредставление,
| Представление(ВТ_Итоговая.ЕдиницаИзмеренияВыпуск) КАК ЕдиницаИзмеренияВыпускПредставление
|ИЗ
| ВТ_Итоговая КАК ВТ_Итоговая";
ТекстЗапроса = ТекстЗапроса + Символы.ПС + "УПОРЯДОЧИТЬ ПО Уровень, НоменклатураНаименование";
Возврат ТекстЗапроса;
КонецФункции