|
Как получить последнюю партию в запросе | ☑ | ||
---|---|---|---|---|
0
UncleVader
20.02.12
✎
13:39
|
Помогите пож. с запросом - надо получить список товаров с данными о последнем поступлении. Т.е. выборку делаем по регистру партий, обращаемся к виртуальной таблице остатков и левым соединением надо каким-то образом прицепить по одному крайнему документу-партии.
|
|||
1
zak555
20.02.12
✎
13:40
|
конфа ?
|
|||
2
n koretsky
20.02.12
✎
13:42
|
сортировка по убыванию и получение первого значения выборки, имеешь в виду?
|
|||
3
UncleVader
20.02.12
✎
13:44
|
да, сорь. Конфа самописная, структура регистра партий:
Измерения: Фирма(Справочник.Фирмы) Склад(Справочник.МесиаХранения) Товар(Справочник.Номенклатура) Партия(Документ) Ресурсы: Количество Сумма |
|||
4
UncleVader
20.02.12
✎
13:44
|
(2) ага
|
|||
5
mikecool
20.02.12
✎
13:44
|
(3) если есть партия в измерениях - то что сложного? срез последних взять?
|
|||
6
n koretsky
20.02.12
✎
13:46
|
(4) вопрос исчерпан, получается?
|
|||
7
UncleVader
20.02.12
✎
13:49
|
да, спасибо попробую, про него как-то и не подумал совсем...
|
|||
8
UncleVader
20.02.12
✎
15:11
|
(5) не канает - разве бывает срез последних для регистра накопления?
тут как-то по-другому надо |
|||
9
pumbaEO
20.02.12
✎
15:26
|
Поступлении откуда? От поставщика или же в результате инвентаризации?
|
|||
10
UncleVader
20.02.12
✎
15:26
|
(9) не важно, по дате документа
|
|||
11
Ненавижу 1С
гуру
20.02.12
✎
15:26
|
(8) ну взять остатки в разрезе партий, взять последнюю
|
|||
12
mikecool
20.02.12
✎
15:27
|
(8) будь мужиком, возьми остатки, ....
|
|||
13
UncleVader
20.02.12
✎
15:30
|
(11) как это одним запросом выкрутить?
щаз вот пробую так, но не уверен что это правильно ВЫБРАТЬ ПартииТоваровОстаткиИОбороты.Товар КАК Товар, ПартииТоваровПоследнийПриход.ПрихДокумент, СУММА(ПартииТоваровОстаткиИОбороты.СтоимостьНачальныйОстаток) КАК СтоимостьНачальныйОстаток, СУММА(ПартииТоваровОстаткиИОбороты.СтоимостьКонечныйОстаток) КАК СтоимостьКонечныйОстаток ИЗ РегистрНакопления.ПартииТоваров.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, , , ) КАК ПартииТоваровОстаткиИОбороты ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ МАКСИМУМ(ПартииТоваровПоследнийПриход.ПрихДокумент) КАК ПрихДокумент, ПартииТоваровПоследнийПриход.Товар КАК Товар ИЗ РегистрНакопления.ПартииТоваров.Обороты(, , , ) КАК ПартииТоваровПоследнийПриход СГРУППИРОВАТЬ ПО ПартииТоваровПоследнийПриход.Товар) КАК ПартииТоваровПоследнийПриход ПО ПартииТоваровОстаткиИОбороты.Товар = ПартииТоваровПоследнийПриход.Товар СГРУППИРОВАТЬ ПО ПартииТоваровОстаткиИОбороты.Товар, ПартииТоваровПоследнийПриход.ПрихДокумент ИТОГИ ПО Товар |
|||
14
mikecool
20.02.12
✎
15:31
|
МАКСИМУМ(ПартииТоваровПоследнийПриход.ПрихДокумент) КАК ПрихДокумент не проканает
или по дате или моменту времени |
|||
15
UncleVader
20.02.12
✎
15:34
|
(14) ошибку не выдает и по единичым проверочным точкам выдал те документы что надо...
а что ты имеешь в виду "не проканает"? на уровне выборки данных будут сравниваться текстовые представления идентификаторов документов? |
|||
16
AnnaASP
20.02.12
✎
15:35
|
Соедени с подобной таблицей:
ВЫБРАТЬ ПЕРВЫЕ 1 Номенклатура, Документ ИЗ РегистрНакопления.*** КАК *** ГДЕ ***.ВидДвижения = &ВидДвижения (Приход) УПОРЯДОЧИТЬ ПО ***.Период УБЫВ |
|||
17
UncleVader
20.02.12
✎
15:37
|
(16) пробовал - при выборке из этой таблицы выбирается ровно одна строка, которая, если повезет, соединится с одной строкой верхней выборки
|
|||
18
Ненавижу 1С
гуру
20.02.12
✎
15:37
|
кстати попутный вопрос - а зачем тебе последняя партия?
|
|||
19
UncleVader
20.02.12
✎
15:39
|
(18) отчет называется "Анализ неликвидных товаров", который должен показать список товаров, которые не продаются в течении заданного периода. И одно из полей это когда он был последний раз куплен
|
|||
20
mikecool
20.02.12
✎
15:42
|
выбрать ...,
Приходы.ДокПоступления Из Продажи Левое соединение ( выбрать Номенклатура, ДокПоступления из партии.Остатки) По Номенклатура не оно? |
|||
21
Ненавижу 1С
гуру
20.02.12
✎
15:45
|
(19) когда, для этого достаточно даты
ВЫБРАТЬ ПартииТоваровОстатки.Товар КАК Товар, МАКСИМУМ(ПартииТоваровОстатки.ПрихДокумент.Дата), СУММА(ПартииТоваровОстатки.СтоимостьНачальныйОстаток) КАК СтоимостьНачальныйОстаток, СУММА(ПартииТоваровОстатки.СтоимостьКонечныйОстаток) КАК СтоимостьКонечныйОстаток ИЗ РегистрНакопления.ПартииТоваров.Остатки(&КонецПериода) КАК ПартииТоваровОстатки сгруппировать по ПартииТоваровОстатки.Товар |
|||
22
UncleVader
20.02.12
✎
15:49
|
(20) не совсем, мне же нужна запись с одним товаром, его остатках на начало и конец какого-то периода и ссылкой на последний документ прихода, при этом! не факт что этот документ лежит в рамках заданного периода. Например мы анализируем 2001 год, получаем в результате что гайка лежала на начало 2011 года на складе, за весь год ни разу не продалась, а нерадивый менеджер умудрился в январе 2012 ее еще раз купить.
(21) и в этом случае надо знать не просто дату, но и сам документ - вдруг он еще чего ненужного купил... |
|||
23
DexterMorgan
20.02.12
✎
15:53
|
(19) как определяешь, что товар не продавался?
|
|||
24
Ненавижу 1С
гуру
20.02.12
✎
15:54
|
(22) тогда взять максимум по дате, потом из этого по ссылке, вот и документ
|
|||
25
UncleVader
20.02.12
✎
15:58
|
(23) проверяю по условию НачОст<>0 И ОстатокТовараРасход=0
(24) да, я так и думал, да вот с синтаксической конструкцией запутался - никак ниасилю :) |
|||
26
UncleVader
20.02.12
✎
16:00
|
(23) но это грубо, в идеале надо сравнивать не абсолютный ноль, а относительный. Другими словами, если на складе лежит 1500 шайбочек и одна из них продалась все-равно это труп
|
|||
27
DexterMorgan
20.02.12
✎
16:09
|
(25) Перемещение не может быть расходом? Или при перемещении он считается ликвидным?
|
|||
28
UncleVader
20.02.12
✎
16:09
|
(27) нет, перемещение не расход - расходы я отбираю по коду операции расхода
|
|||
29
Ненавижу 1С
гуру
20.02.12
✎
16:14
|
ВЫБРАТЬ Т.Товар, Т.СтоимостьНачальныйОстаток, Т.СтоимостьКонечныйОстаток,
МАКСИМУМ(Т2.ПрихДокумент) КАК ПрихДокумент ИЗ (ВЫБРАТЬ ПартииТоваровОстатки.Товар КАК Товар, МАКСИМУМ(ПартииТоваровОстатки.ПрихДокумент.Дата) КАК Дата, СУММА(ПартииТоваровОстатки.СтоимостьНачальныйОстаток) КАК СтоимостьНачальныйОстаток, СУММА(ПартииТоваровОстатки.СтоимостьКонечныйОстаток) КАК СтоимостьКонечныйОстаток ИЗ РегистрНакопления.ПартииТоваров.Остатки(&КонецПериода) КАК ПартииТоваровОстатки сгруппировать по ПартииТоваровОстатки.Товар) КАК Т внутреннее соединение РегистрНакопления.ПартииТоваров.Остатки(&КонецПериода) КАК Т2 по (Т1.Товар = Т2.Товар и Т1.Дата=Т2.ПрихДокумент.Дата) сгруппировать по Т.Товар, Т.СтоимостьНачальныйОстаток, Т.СтоимостьКонечныйОстаток |
|||
30
DexterMorgan
20.02.12
✎
16:15
|
(28) не понял..=) я имею ввиду что ты по регистру ПартииТоваров определяешь был ли факт продажи, я пока не могу понять как это можно сделать не спускаясь до регистратора, потому что движение расход могут делать другие документы помимо реализации - перемещение, списание и т.д.
|
|||
31
DexterMorgan
20.02.12
✎
16:17
|
(28) Я пока вижу два варианта: 1. Отслеживать факт продажи по РН "Продажи" (ну или как у тебя называется) получать там список номенклатуры и ставить условие Номенклатура НЕ В..
2. Отслеживать по таблице ОСтаткиИОбороты ПартийТоваров с детализацией до регистратора... |
|||
32
mikecool
20.02.12
✎
16:20
|
(31) это один вариант
партии - продажи = висяки |
|||
33
DexterMorgan
20.02.12
✎
16:24
|
(32) 2 вариант явно накладывать условие на регистратор. в 1 варианте детализация до регистратора не нужна
|
|||
34
UncleVader
20.02.12
✎
16:25
|
(31) я это делаю вот так
СУММА(ВЫБОР КОГДА ПартииТоваров.КодОперации = ЗНАЧЕНИЕ(Справочник.КодыОпераций.ПродажаТовара) ИЛИ ПартииТоваров.КодОперации = ЗНАЧЕНИЕ(Справочник.КодыОпераций.ПродажаОтсутствующего) ТОГДА ПартииТоваровОстаткиИОбороты.ОстатокТовараРасход ИНАЧЕ 0 КОНЕЦ) КАК ОстатокТовараРасход |
|||
35
UncleVader
20.02.12
✎
16:26
|
(29) а чем по сути это отличается от моего варианта (13)?
|
|||
36
DexterMorgan
20.02.12
✎
16:27
|
(34) Ну я не знал что у тебя там измерение код операции =))
|
|||
37
UncleVader
20.02.12
✎
16:27
|
(36) это не измерение, а реквизит ;)
|
|||
38
DexterMorgan
20.02.12
✎
16:27
|
В типовых такого нету..
|
|||
39
UncleVader
20.02.12
✎
16:28
|
(39) точно
|
|||
40
DexterMorgan
20.02.12
✎
16:30
|
(39) Ты из реальной таблицы что ле выбираешь тада?
|
|||
41
Ненавижу 1С
гуру
20.02.12
✎
16:31
|
(35) там другие таблицы
|
|||
42
UncleVader
20.02.12
✎
17:04
|
(40) да, делаю левое соединение с сырой таблицей
(41) спасибо, наверное так действительно будет оптимальнее, сомнения были только в этом МАКСИМУМ(Т2.ПрихДокумент) КАК ПрихДокумент |
|||
43
Киборг
20.02.12
✎
17:19
|
Если нужен запрос, который должен сразу выдать нужные данные, то одним регистром накопления не обойтись, так как вроде бы (не знаю способа как можно) нельзя вытащить последний документ, если два последних лежат в одной секунде.
Возможные выходы - или вести регистр сведений типа "партии прихода" (и получать последний из него срезом последних, вариант вполне нормальный, регистры в частности нужны и для получения нужных данных для отчетов), - или получать все последние документы и отсекать лишние (программно), если их несколько в одной секунде, - или выдавать в отчете все последние документы в одной секунде (случай редкий, если показать как он будет выглядеть, то могут и согласится принять такой вариант) |
|||
44
Киборг
20.02.12
✎
17:28
|
есть еще вариант динамического соединения со строкой вложенного запроса,
типа ВЫБРАТЬ ОстаткиОсн.Ном, ОстаткиОсн.Партия ИЗ Остатки КАК ОстаткиОсн ГДЕ ОстаткиОсн.Партия В ( ВЫБРАТЬ ПЕРВЫЕ 1 ОстаткиДоп.Партия ИЗ Остатки КАК ОстаткиДоп ГДЕ ОстаткиОсн.Ном = ОстаткиДоп.Ном Упорядочить ПО ОстаткиДоп.Партия.Дата УБЫВ) этот вариант может долго работать на больших выборках, если на твоих объемах будет приемлемое время, то можно и так |
|||
45
Киборг
20.02.12
✎
17:41
|
Кстати, если долго работает, то можно усложнить, посчитав для каких товаров существует несколько последних документов в одной секунде и выполнить динамическое связывание только для тех, у которых их больше одного.
Хотя, для такой задачи наверно достаточно и МАКСИМУМ(Т2.ПрихДокумент) :) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |