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

26.07.16

Разработка - Запросы

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Разузловка номенклатуры
.epf 26,29Kb
34
34 Скачать (2 SM) Купить за 2 150 руб.

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

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

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

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

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

 

обработка номенклатура разузловка запрос

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

12000 руб.

02.09.2020    169274    937    403    

905

Запросы Программист Бесплатно (free)

Увидел cheatsheet по SQL и захотелось нарисовать подобное, но про запросы.

18.10.2024    11394    sergey279    18    

65

Запросы Программист Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    6338    XilDen    36    

83

Запросы Программист Запросы Бесплатно (free)

Отлаживая взаимодействие с базой данных, мы регулярно сталкиваемся с зависающими или подозрительно долго выполняющимися обращениями, негативно влияющими на производительность. О том, как в PostgreSQL выявить подозрительные запросы, основываясь на доступной о них информации, расскажем в статье.

16.08.2024    9068    user1840182    5    

28

Математика и алгоритмы Запросы Программист Платформа 1С v8.3 Запросы Бесплатно (free)

Рассмотрим быстрый алгоритм поиска дублей с использованием hash функции по набору полей шапки и табличных частей.

08.07.2024    2727    ivanov660    9    

22

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    10219    implecs_team    6    

48

Запросы Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Часто поступают задачи по произвольному распределению общих сумм. После распределения иногда пропадают копейки. Суть решения добавить АвтоНомерЗаписи() в ВТ распределения, и далее используя функции МАКСИМУМ или МИНИМУМ можем положить разницу копеек в первую или последнюю строку знаменателя распределения.

11.04.2024    3623    andrey_sag    10    

38
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. sea123 15 27.07.16 10:56 Сейчас в теме
Мне кажется, что запрос не растаскивает узлы.
2. DrBlack 24 27.07.16 13:58 Сейчас в теме
(1) sea123, уважаемый, перед тем как писать своё мнение, вы хоть бы попробовали выполнить запрос или вникнуть в суть запроса (который я выложил).
Только потом, когда у вас придет понимание, с удовольствием послушаю конструктивную критику, а так - ваш коммент ниочём
3. user703847_shangina 09.10.17 14:58 Сейчас в теме
Здравствуйте. Подходит ваша обработка для 1С:ERP 2.2?
4. vano-ekt 124 09.10.17 15:08 Сейчас в теме
- увеличение быстродействия процесса разузловки.

относительно чего? типовой рекурсии ЗаполнитьСтрокиДереваСпецификаций конструктора спецификаций?
5. user902091 15.08.18 14:52 Сейчас в теме
а почему узлы не раскрывает
Прикрепленные файлы:
6. DrBlack 24 15.08.18 14:54 Сейчас в теме
(5) А какая у вас конфигурация?
Смогу глянуть причину только завтра, исправленную версию обновлю здесь и перекину вам на почту (напишите какую).
Оставьте свое сообщение