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

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С.

15500 руб.

02.09.2020    185587    1034    403    

971

Обновление 1С Запросы Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 Абонемент ($m)

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

2 стартмани

06.02.2025    2240    17    XilDen    26    

36

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

В статье приведена удобная возможность отладки исполняемого запроса динамического списка.

03.12.2024    5822    artemusII    11    

23

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

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

18.10.2024    13236    sergey279    18    

66

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

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

11.10.2024    8308    XilDen    36    

90

СКД Механизмы типовых конфигураций Запросы Программист Платформа 1С v8.3 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    3254    PROSTO-1C    0    

23

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

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

16.08.2024    10883    user1840182    5    

29
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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) А какая у вас конфигурация?
Смогу глянуть причину только завтра, исправленную версию обновлю здесь и перекину вам на почту (напишите какую).
Оставьте свое сообщение