Как выбрать данные в зависимости от приоритета?
30.09.2010
15:18
#1
Здравствуйте!Подскажите,пожалуйста,как можно выбирать данные в зависимости от приоритета.Запросом из регистра сведений я получаю примерно след таблицу:
Продукция Этап Приоритет Очерёдность
Дверь Заготовка 1
Производство дверей Покраска 3 1
Заготовка 4 1
Изготвление 4 2
То есть выстраиваю в порядке приоритета в зависимости от продукции.Продукция может быть номенклатурой,родителем номенклатуры,номенклатурной группой или вообще ничего нет.Далее,я получаю данные из документа.И мне нужно,в зависимости от того,что есть в столбце продукция(сама номенклатура или родитель номенклатуры и т.д.) выбрать соответстующие этапы.И мне непонятно,как это можно сделать.Может у кого-нибудь есть похожий пример?
Продукция Этап Приоритет Очерёдность
Дверь Заготовка 1
Производство дверей Покраска 3 1
Заготовка 4 1
Изготвление 4 2
То есть выстраиваю в порядке приоритета в зависимости от продукции.Продукция может быть номенклатурой,родителем номенклатуры,номенклатурной группой или вообще ничего нет.Далее,я получаю данные из документа.И мне нужно,в зависимости от того,что есть в столбце продукция(сама номенклатура или родитель номенклатуры и т.д.) выбрать соответстующие этапы.И мне непонятно,как это можно сделать.Может у кого-нибудь есть похожий пример?
30.09.2010
15:25
#2
Напрашивается "Левое соединение", но конец описание какой-то путаный. Вот например искомая продукция Дверь и что должно получиться? Какие этапы ей соответствуют? По каким признакам определять, что этот этап нужен?
30.09.2010
15:36
#3
Допустим,в номенклатуре документа указана дверь.Тогда я смотрю в регистр сведений,в котором этапы изготовления двери выстроены по приоритету.То есть,если номенклатура Дверь есть в регистре тогда беру соответствующие этапы.Но её может там не быть.Может быть родитель этой номенклатуры,там уже другие этапы,беру их.Ещё вариант,что это не справочник Номенклатура,а справочник НоменклатурныеГруппы или же в регистре вообще ничего этого нет,тогда уже беру этапы соответствующие пустым полям,но это в последнюю очередь.Непонятно,как выбирать именно те этапы,которые нужны.
30.09.2010
15:38
#4
"Вот сам запрос к регистру сведений:
Запрос1=Новый Запрос;
Запрос1.Текст="ВЫБРАТЬ
| ЭтапыПроцессаОбработкиЗаказаНаПродукцию.Продукция,
| ЭтапыПроцессаОбработкиЗаказаНаПродукцию.Этап,
| ЭтапыПроцессаОбработкиЗаказаНаПродукцию.Очередность КАК Очередность,
| ВЫБОР
| КОГДА ЭтапыПроцессаОбработкиЗаказаНаПродукцию.Продукция ССЫЛКА Справочник.Номенклатура
| ТОГДА ВЫБОР
| КОГДА ЭтапыПроцессаОбработкиЗаказаНаПродукцию.Продукция.ЭтоГруппа
| ТОГДА 2
| ИНАЧЕ ВЫБОР
| КОГДА ЭтапыПроцессаОбработкиЗаказаНаПродукцию.Продукция = &ПустаяНоменклатура
| ТОГДА 4
| ИНАЧЕ 1
| КОНЕЦ
| КОНЕЦ
| ИНАЧЕ ВЫБОР
| КОГДА ЭтапыПроцессаОбработкиЗаказаНаПродукцию.Продукция ССЫЛКА Справочник.НоменклатурныеГруппы
| ТОГДА ВЫБОР
| КОГДА ЭтапыПроцессаОбработкиЗаказаНаПродукцию.Продукция = &ПустаяНоменклатурнаяГруппа
| ТОГДА 4
| ИНАЧЕ 3
| КОНЕЦ
| ИНАЧЕ 4
| КОНЕЦ
| КОНЕЦ КАК Приоритет
|ИЗ
| РегистрСведений.ЭтапыПроцессаОбработкиЗаказаНаПродукцию КАК ЭтапыПроцессаОбработкиЗаказаНаПродукцию
|УПОРЯДОЧИТЬ ПО
| Приоритет,
| Очередность";
"
Запрос1=Новый Запрос;
Запрос1.Текст="ВЫБРАТЬ
| ЭтапыПроцессаОбработкиЗаказаНаПродукцию.Продукция,
| ЭтапыПроцессаОбработкиЗаказаНаПродукцию.Этап,
| ЭтапыПроцессаОбработкиЗаказаНаПродукцию.Очередность КАК Очередность,
| ВЫБОР
| КОГДА ЭтапыПроцессаОбработкиЗаказаНаПродукцию.Продукция ССЫЛКА Справочник.Номенклатура
| ТОГДА ВЫБОР
| КОГДА ЭтапыПроцессаОбработкиЗаказаНаПродукцию.Продукция.ЭтоГруппа
| ТОГДА 2
| ИНАЧЕ ВЫБОР
| КОГДА ЭтапыПроцессаОбработкиЗаказаНаПродукцию.Продукция = &ПустаяНоменклатура
| ТОГДА 4
| ИНАЧЕ 1
| КОНЕЦ
| КОНЕЦ
| ИНАЧЕ ВЫБОР
| КОГДА ЭтапыПроцессаОбработкиЗаказаНаПродукцию.Продукция ССЫЛКА Справочник.НоменклатурныеГруппы
| ТОГДА ВЫБОР
| КОГДА ЭтапыПроцессаОбработкиЗаказаНаПродукцию.Продукция = &ПустаяНоменклатурнаяГруппа
| ТОГДА 4
| ИНАЧЕ 3
| КОНЕЦ
| ИНАЧЕ 4
| КОНЕЦ
| КОНЕЦ КАК Приоритет
|ИЗ
| РегистрСведений.ЭтапыПроцессаОбработкиЗаказаНаПродукцию КАК ЭтапыПроцессаОбработкиЗаказаНаПродукцию
|УПОРЯДОЧИТЬ ПО
| Приоритет,
| Очередность";
"
30.09.2010
17:12
#5
"Скажите все-таки, какой результат должен получиться, если искомая продукция Дверь, а вашим запросом вы получили таблицу 1-го поста? Если должна получиться только одна запись: "Дверь Заготовка 1", тогда поместите результат вашего запроса во внутреннюю таблицу, а следующим запросом выберите Минимум и сравняйте по нему:
Запрос1=Новый Запрос;
Запрос1.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос1.Текст="ВЫБРАТЬ
//Ваши поля (из того самого запроса)
|Поместить ВТТабл
|ИЗ
| РегистрСведений.ЭтапыПроцессаОбработкиЗаказаНаПродукцию КАК ЭтапыПроцессаОбработкиЗаказаНаПродукцию
|;
|Выбрать
| Этапы.Продукция,
| Этапы.Этап,
| Этапы.Очередность
|Из ВТТабл Как Этапы
|Где
| Этапы.Продукция В (&Продукция) И
| Этапы.Приоритет = (Выбрать Минимум (Приоритет) ИЗ ВТТабл Где Продукция В (&Продукция))
|Сгруппировать по
| Этапы.Продукция,
| Этапы.Этап,
| Этапы.Очередность
|";
МасПрод = Новый Массив;
МасПрод.Добавить (Дверь);
МасПрод.Добавить (Дверь.Родитель);
МасПрод.Добавить (ПустаяСсылка());
Запрос1.УстановитьПараметр ("Продукция", МасПрод);
Запрос1.Выполнить().Выгрузить().ВыбратьСтроку("""");
В общем попробуйте сначала на одном элементе используя консоль запросов. Когда получите нужный результат, тогда перейдете на склейку со строками документа."
Запрос1=Новый Запрос;
Запрос1.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос1.Текст="ВЫБРАТЬ
//Ваши поля (из того самого запроса)
|Поместить ВТТабл
|ИЗ
| РегистрСведений.ЭтапыПроцессаОбработкиЗаказаНаПродукцию КАК ЭтапыПроцессаОбработкиЗаказаНаПродукцию
|;
|Выбрать
| Этапы.Продукция,
| Этапы.Этап,
| Этапы.Очередность
|Из ВТТабл Как Этапы
|Где
| Этапы.Продукция В (&Продукция) И
| Этапы.Приоритет = (Выбрать Минимум (Приоритет) ИЗ ВТТабл Где Продукция В (&Продукция))
|Сгруппировать по
| Этапы.Продукция,
| Этапы.Этап,
| Этапы.Очередность
|";
МасПрод = Новый Массив;
МасПрод.Добавить (Дверь);
МасПрод.Добавить (Дверь.Родитель);
МасПрод.Добавить (ПустаяСсылка());
Запрос1.УстановитьПараметр ("Продукция", МасПрод);
Запрос1.Выполнить().Выгрузить().ВыбратьСтроку("""");
В общем попробуйте сначала на одном элементе используя консоль запросов. Когда получите нужный результат, тогда перейдете на склейку со строками документа."
30.09.2010
17:29
#6
В данном случае,так как Дверь есть в выборке из регистра,получается,что нужно выбрать этап Заготовка.
30.09.2010
17:49
#7
Вы не подскажете,почему если поставить в моём запросе минимум перед кострукцией с выбором,в резельтате не будут отбираться записи с минимальным приоритетом?
30.09.2010
18:00
#8
"Тогда запрос должен сработать.
А с документом примерно так должно получиться (сокращенно):
Выбрать Номенклатура Как Ном
Поместить ВТНом
из Документ
Где Ссылка = &Ссылка;
//Тут ваш запрос
Выбрать ...
Поместить ВТЭтапы ....
;
Выбрать //Склеиваем Продукцию из документа с Этапами - таблица сильно вырастет
Ном, Этапы.*
Поместить ВТНомЭт
Из ВТНом
Левое Соединение ВТЭтапы как Этапы
По Ном = Этапы.Продукция ИЛИ Ном.Родитель = Этапы.Продукция ИЛИ Этапы.Продукция = &ПустаяСсылка
;
Выбрать //НАходим минимальный приоритет по каждой Продукции из документа
Ном, Минимум (Приоритет) Как Приоритет
Поместить ВТМинПриор
Из ВТНомЭт
СГРуппировать по Ном
;
Выбрать //Наконец выбираем из склейки только то что нам надо
Этапы.*
Из ВТМинПриор как МинПриор
Левое соединение ВТНОмЭт Как Этапы
По МинПриор.Ном = Этапы.Ном И МинПриор.Приоритет = Этапы.Приоритет
Что-то типа того - экспериментируйте."
А с документом примерно так должно получиться (сокращенно):
Выбрать Номенклатура Как Ном
Поместить ВТНом
из Документ
Где Ссылка = &Ссылка;
//Тут ваш запрос
Выбрать ...
Поместить ВТЭтапы ....
;
Выбрать //Склеиваем Продукцию из документа с Этапами - таблица сильно вырастет
Ном, Этапы.*
Поместить ВТНомЭт
Из ВТНом
Левое Соединение ВТЭтапы как Этапы
По Ном = Этапы.Продукция ИЛИ Ном.Родитель = Этапы.Продукция ИЛИ Этапы.Продукция = &ПустаяСсылка
;
Выбрать //НАходим минимальный приоритет по каждой Продукции из документа
Ном, Минимум (Приоритет) Как Приоритет
Поместить ВТМинПриор
Из ВТНомЭт
СГРуппировать по Ном
;
Выбрать //Наконец выбираем из склейки только то что нам надо
Этапы.*
Из ВТМинПриор как МинПриор
Левое соединение ВТНОмЭт Как Этапы
По МинПриор.Ном = Этапы.Ном И МинПриор.Приоритет = Этапы.Приоритет
Что-то типа того - экспериментируйте."
Выбор конфигурации- возможность работы со штрих-кодомУчет затрат и платежей через посредников в УТ 10.3
Читают тему
(гостей: 1)