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

26.07.16

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

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

Скачать исходный код

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

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

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

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

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

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

 

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

См. также

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

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

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    125074    683    389    

732

Пропорциональное распределение в запросе с использованием АвтоНомерЗаписи()

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

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

11.04.2024    2267    andrey_sag    10    

28

Для чего используют конструкцию запроса "ГДЕ ЛОЖЬ" в СКД на примере конфигурации 1С:ERP

Запросы СКД Платформа 1С v8.3 Запросы Система компоновки данных 1С:ERP Управление предприятием 2 Бесплатно (free)

В типовых конфигурациях разработчики компании 1С иногда используют в отчетах, построенных на СКД, такую конструкцию, как "ГДЕ ЛОЖЬ". Такая конструкция говорит о том, что данные в запросе не будут получены совсем. Для чего же нужен тогда запрос?

13.02.2024    6016    KawaNoNeko    23    

25

Набор-объект для СКД по тексту или запросу

Запросы СКД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2155    2    Yashazz    0    

31

Запрос 1С copilot

Инструментарий разработчика Запросы Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Пишем на человеческом языке, что нам надо, и получаем текст запроса на языке 1С. Используются большие языковые модели (LLM GPT) от OpenAI или Яндекс на выбор.

5 стартмани

15.01.2024    6652    31    mkalimulin    27    

52

PrintWizard: поддержка представлений ЗУП в конструкторе

Инструментарий разработчика Запросы Платформа 1С v8.3 Бесплатно (free)

Одной из интересных задач, стоящих в процессе разработки, была поддержка механизма представлений в ЗУП. Но не просто возможность исполнения запросов с ними. Основная проблема была в том, чтобы с ними было удобно работать, а именно: создавать, модифицировать и отлаживать. Кратко о том, что в итоге получилось...

14.12.2023    1887    vandalsvq    7    

29

Объектная модель запроса "Схема запроса" 2

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

Далеко уже не новый тип данных "Схема запроса". Статья о том, как использовать его "попроще". Примеры создания текста запроса с нуля и изменение имеющегося запроса.

06.12.2023    5631    user1923546    26    

46

Начните уже использовать хранилище запросов

HighLoad оптимизация Запросы

Очень немногие из тех, кто занимается поддержкой MS SQL, работают с хранилищем запросов. А ведь хранилище запросов – это очень удобный, мощный и, главное, бесплатный инструмент, позволяющий быстро найти и локализовать проблему производительности и потребления ресурсов запросами. В статье расскажем о том, как использовать хранилище запросов в MS SQL и какие плюсы и минусы у него есть.

11.10.2023    16611    skovpin_sa    14    

101
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. sea123 15 27.07.16 10:56 Сейчас в теме
Мне кажется, что запрос не растаскивает узлы.
2. DrBlack 23 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 23 15.08.18 14:54 Сейчас в теме
(5) А какая у вас конфигурация?
Смогу глянуть причину только завтра, исправленную версию обновлю здесь и перекину вам на почту (напишите какую).
Оставьте свое сообщение