Ломаю голову над задачкой, надеюсь здесь подскажут. Есть документ "Комплектация номенклатуры", в нем мы из нескольких номенклатур собираем одну. Задача в том, чтобы собрать всю номенклатуру, которая участвовала в сборке конечной. А проблема в том, что номенклатура из которой мы собирали другую номенклатуру могла быть тоже собрана.
Пример.
Есть станок
Он собран из генератора, станины и креплений (документ комплектация номенклатуры № 1)
Генератор собран из платы и проводов (документ комплектация номенклатуры № 2)
Плата собрана из конденсаторов (документ комплектация номенклатуры № 3).
Количество таких вложений мне неизвестно, их может вообще не быть, а может быть десяток. Как их все собрать без запроса в цикле пока что придумать не могу.
Пример.
Есть станок
Он собран из генератора, станины и креплений (документ комплектация номенклатуры № 1)
Генератор собран из платы и проводов (документ комплектация номенклатуры № 2)
Плата собрана из конденсаторов (документ комплектация номенклатуры № 3).
Количество таких вложений мне неизвестно, их может вообще не быть, а может быть десяток. Как их все собрать без запроса в цикле пока что придумать не могу.
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) первым запросом получаете список root Номенклатуру и их childrens. Далее новым запросом получаете для полученных детей их детей, с группировкой. И так далее, пока не будет пустого запроса. Идея в том, что не для каждой номенклатуры получать детей запросом в цикле, а сразу список по уровню братьев. Цикличность будет меньше.
Нашел решение. Суть в том, чтобы отобрать всю номенклатуру, которая хоть раз комплектовала другую номенклатуру (первый набор данных) и потом при отборе проверять, есть ли в списке номенклатура из первого набора. Если есть, то выводим в наш запрос еще и ту номенклатуру, которая ею комплектовалась. Вот текст запроса, писал на скорую руку, там еще надо убрать номенклатуру первого набора
"ВЫБРАТЬ
| КомплектацияНоменклатурыКомплектующие.Номенклатура КАК Номенклатура
|ПОМЕСТИТЬ ВсяНоменклатураНеоднократнойСборки
|ИЗ
| Документ.КомплектацияНоменклатуры.Комплектующие КАК КомплектацияНоменклатурыКомплектующие
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.КомплектацияНоменклатуры КАК КомплектацияНоменклатуры
| ПО КомплектацияНоменклатурыКомплектующие.Номенклатура = КомплектацияНоменклатуры.Номенклатура
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| ВсяНоменклатураНеоднократнойСборки.Номенклатура КАК Номенклатура
|ПОМЕСТИТЬ ТекущаяНоменклатураНеоднократнойСборки
|ИЗ
| Документ.КомплектацияНоменклатуры КАК КомплектацияНоменклатуры
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.КомплектацияНоменклатуры.Комплектующие КАК КомплектацияНоменклатурыКомплектующие
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВсяНоменклатураНеоднократнойСборки КАК ВсяНоменклатураНеоднократнойСборки
| ПО КомплектацияНоменклатурыКомплектующие.Номенклатура = ВсяНоменклатураНеоднократнойСборки.Номенклатура
| ПО КомплектацияНоменклатуры.Ссылка = КомплектацияНоменклатурыКомплектующие.Ссылка
|ГДЕ
| КомплектацияНоменклатуры.Номенклатура = &Номенклатура
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| КомплектацияНоменклатурыКомплектующие.Номенклатура КАК Номенклатура
|ИЗ
| ТекущаяНоменклатураНеоднократнойСборки КАК ТекущаяНоменклатураНеоднократнойСборки
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.КомплектацияНоменклатуры КАК КомплектацияНоменклатуры
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.КомплектацияНоменклатуры.Комплектующие КАК КомплектацияНоменклатурыКомплектующие
| ПО КомплектацияНоменклатуры.Ссылка = КомплектацияНоменклатурыКомплектующие.Ссылка
| ПО ТекущаяНоменклатураНеоднократнойСборки.Номенклатура = КомплектацияНоменклатуры.Номенклатура
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| КомплектацияНоменклатурыКомплектующие.Номенклатура
|ИЗ
| Документ.КомплектацияНоменклатуры КАК КомплектацияНоменклатуры
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.КомплектацияНоменклатуры.Комплектующие КАК КомплектацияНоменклатурыКомплектующие
| ПО КомплектацияНоменклатуры.Ссылка = КомплектацияНоменклатурыКомплектующие.Ссылка
|ГДЕ
| КомплектацияНоменклатуры.Номенклатура = &Номенклатура";
Показать
(8) Да, там могут быть другие ошибки, уже поздно, я потом проверю, но в этом отношении все верно.
Логика в том, что я в первом пакете собираю всю номенклатуру, у которой есть хотя бы один уровень вложенности. Он может быть третьим или десятым, неважно. А потом проверяю в выборке, попала ли туда одна из этих позиций.
Может быть есть более оптимальный путь, но я его пока не вижу.
Логика в том, что я в первом пакете собираю всю номенклатуру, у которой есть хотя бы один уровень вложенности. Он может быть третьим или десятым, неважно. А потом проверяю в выборке, попала ли туда одна из этих позиций.
Может быть есть более оптимальный путь, но я его пока не вижу.
(9)
Получили:
Child | Parent
н2 = н1
н3 = н2
н4 = н3
н5 = н2
Соединяем и выбираем по н1:
н1, н2, н3, н5.
Потеряли:
н4
Логика в том, что я в первом пакете собираю всю номенклатуру, у которой есть хотя бы один уровень вложенности. Он может быть третьим или десятым, неважно. А потом проверяю в выборке, попала ли туда одна из этих позиций.
Получили:
Child | Parent
н2 = н1
н3 = н2
н4 = н3
н5 = н2
Соединяем и выбираем по н1:
н1, н2, н3, н5.
Потеряли:
н4
Сформируем массив номенклатуры следующим образом (в общих чертах):
Цикл по ТЧ документа "Комплектация номенклатуры"
если номенклатура несборная, добавляем ее в массив
если номенклатура сборная, вызываем функцию, которая крутит цикл по элементам этой сборной номенклатуры и добавляет в массив несборную номенклатуру, а если встречается сборная, вызывает себя.
Цикл по ТЧ документа "Комплектация номенклатуры"
если номенклатура несборная, добавляем ее в массив
если номенклатура сборная, вызываем функцию, которая крутит цикл по элементам этой сборной номенклатуры и добавляет в массив несборную номенклатуру, а если встречается сборная, вызывает себя.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот