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

Новая тема
Показывать по 10 20 40 сообщений
Здравствуйте!Подскажите,пожалуйста,как можно выбирать данные в зависимости от приоритета.Запросом из регистра сведений я получаю примерно след таблицу:
Продукция Этап Приоритет Очерёдность
Дверь Заготовка 1
Производство дверей Покраска 3 1
Заготовка 4 1
Изготвление 4 2
То есть выстраиваю в порядке приоритета в зависимости от продукции.Продукция может быть номенклатурой,родителем номенклатуры,номенклатурной группой или вообще ничего нет.Далее,я получаю данные из документа.И мне нужно,в зависимости от того,что есть в столбце продукция(сама номенклатура или родитель номенклатуры и т.д.) выбрать соответстующие этапы.И мне непонятно,как это можно сделать.Может у кого-нибудь есть похожий пример?

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

В общем попробуйте сначала на одном элементе используя консоль запросов. Когда получите нужный результат, тогда перейдете на склейку со строками документа."
В данном случае,так как Дверь есть в выборке из регистра,получается,что нужно выбрать этап Заготовка.
Вы не подскажете,почему если поставить в моём запросе минимум перед кострукцией с выбором,в резельтате не будут отбираться записи с минимальным приоритетом?
"Тогда запрос должен сработать.
А с документом примерно так должно получиться (сокращенно):
Выбрать Номенклатура Как Ном
Поместить ВТНом
из Документ
Где Ссылка = &Ссылка;
//Тут ваш запрос
Выбрать ...
Поместить ВТЭтапы ....
;
Выбрать //Склеиваем Продукцию из документа с Этапами - таблица сильно вырастет
 Ном, Этапы.*
Поместить ВТНомЭт
Из ВТНом
Левое Соединение ВТЭтапы как Этапы
 По Ном = Этапы.Продукция ИЛИ Ном.Родитель = Этапы.Продукция ИЛИ Этапы.Продукция = &ПустаяСсылка
;
Выбрать //НАходим минимальный приоритет по каждой Продукции из документа
 Ном, Минимум (Приоритет) Как Приоритет
Поместить ВТМинПриор
Из ВТНомЭт
СГРуппировать по Ном
;
Выбрать  //Наконец выбираем из склейки только то что нам надо
 Этапы.*
Из ВТМинПриор как МинПриор
Левое соединение ВТНОмЭт Как Этапы
 По МинПриор.Ном = Этапы.Ном И МинПриор.Приоритет = Этапы.Приоритет


Что-то типа того - экспериментируйте."
Если бы у вас была таблица типа:
Дверь Заготовка 1 1
Дверь Заготовка 3 2

Тогда Минимум дал бы результат:
Дверь Заготовка 1 1

Минимум ищется только среди равных по группировке полей.
А в запросе можно как-нибудь рекурсивно вычислить всех родителей номенклатуры документа?
Читают тему
(гостей: 1)

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