Имя: Пароль:
1C
1С v8
Помогите с запросом
0 Jackman
 
11.10.11
16:33
Вот кусок запроса, целью которого является вывод оборота по продажам и остатку заказов поставщику. Интересует первая запись по каждому товару в регистре заказы поставщику, но не получается ее получить.


       | ВЫБРАТЬ
   |ПродажиСебестоимость1Обороты4.Номенклатура как Номеклатура,
   |Null как ДатаПоступления,
   |ПродажиСебестоимость1Обороты4.КоличествоОборот как Колво,
   |ПродажиСебестоимость1Обороты4.пСуммаUAHОборот как Сумма,
   |0 как НаЗаказе
   |ИЗ
   |РегистрНакопления.ПродажиСебестоимость1.Обороты(&НачМес4,&КонМес4,,(Номенклатура в Иерархии (&ВыбТовар))и Контрагент в Иерархии (&Контрагент) ) КАК ПродажиСебестоимость1Обороты4
   
   |ОБЪЕДИНИТЬ ВСЕ

       | ВЫБРАТЬ  
   |ЗаказыПоставщикамОстатки.Номенклатура,
   |ЗаказыПоставщикамОстатки.ЗаказПоставщику.ДатаПоступления,
   |0,
   |0,
   |ЗаказыПоставщикамОстатки.КоличествоОстаток
   |ИЗ
   |    РегистрНакопления.ЗаказыПоставщикам.Остатки(&КонМес, Номенклатура В ИЕРАРХИИ (&ВыбТовар)) КАК ЗаказыПоставщикамОстатки

1 Jackman
 
11.10.11
16:34
Выбрать первые 1 дают выбор только первой записи по одному товару, а мне нужно по каждому
2 trambalda
 
11.10.11
16:44
А что дает информация о первой записи по каждому товару из заказов? Смысл какой? Я что-то под вечер не догоняю уже.
3 Jackman
 
11.10.11
16:48
(2)Это кусок запроса. В полной версии выводится информация по реализации, остаткам, резерву товара, а также ближайшую дату и кол-во прихода товара. Нас штрафуют магазины, если у нас нет заказываемого товара, но мы может заблаговременно "закрывать" отдельные позиции для заказа. Для принятия решения нужно знать объем продаж, остатки, а также время и объем ближайшего поступления товара.
4 Jackman
 
11.10.11
16:51
Хотя кореектнее как-то получать запись в регистре с наиболее ранеей датой
|ЗаказыПоставщикамОстатки.ЗаказПоставщику.ДатаПоступления
5 Jackman
 
11.10.11
17:23
Апну
6 wade25
 
11.10.11
17:24
Выбрать первые 1?
7 ssh2006
 
11.10.11
17:26
(1) прими волевое решение - запрос в цикле
8 Jackman
 
11.10.11
17:27
(6) Тогда выводит первую запись по первому товару в списке
9 Jackman
 
11.10.11
17:27
(7) Только не это :)
10 DrHiHi
 
11.10.11
17:43
не догнал....
| ВЫБРАТЬ  
   |ЗаказыПоставщикамОстатки.Номенклатура,
   |ЗаказыПоставщикамОстатки.ЗаказПоставщику.ДатаПоступления,
   |0,
   |0,
   |ЗаказыПоставщикамОстатки.КоличествоОстаток
   |ИЗ
   |    РегистрНакопления.ЗаказыПоставщикам.Остатки(&КонМес, Номенклатура В ИЕРАРХИИ (&ВыбТовар)) КАК ЗаказыПоставщикамОстатки

в любом случае вернет одну строку по документу
11 mzelensky
 
11.10.11
17:46
(10) +++ согласен.

(0) либо мы не догоняем чего ты хочешь
12 Jackman
 
11.10.11
18:02
(10) и (11) По одной строке на каждый документ, а мне нужно только первый документ, чтобы знать сколько приедет в первом заказе. Т.е. в запрос попадают все записи в регистре ЗаказыПоставщикам по данному товару, а мне нужна только одна запись по каждому товару, хотя по итогам регистра может висеть 5 незыкрытых заказов поставщику.

Хочу видеть:
Номенклатура-Колво реализ.-Сумма реализ-Заказ-Дата ближ. прихода
Яблоки - 10шт - 500грн - 200 шт - 01/12/2011
13 Jackman
 
11.10.11
18:03
а получается:

Номенклатура-Колво реализ.-Сумма реализ-Заказ-Дата ближ. прихода
Яблоки - 10шт - 500грн - 200 шт - 01/12/2011
Яблоки - 0 - 0 - 100шт - 10/12/2011
Яблоки - 0 - 0 - 800шт - 28/12/2011
14 DrHiHi
 
11.10.11
18:12
щас напишу
15 DrHiHi
 
11.10.11
18:20
держи ;))0

ВЫБРАТЬ
   ЗаказыПоставщикамОстатки.Номенклатура,
   ЗаказыПоставщикамОстатки.ЗаказПоставщику.ДатаПоступления,
   0 КАК Поле1,
   0 КАК Поле2,
   ЗаказыПоставщикамОстатки.КоличествоОстаток
ИЗ
   РегистрНакопления.ЗаказыПоставщикам.Остатки(&КонМес, Номенклатура В ИЕРАРХИИ (&ВыбТовар)) КАК ЗаказыПоставщикамОстатки
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           ЗаказыПоставщикамОстатки.Номенклатура КАК Номенклатура,
           МИНИМУМ(ЗаказыПоставщикамОстатки.ЗаказПоставщику) КАК ЗаказПоставщику
       ИЗ
           РегистрНакопления.ЗаказыПоставщикам.Остатки(&КонМес, Номенклатура В ИЕРАРХИИ (&ВыбТовар)) КАК ЗаказыПоставщикамОстатки
       
       СГРУППИРОВАТЬ ПО
           ЗаказыПоставщикамОстатки.Номенклатура) КАК ВложенныйЗапрос
       ПО (ВложенныйЗапрос.ЗаказПоставщику = ЗаказыПоставщикамОстатки.ЗаказПоставщику)
           И (ВложенныйЗапрос.Номенклатура = ЗаказыПоставщикамОстатки.Номенклатура)
16 Jackman
 
11.10.11
18:33
Спасибо, ща попробую :)
17 ssh2006
 
11.10.11
18:48
Подобное обсуждалось многократно на форуме. (15) не лучший вариант
18 Jackman
 
11.10.11
18:48
Спасибо, работает, но, чего-то, подтягивает не самый ранний заказ.
Например, по товару есть такие заказы:

Заказ    СрокПоставки    Остаток
Заказ поставщику 00000001729 от 19.01.2011    29.09.2011    2200,000
Заказ поставщику 00000002206 от 07.09.2011    17.02.2012    2500,000


а отчет возвращает 17.02.2012    2500,000
19 DrHiHi
 
11.10.11
18:55
(17) а какой наилучший??
(18) может быть заказ закрыт... или вместо "МИНИМУМ(ЗаказыПоставщикамОстатки.ЗаказПоставщику)" написал "МАКСИМУМ(ЗаказыПоставщикамОстатки.ЗаказПоставщику)"
20 Jackman
 
11.10.11
19:06
(19) Нет, проверил на нескольких товарах, что-то не так. Написал МИНИМУМ, проверяю через консоль.
21 DrHiHi
 
11.10.11
19:11
(20) покажи, что у тебя написано
22 Jackman
 
11.10.11
19:16

ВЫБРАТЬ
ЗаказыПоставщикамОстатки.Номенклатура,
ЗаказыПоставщикамОстатки.ЗаказПоставщику.ДатаПоступления,
ЗаказыПоставщикамОстатки.КоличествоОстаток
ИЗ
РегистрНакопления.ЗаказыПоставщикам.Остатки(&КонМес, Номенклатура В ИЕРАРХИИ (&ВыбТовар)) КАК ЗаказыПоставщикамОстатки
ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
ЗаказыПоставщикамОстатки.Номенклатура КАК Номенклатура,
МИНИМУМ(ЗаказыПоставщикамОстатки.ЗаказПоставщику) КАК ЗаказПоставщику
ИЗ
РегистрНакопления.ЗаказыПоставщикам.Остатки(&КонМес, Номенклатура В ИЕРАРХИИ (&ВыбТовар)) КАК ЗаказыПоставщикамОстатки

СГРУППИРОВАТЬ ПО
ЗаказыПоставщикамОстатки.Номенклатура) КАК ВложенныйЗапрос
ПО (ВложенныйЗапрос.ЗаказПоставщику = ЗаказыПоставщикамОстатки.ЗаказПоставщику)
И (ВложенныйЗапрос.Номенклатура = ЗаказыПоставщикамОстатки.Номенклатура)
)
23 Jackman
 
11.10.11
19:19
Мыльница        
Заказ поставщику 00000002108 от 18.07.2011    15.12.2011    1200,000
Заказ поставщику 00000002196 от 05.09.2011    23.03.2012    1200,000

отчет выводит нижнюю строку:
23.03.2012    1200,000
24 Jackman
 
11.10.11
19:21
Непонятно, что он считает минимум для поля, типа Документ.ЗаказПоставщику
25 ssh2006
 
11.10.11
19:23
Максимум(ссылка) не даст тебе последний документ. Если будет актуально, позже напишу запрос
26 ssh2006
 
11.10.11
19:24
Ну или минимум первый.
27 DrHiHi
 
11.10.11
19:25
просмотри правильно ли выводит:

ВЫБРАТЬ
ЗаказыПоставщикамОстатки.Номенклатура КАК Номенклатура,
МИНИМУМ(ЗаказыПоставщикамОстатки.ЗаказПоставщику) КАК ЗаказПоставщику
ИЗ
РегистрНакопления.ЗаказыПоставщикам.Остатки(&КонМес, Номенклатура В ИЕРАРХИИ (&ВыбТовар)) КАК ЗаказыПоставщикамОстатки

СГРУППИРОВАТЬ ПО
ЗаказыПоставщикамОстатки.Номенклатура

по какой-то номенклатуры,
просмотри без группировки, что выводит
(24) попробуй использовать Документ.ЗаказПоставщику.МоментВремени
28 DrHiHi
 
11.10.11
19:41
можно попробовать по дате, но могут быть документы с одинаковыми датами
29 Jackman
 
11.10.11
19:46
Заказ поставщику 00000002196 от 05.09.2011 18:01:07
30 ssh2006
 
11.10.11
19:46
(28) Для таких и применить  минимум(ссылка). Тут уже как повезет
31 Jackman
 
11.10.11
19:47
МИНИМУМ(ЗаказыПоставщикамОстатки.ЗаказПоставщику.МоментВремени) КАК ЗаказПоставщику

Дает ошибку
32 байт
 
11.10.11
20:12
(31) какую?
33 Jackman
 
11.10.11
20:19
Неверные параметры МИНИМУМ
34 wade25
 
11.10.11
20:26
Эмм по дороге домой пришло. А если через временные таблицы по отбору товара первые выбирать? =)
зы. эт так, гипотетически =)
35 Jackman
 
11.10.11
20:29
Реквизит ЗаказыПоставщикамОстатки.ЗаказПоставщику может быть объектом двух видов: Документ.ЗаказПоставщику и Документ.ЗаказПокупателя.

Но ЗаказыПоставщикамОстатки.ЗаказПоставщику.ЗаказПоставщику.МоментВремени тоже выдает ошибку
36 Jackman
 
11.10.11
20:32
Ладно, прийдется результат запроса прогонять через цикл и отдельно считать то, что на заказе.
37 байт
 
11.10.11
20:33
дату дока попробуй засунуть (31)
38 байт
 
11.10.11
20:34
(36) не оптимально пили запрос.
39 DrHiHi
 
11.10.11
20:39
сейчас напишу 100% вариант
40 Jackman
 
11.10.11
20:49
Кажись заработало
41 ssh2006
 
11.10.11
20:50
ВЫБРАТЬ
   ЗаказыПоставщикамОстатки.Номенклатура,
   ЗаказыПоставщикамОстатки.ЗаказПоставщику,
   ЗаказыПоставщикамОстатки.КоличествоОстаток,
   ЗаказыПоставщикамОстатки.ЗаказПоставщику.Дата КАК ДатаЗаказа
ПОМЕСТИТЬ ОстаткиЗаказов
ИЗ
   РегистрНакопления.ЗаказыПоставщикам.Остатки(&КонМес, Номенклатура В ИЕРАРХИИ (&ВыбТовар)) КАК ЗаказыПоставщикамОстатки
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ОстаткиЗаказов.Номенклатура,
   МИНИМУМ(ОстаткиЗаказов.ЗаказПоставщику) КАК ЗаказПоставщику
ПОМЕСТИТЬ ПервыеЗаказы
ИЗ
   ОстаткиЗаказов КАК ОстаткиЗаказов
ГДЕ
   ОстаткиЗаказов.ЗаказПоставщику.Дата В
           (ВЫБРАТЬ
               МИНИМУМ(ВТОстаткиЗаказов.ДатаЗаказа) КАК ДатаЗаказа
           ИЗ
               ОстаткиЗаказов КАК ВТОстаткиЗаказов
           ГДЕ
               ВТОстаткиЗаказов.Номенклатура = ОстаткиЗаказов.Номенклатура
           СГРУППИРОВАТЬ ПО
                       ВТОстаткиЗаказов.Номенклатура)

СГРУППИРОВАТЬ ПО
   ОстаткиЗаказов.Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ПервыеЗаказы.Номенклатура,
   ПервыеЗаказы.ЗаказПоставщику,
   ОстаткиЗаказов.КоличествоОстаток
ИЗ
   ОстаткиЗаказов КАК ОстаткиЗаказов
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПервыеЗаказы КАК ПервыеЗаказы
       ПО ОстаткиЗаказов.Номенклатура = ПервыеЗаказы.Номенклатура
           И ОстаткиЗаказов.ЗаказПоставщику = ПервыеЗаказы.ЗаказПоставщику
42 Jackman
 
11.10.11
20:53
(41) Ого. Буду разбираться
43 DrHiHi
 
11.10.11
20:54
не успел %))

ВЫБРАТЬ
   ЗаказыПоставщикамОстатки.Номенклатура КАК Номенклатура,
   ЗаказыПоставщикамОстатки.ЗаказПоставщику КАК ЗаказПоставщику,
   ЗаказыПоставщикамОстатки.КоличествоОстаток
ПОМЕСТИТЬ ВТОстатки
ИЗ
   РегистрНакопления.ЗаказыПоставщикам.Остатки(, Номенклатура = &Номенклатура) КАК ЗаказыПоставщикамОстатки
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ВТОстатки.Номенклатура,
   ВТОстатки.ЗаказПоставщику,
   ВТОстатки.КоличествоОстаток
ИЗ
   ВТОстатки КАК ВТОстатки
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           ВТОстатки.Номенклатура КАК Номенклатура,
           МИНИМУМ(ВТОстатки.ЗаказПоставщику) КАК ЗаказПоставщику
       ИЗ
           (ВЫБРАТЬ
               ВТОстатки.Номенклатура КАК Номенклатура,
               МИНИМУМ(ВТОстатки.ЗаказПоставщику.Дата) КАК ЗаказПоставщикуДата
           ИЗ
               ВТОстатки КАК ВТОстатки
           
           СГРУППИРОВАТЬ ПО
               ВТОстатки.Номенклатура) КАК ВложенныйЗапрос
               ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТОстатки КАК ВТОстатки
               ПО ВложенныйЗапрос.Номенклатура = ВТОстатки.Номенклатура
                   И ВложенныйЗапрос.ЗаказПоставщикуДата = ВТОстатки.ЗаказПоставщику.Дата
       
       СГРУППИРОВАТЬ ПО
           ВТОстатки.Номенклатура) КАК ВложенныйЗапрос
       ПО ВТОстатки.Номенклатура = ВложенныйЗапрос.Номенклатура
           И ВТОстатки.ЗаказПоставщику = ВложенныйЗапрос.ЗаказПоставщику
44 Jackman
 
11.10.11
21:01
Всем спасибо, вроде работает. Ща прикручу к основному запросу
45 Jackman
 
11.10.11
21:02
еще ни разу не использовал ПОМЕСТИТЬ, как раз хороший пример
46 DrHiHi
 
11.10.11
21:06
(45) пора начинать работать со временными таблицами
47 Jackman
 
11.10.11
21:16
(46) А как увязать временную таблицу с основным запросом в (0) ? Там ОБЪЕДИНИТЬ есть
48 Jackman
 
11.10.11
21:25
Разобрался, еще раз спасибо!
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс