Уйти от запроса в цикле

1. MikhailDr 18.01.19 16:08 Сейчас в теме
Ломаю голову над задачкой, надеюсь здесь подскажут. Есть документ "Комплектация номенклатуры", в нем мы из нескольких номенклатур собираем одну. Задача в том, чтобы собрать всю номенклатуру, которая участвовала в сборке конечной. А проблема в том, что номенклатура из которой мы собирали другую номенклатуру могла быть тоже собрана.

Пример.
Есть станок
Он собран из генератора, станины и креплений (документ комплектация номенклатуры № 1)
Генератор собран из платы и проводов (документ комплектация номенклатуры № 2)
Плата собрана из конденсаторов (документ комплектация номенклатуры № 3).

Количество таких вложений мне неизвестно, их может вообще не быть, а может быть десяток. Как их все собрать без запроса в цикле пока что придумать не могу.
По теме из базы знаний
Ответы
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
3. alex-l19041 8 18.01.19 16:29 Сейчас в теме
(1) если есть возможность посмотрите в УПП, в документе Отчет производства за смену
4. mkalimulin 1164 18.01.19 16:33 Сейчас в теме
(1) Не стоит придумывать. Язык запросов (а точнее, реализация языка запросов на 1С) не полноценный язык программирования. И некоторые виды задач на нем не решаются. В частности задачи, требующие рекурсии. А у вас именно такая задача.
5. spacecraft 18.01.19 16:50 Сейчас в теме
(1) первым запросом получаете список root Номенклатуру и их childrens. Далее новым запросом получаете для полученных детей их детей, с группировкой. И так далее, пока не будет пустого запроса. Идея в том, что не для каждой номенклатуры получать детей запросом в цикле, а сразу список по уровню братьев. Цикличность будет меньше.
6. Xershi 1479 18.01.19 16:53 Сейчас в теме
(1) для решения данной задачи условий не достаточно!
Ильдарович такое на раз делает. Плюс в УП дерево спецификаций так строится.
Так что либо смотрите как это в типовых. Либо условия связи подробнее описывайте!
2. acanta 18.01.19 16:16 Сейчас в теме
Вы хотите чтобы запрос в цикле написал вместо вас компилятор платформы 1С?
7. MikhailDr 18.01.19 17:27 Сейчас в теме
Нашел решение. Суть в том, чтобы отобрать всю номенклатуру, которая хоть раз комплектовала другую номенклатуру (первый набор данных) и потом при отборе проверять, есть ли в списке номенклатура из первого набора. Если есть, то выводим в наш запрос еще и ту номенклатуру, которая ею комплектовалась. Вот текст запроса, писал на скорую руку, там еще надо убрать номенклатуру первого набора

"ВЫБРАТЬ
	|	КомплектацияНоменклатурыКомплектующие.Номенклатура КАК Номенклатура
	|ПОМЕСТИТЬ ВсяНоменклатураНеоднократнойСборки
	|ИЗ
	|	Документ.КомплектацияНоменклатуры.Комплектующие КАК КомплектацияНоменклатурыКомплектующие
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.КомплектацияНоменклатуры КАК КомплектацияНоменклатуры
	|		ПО КомплектацияНоменклатурыКомплектующие.Номенклатура = КомплектацияНоменклатуры.Номенклатура
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ
	|	ВсяНоменклатураНеоднократнойСборки.Номенклатура КАК Номенклатура
	|ПОМЕСТИТЬ ТекущаяНоменклатураНеоднократнойСборки
	|ИЗ
	|	Документ.КомплектацияНоменклатуры КАК КомплектацияНоменклатуры
	|		ЛЕВОЕ СОЕДИНЕНИЕ Документ.КомплектацияНоменклатуры.Комплектующие КАК КомплектацияНоменклатурыКомплектующие
	|			ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВсяНоменклатураНеоднократнойСборки КАК ВсяНоменклатураНеоднократнойСборки
	|			ПО КомплектацияНоменклатурыКомплектующие.Номенклатура = ВсяНоменклатураНеоднократнойСборки.Номенклатура
	|		ПО КомплектацияНоменклатуры.Ссылка = КомплектацияНоменклатурыКомплектующие.Ссылка
	|ГДЕ
	|	КомплектацияНоменклатуры.Номенклатура = &Номенклатура
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ
	|	КомплектацияНоменклатурыКомплектующие.Номенклатура КАК Номенклатура
	|ИЗ
	|	ТекущаяНоменклатураНеоднократнойСборки КАК ТекущаяНоменклатураНеоднократнойСборки
	|		ЛЕВОЕ СОЕДИНЕНИЕ Документ.КомплектацияНоменклатуры КАК КомплектацияНоменклатуры
	|			ЛЕВОЕ СОЕДИНЕНИЕ Документ.КомплектацияНоменклатуры.Комплектующие КАК КомплектацияНоменклатурыКомплектующие
	|			ПО КомплектацияНоменклатуры.Ссылка = КомплектацияНоменклатурыКомплектующие.Ссылка
	|		ПО ТекущаяНоменклатураНеоднократнойСборки.Номенклатура = КомплектацияНоменклатуры.Номенклатура
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	КомплектацияНоменклатурыКомплектующие.Номенклатура
	|ИЗ
	|	Документ.КомплектацияНоменклатуры КАК КомплектацияНоменклатуры
	|		ЛЕВОЕ СОЕДИНЕНИЕ Документ.КомплектацияНоменклатуры.Комплектующие КАК КомплектацияНоменклатурыКомплектующие
	|		ПО КомплектацияНоменклатуры.Ссылка = КомплектацияНоменклатурыКомплектующие.Ссылка
	|ГДЕ
	|	КомплектацияНоменклатуры.Номенклатура = &Номенклатура";
Показать
8. acanta 18.01.19 17:33 Сейчас в теме
(7) При уровне вложенности более 2 работает? Смысл рекурсии не в том, чтобы перебирать перебором, а в том, чтобы найти логическую связь данных при отсутствии физических реляций (ссылок).
9. MikhailDr 18.01.19 17:41 Сейчас в теме
(8) Да, там могут быть другие ошибки, уже поздно, я потом проверю, но в этом отношении все верно.

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

Может быть есть более оптимальный путь, но я его пока не вижу.
10. spacecraft 18.01.19 18:06 Сейчас в теме
(9)
Логика в том, что я в первом пакете собираю всю номенклатуру, у которой есть хотя бы один уровень вложенности. Он может быть третьим или десятым, неважно. А потом проверяю в выборке, попала ли туда одна из этих позиций.

Получили:
Child | Parent
н2 = н1
н3 = н2
н4 = н3
н5 = н2

Соединяем и выбираем по н1:
н1, н2, н3, н5.

Потеряли:
н4
11. gkhvgkh 21.01.19 12:05 Сейчас в теме
Это сплошная рекурсия, а в запросах с ней плохо.
Тут помогут только грабли и костыли, я думаю. И то не факт что эти грабли вам полбу не съездят в будущем.
12. acanta 21.01.19 12:14 Сейчас в теме
Запрос в данном случае поможет тем, что рекурсия будет обращаться не к базе данных на сервере, а к отфильтрованной временной таблице.
Тот же принцип, что и в структуре подчиненности документов.
13. senshkr 13 22.01.19 22:35 Сейчас в теме
Сформируем массив номенклатуры следующим образом (в общих чертах):

Цикл по ТЧ документа "Комплектация номенклатуры"
если номенклатура несборная, добавляем ее в массив
если номенклатура сборная, вызываем функцию, которая крутит цикл по элементам этой сборной номенклатуры и добавляет в массив несборную номенклатуру, а если встречается сборная, вызывает себя.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот