Как выбрать данные в зависимости от приоритета?

Новая тема
Показывать по сообщений
Здравствуйте!Подскажите,пожалуйста,как можно выбирать данные в зависимости от приоритета.Запросом из регистра сведений я получаю примерно след таблицу: <br>Продукция Этап Приоритет Очерёдность <br>Дверь Заготовка 1 <br>Производство дверей Покраска 3 1 <br>Заготовка 4 1 <br>Изготвление 4 2 <br>То есть выстраиваю в порядке приоритета в зависимости от продукции.Продукция может быть номенклатурой,родителем номенклатуры,номенклатурной группой или вообще ничего нет.Далее,я получаю данные из документа.И мне нужно,в зависимости от того,что есть в столбце продукция(сама номенклатура или родитель номенклатуры и т.д.) выбрать соответстующие этапы.И мне непонятно,как это можно сделать.Может у кого-нибудь есть похожий пример? <br><br>
Напрашивается "Левое соединение", но конец описание какой-то путаный. Вот например искомая продукция Дверь и что должно получиться? Какие этапы ей соответствуют? По каким признакам определять, что этот этап нужен?
Допустим,в номенклатуре документа указана дверь.Тогда я смотрю в регистр сведений,в котором этапы изготовления двери выстроены по приоритету.То есть,если номенклатура Дверь есть в регистре тогда беру соответствующие этапы.Но её может там не быть.Может быть родитель этой номенклатуры,там уже другие этапы,беру их.Ещё вариант,что это не справочник Номенклатура,а справочник НоменклатурныеГруппы или же в регистре вообще ничего этого нет,тогда уже беру этапы соответствующие пустым полям,но это в последнюю очередь.Непонятно,как выбирать именно те этапы,которые нужны.
"Вот сам запрос к регистру сведений:<br>Запрос1=Новый Запрос;<br> Запрос1.Текст="ВЫБРАТЬ<br>              | ЭтапыПроцессаОбработкиЗаказаНаПродукцию.Продукция,<br>              | ЭтапыПроцессаОбработкиЗаказаНаПродукцию.Этап,<br>              | ЭтапыПроцессаОбработкиЗаказаНаПродукцию.Очередность КАК Очередность,<br>              | ВЫБОР<br>              | КОГДА ЭтапыПроцессаОбработкиЗаказаНаПродукцию.Продукция ССЫЛКА Справочник.Номенклатура<br>              | ТОГДА ВЫБОР<br>              | КОГДА ЭтапыПроцессаОбработкиЗаказаНаПродукцию.Продукция.ЭтоГруппа<br>              | ТОГДА 2<br>              | ИНАЧЕ ВЫБОР<br>              | КОГДА ЭтапыПроцессаОбработкиЗаказаНаПродукцию.Продукция = &ПустаяНоменклатура<br>              | ТОГДА 4<br>              | ИНАЧЕ 1<br>              | КОНЕЦ<br>              | КОНЕЦ<br>              | ИНАЧЕ ВЫБОР<br>              | КОГДА ЭтапыПроцессаОбработкиЗаказаНаПродукцию.Продукция ССЫЛКА Справочник.НоменклатурныеГруппы<br>              | ТОГДА ВЫБОР<br>              | КОГДА ЭтапыПроцессаОбработкиЗаказаНаПродукцию.Продукция = &ПустаяНоменклатурнаяГруппа<br>              | ТОГДА 4<br>              | ИНАЧЕ 3<br>              | КОНЕЦ<br>              | ИНАЧЕ 4<br>              | КОНЕЦ<br>              | КОНЕЦ КАК Приоритет<br>           <br>              |ИЗ<br>              | РегистрСведений.ЭтапыПроцессаОбработкиЗаказаНаПродукцию КАК ЭтапыПроцессаОбработкиЗаказаНаПродукцию<br>              |УПОРЯДОЧИТЬ ПО<br>              | Приоритет,<br>              | Очередность";<br>"
"Скажите все-таки, какой результат должен получиться, если искомая продукция Дверь, а вашим запросом вы получили таблицу 1-го поста? Если должна получиться только одна запись: "Дверь Заготовка 1", тогда поместите результат вашего запроса во внутреннюю таблицу, а следующим запросом выберите Минимум и сравняйте по нему:<br>Запрос1=Новый Запрос;<br>Запрос1.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;<br>Запрос1.Текст="ВЫБРАТЬ<br>//Ваши поля (из того самого запроса)<br>|Поместить ВТТабл<br>|ИЗ<br>| РегистрСведений.ЭтапыПроцессаОбработкиЗаказаНаПродукцию КАК ЭтапыПроцессаОбработкиЗаказаНаПродукцию<br>|;<br>|Выбрать<br>|  Этапы.Продукция,<br>|  Этапы.Этап,<br>|  Этапы.Очередность<br>|Из ВТТабл Как Этапы<br>|Где<br>|  Этапы.Продукция В (&Продукция) И <br>|  Этапы.Приоритет = (Выбрать Минимум (Приоритет) ИЗ ВТТабл Где Продукция В (&Продукция))<br>|Сгруппировать по<br>|  Этапы.Продукция,<br>|  Этапы.Этап,<br>|  Этапы.Очередность<br>|";<br>МасПрод = Новый Массив;<br>МасПрод.Добавить (Дверь);<br>МасПрод.Добавить (Дверь.Родитель);<br>МасПрод.Добавить (ПустаяСсылка());<br>Запрос1.УстановитьПараметр ("Продукция", МасПрод);<br>Запрос1.Выполнить().Выгрузить().ВыбратьСтроку("""");<br><br>В общем попробуйте сначала на одном элементе используя консоль запросов. Когда получите нужный результат, тогда перейдете на склейку со строками документа."
В данном случае,так как Дверь есть в выборке из регистра,получается,что нужно выбрать этап Заготовка.
Вы не подскажете,почему если поставить в моём запросе минимум перед кострукцией с выбором,в резельтате не будут отбираться записи с минимальным приоритетом?
"Тогда запрос должен сработать.<br>А с документом примерно так должно получиться (сокращенно):<br>Выбрать Номенклатура Как Ном <br>Поместить ВТНом <br>из Документ <br>Где Ссылка = &Ссылка;<br>//Тут ваш запрос <br>Выбрать ...<br>Поместить ВТЭтапы ....<br>;<br>Выбрать //Склеиваем Продукцию из документа с Этапами - таблица сильно вырастет<br>  Ном, Этапы.*<br>Поместить ВТНомЭт<br>Из ВТНом<br>Левое Соединение ВТЭтапы как Этапы<br>  По Ном = Этапы.Продукция ИЛИ Ном.Родитель = Этапы.Продукция ИЛИ Этапы.Продукция = &ПустаяСсылка<br>;<br>Выбрать //НАходим минимальный приоритет по каждой Продукции из документа<br>  Ном, Минимум (Приоритет) Как Приоритет<br>Поместить ВТМинПриор<br>Из ВТНомЭт<br>СГРуппировать по Ном<br> ;<br>Выбрать  //Наконец выбираем из склейки только то что нам надо<br>  Этапы.*<br>Из ВТМинПриор как МинПриор<br>Левое соединение ВТНОмЭт Как Этапы<br>  По МинПриор.Ном = Этапы.Ном И МинПриор.Приоритет = Этапы.Приоритет<br><br><br>Что-то типа того - экспериментируйте."
Если бы у вас была таблица типа:<br>Дверь Заготовка 1 1<br>Дверь Заготовка 3 2<br><br>Тогда Минимум дал бы результат:<br>Дверь Заготовка 1 1<br><br>Минимум ищется только среди равных по группировке полей.
А в запросе можно как-нибудь рекурсивно вычислить всех родителей номенклатуры документа?
Читают тему
(гостей: 1)

Быстрый переход