Имя: Пароль:
1C
1С v8
Обрабатываем срез последних
,
0 Patrio_
O_Muerte
 
09.07.09
11:20
Суть задачи выбрать с периодического регистра сведений последнюю цену номенклатуры (безо всяких разрезов, просто последнюю цену в принципе).

Вот запрос:

ВЫБРАТЬ
   Цены.Цена КАК Цена,
   Цены.Номенклатура,
   МАКСИМУМ(Цены.Период) КАК Период
ИЗ
   (ВЫБРАТЬ
       ЦеныНоменклатурыЗакупочныеСрезПоследних.Цена КАК Цена,
       ЦеныНоменклатурыЗакупочныеСрезПоследних.Номенклатура КАК Номенклатура,
       МАКСИМУМ(ЦеныНоменклатурыЗакупочныеСрезПоследних.Период) КАК Период
   ИЗ
       РегистрСведений.ЦеныНоменклатурыЗакупочные.СрезПоследних(&ДатаКон, Номенклатура = &Ном) КАК ЦеныНоменклатурыЗакупочныеСрезПоследних
   
   СГРУППИРОВАТЬ ПО
       ЦеныНоменклатурыЗакупочныеСрезПоследних.Номенклатура,
       ЦеныНоменклатурыЗакупочныеСрезПоследних.Цена) КАК Цены

СГРУППИРОВАТЬ ПО
   Цены.Номенклатура,
   Цены.Цена


Но эта падла мне дает в разрезе измерений, то есть несколько цен получаю, а мне нужна одна последняя.

17,83    Сок Бабушкино Лукошко 200мл Яблоко Черн Смородина Осветленный *12    30.06.2009 23:58:00
20,21    Сок Бабушкино Лукошко 200мл Яблоко Черн Смородина Осветленный *12    17.06.2009 16:23:34

Что я не так делаю?
1 ТелепатБот
 
гуру
09.07.09
11:20
2 SASH_EG
 
09.07.09
11:23
выбери максимальное значение периода.
3 Vitello
 
09.07.09
11:24
А цена тоже измерение что ли?
4 73
 
09.07.09
11:24
5 Patrio_
O_Muerte
 
09.07.09
11:25
(2)Его родного я и мучаю, смотри внимательнее запрос (причем два раза).
(3)Нет, ресурс. Измерений там еще штук 5-6.
(4)Спасибо, посмотрю.
6 Vitello
 
09.07.09
11:26
(5)А, ну так сразу бы и сказал. А то я сижу и думаю почему просто срез нельзя взять :)
7 SASH_EG
 
09.07.09
11:29
ВЫБРАТЬ ПЕРВЫЕ 1
   ЦеныКомпанииСрезПоследних.Период КАК Период,
   ЦеныКомпанииСрезПоследних.Номенклатура,
   ЦеныКомпанииСрезПоследних.Цена
ИЗ
   РегистрСведений.ЦеныКомпании.СрезПоследних КАК ЦеныКомпанииСрезПоследних

УПОРЯДОЧИТЬ ПО
   Период УБЫВ
8 Patrio_
O_Muerte
 
09.07.09
11:30
(4)Я тоже к такому варианту склонялся, но шибко у меня там таблицы большие, не хочу дважды выполнять один и тот же запрос.
9 Patrio_
O_Muerte
 
09.07.09
11:31
(7) Тебя ввел в заблуждение параметр &Ном. На самом деле запрос будет выполняться без этого параметра.
10 XLife
 
09.07.09
11:31
(7) получишь одну строку
11 SASH_EG
 
09.07.09
11:32
(9) че? )
12 Point
 
09.07.09
11:33
(0) может еще стоит ограничить выборку из запроса ТипомЦены, на сколько я знаю в регистре могу присутствовать цены с разным типом (оптовая, розничная и т.д.)
13 SASH_EG
 
09.07.09
11:33
(10) я так понял человек хочет получить последнюю запись в регистре-он и получит саму последнюю одну
14 Patrio_
O_Muerte
 
09.07.09
11:35
(11)Суть в том, что этот метод возвращает только 1 строку, из всего результата запроса. И если я выполняю запрос к одному элементу справочника номенклатура, это оправданно, а в моем случае это не оправданно.
(12)Там нет этого измерения, и собственно ничего более ограничивать не нужно.
15 rcs
 
09.07.09
11:37
Думаю должно быть примерно так:

ВЫБРАТЬ
   Цены.Цена КАК Цена,
   Цены.Номенклатура,
   Цены.Период КАК Период
ИЗ
   (ВЫБРАТЬ
       ЦеныНоменклатурыЗакупочные.Цена КАК Цена,
       ЦеныНоменклатурыЗакупочные.Номенклатура КАК Номенклатура,
       МАКСИМУМ(ЦеныНоменклатурыЗакупочные.Период) КАК Период
   ИЗ
       РегистрСведений.ЦеныНоменклатурыЗакупочные КАК ЦеныНоменклатурыЗакупочные
   ГДЕ
      ЦеныНоменклатурыЗакупочные.Период <= &ДатаКон
   СГРУППИРОВАТЬ ПО
       ЦеныНоменклатурыЗакупочные.Номенклатура,
       ЦеныНоменклатурыЗакупочные.Цена) КАК Цены
16 SASH_EG
 
09.07.09
11:39
(14)не понял, что же ты хочешь-объясни еще раз, чем тебя тогда срез последних не устраивает
17 rcs
 
09.07.09
11:40
(15) А вообще, если бы 1С давала возможность в параметрах таблицы среза последних/первых указать в разрезе каких измерений ее получать, было бы проще.
18 SASH_EG
 
09.07.09
11:44
(17)
ВЫБРАТЬ ПЕРВЫЕ 1
   ЦеныКомпанииСрезПоследних.Период КАК Период,
   ЦеныКомпанииСрезПоследних.Номенклатура,
   ЦеныКомпанииСрезПоследних.Цена
ИЗ
   РегистрСведений.ЦеныКомпании.СрезПоследних(, Номенклатура В (&СписокНоменклатуры)) КАК ЦеныКомпанииСрезПоследних

УПОРЯДОЧИТЬ ПО
   Период УБЫВ
19 73
 
09.07.09
11:48
ВЫБРАТЬ
  Т.Период,
  Т.Номенклатура,
  Т.Цена
ПОМЕСТИТЬ ТаблицаСреза
ИЗ
  РегистрСведений.ЦеныНоменклатурыЗакупочные.СрезПоследних(&ДатаКон, Номенклатура = &Ном) КАК Т
;
ВЫБРАТЬ
   СрезПоследних.Период КАК Период,
   СрезПоследних.Номенклатура КАК Номенклатура,
   МАКСИМУМ(СрезПоследних.Цена) КАК Цена
ИЗ
   ТаблицаСреза КАК СрезПоследних
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           МАКСИМУМ(ЦеныСрезПоследних.Период) КАК Период,
           ЦеныСрезПоследних.Номенклатура КАК Номенклатура
         ИЗ
           ТаблицаСреза КАК ЦеныСрезПоследних
         СГРУППИРОВАТЬ ПО
           ЦеныСрезПоследних.Номенклатура) КАК Периоды
       ПО СрезПоследних.Период = Периоды.Период
           И СрезПоследних.Номенклатура = Периоды.Номенклатура

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

УПОРЯДОЧИТЬ ПО
   Номенклатура
20 rcs
 
09.07.09
11:51
(18) твой запрос вернет одну номенклатуру, а надо все
21 SASH_EG
 
09.07.09
11:53
(20) ну убери "первые 1" ,делов то
22 73
 
09.07.09
11:56
(21) Нужна одна по кждой номенклатуре, без учета других измерений.
23 Patrio_
O_Muerte
 
09.07.09
11:56
(15)Этим запросом я получу все самые последние цены с максимальными периодами меньше или равно ДатаКон !в разрезе измерений!. Не сработает.
(16)Есть регистр сведений периодический, есть 6 измерений, 1 ресурс (цена), мне надо получить все последние цены всех номенклатур, без учета остальных измерений.
Если же у меня в данном регистре по этой номенклатуре измерения заполнены различными значениями, то я могу вспотеть но не получить нужного результата, потому, что срез последних мне будет выдавать все-таки с учетом всех измерений.
(17)Да это было бы здорово.
(18)Попробуй в конце концов его сам использовать например к справочнику номенклатура, и увидишь что он вернет тебе только первую строчку, а мне не нужна одна строчка. Перечитай если не трудно (9)
24 SASH_EG
 
09.07.09
11:57
(22) а если периоды равны для нескольких измерений ?
25 Patrio_
O_Muerte
 
09.07.09
11:58
(19)Я думал использовать виртуальные таблицы, но пока тямы не хватает.
(20)Дело говоришь :)
26 Patrio_
O_Muerte
 
09.07.09
11:58
(22)Проблемы шерифа негров не интересуют. Получил цену по номенклатуре и я в нирване.
27 Patrio_
O_Muerte
 
09.07.09
11:59
пардон (26) к (24)
28 rcs
 
09.07.09
11:59
(23) в разрезе измерения Номенклатура, остальные не будут учтены
29 Patrio_
O_Muerte
 
09.07.09
12:00
(28)остальные измерения меня как класс не интересуют.
30 rcs
 
09.07.09
12:01
Так (15) работает или нет?
31 73
 
09.07.09
12:02
(24) Для этого в (19) Максимум Цены берется. Логику можно изменить. Тут автору решать.

(25) Так там и используется виртуальная. Только она во времееную помещается, чтоба 2 раза не строить.
32 SASH_EG
 
09.07.09
12:02
если периоды равны для нескольких измерений,то оба ваших азпроса могу выдать несколько одинаковых записей
33 73
 
09.07.09
12:03
(32) В (19) - вернет 1 запись!
34 rcs
 
09.07.09
12:05
(32) ты понимаешь что такое
   СГРУППИРОВАТЬ ПО
       ЦеныНоменклатурыЗакупочные.Номенклатура,
       ЦеныНоменклатурыЗакупочные.Цена) КАК Цены

Как могут в результате группировки остаться одинаковые записи?
35 73
 
09.07.09
12:08
(34) Запрос (15) все цены выдаст.
36 Patrio_
O_Muerte
 
09.07.09
12:08
(30)15 не работает - двоит.
37 73
 
09.07.09
12:09
(36) А (19) пробовал?
38 rcs
 
09.07.09
12:13
(36) да, я ступил немного, надо еще внутреннее соединение

ВЫБРАТЬ
   Цены.Цена КАК Цена,
   Цены.Номенклатура,
   Цены.Период КАК Период
ИЗ
   (ВЫБРАТЬ
       ЦеныНоменклатурыЗакупочные.Цена КАК Цена,
       ЦеныНоменклатурыЗакупочные.Номенклатура КАК Номенклатура,
       МАКСИМУМ(ЦеныНоменклатурыЗакупочные.Период) КАК Период
   ИЗ
       РегистрСведений.ЦеныНоменклатурыЗакупочные КАК ЦеныНоменклатурыЗакупочные
   ГДЕ
      ЦеныНоменклатурыЗакупочные.Период <= &ДатаКон
   СГРУППИРОВАТЬ ПО
       ЦеныНоменклатурыЗакупочные.Номенклатура,
       ЦеныНоменклатурыЗакупочные.Цена) КАК Цены
39 Patrio_
O_Muerte
 
09.07.09
12:16
(37)Надо попробовать - я пока все это в конструкторе ваяю.
Доберусь до построителя, там буду пробовать.
Пока сделал так:
Через два запроса к срезу последних - из одного вытаскиваю макс период, из другого период и цену и потом связываю по периоду (естесственно главной таблицей является та, в которой макс период).
В (19) я так понял та же конструкция.
40 Patrio_
O_Muerte
 
09.07.09
12:16
(38)На обед пойду схожу :) потом попробую
41 Patrio_
O_Muerte
 
09.07.09
12:16
Спасибо за помощь всем.
42 rcs
 
09.07.09
12:22
(38) Случайно нажал на Отправить:)
Вот как должно быть:

ВЫБРАТЬ
   ЦеныНоменклатурыЗакупочные2.Цена,
   ЦеныНоменклатурыЗакупочные2.Номенклатура,
   ЦеныНоменклатурыЗакупочные2.Период
ИЗ
   (ВЫБРАТЬ
       ЦеныНоменклатурыЗакупочные.Цена КАК Цена,
       ЦеныНоменклатурыЗакупочные.Номенклатура КАК Номенклатура,
       МАКСИМУМ(ЦеныНоменклатурыЗакупочные.Период) КАК Период
   ИЗ
       РегистрСведений.ЦеныНоменклатурыЗакупочные КАК ЦеныНоменклатурыЗакупочные
   ГДЕ
      ЦеныНоменклатурыЗакупочные.Период <= &ДатаКон
   СГРУППИРОВАТЬ ПО
       ЦеныНоменклатурыЗакупочные.Номенклатура,
       ЦеныНоменклатурыЗакупочные.Цена) КАК ПоследниеПоПериоду
   ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатурыЗакупочные КАК ЦеныНоменклатурыЗакупочные2
   ПО ПоследниеПоПериоду.Период = ЦеныНоменклатурыЗакупочные2.Период
   И ПоследниеПоПериоду.Номенклатура = ЦеныНоменклатурыЗакупочные2.Номенклатура
   И ПоследниеПоПериоду.Цена = ЦеныНоменклатурыЗакупочные2.Цена
43 rcs
 
09.07.09
12:28
(39) надо вытащить максимальный период в разрезе интересующих измерений, затем связать внутренним соединением с основной таблицей регистра.

(42) Вот в такую конструкцию на самом деле и транслируется срез последних, только там используются все измерения регистра. Те кто думают, что срезы последних/первых это отдельная таблица в базе и она оптимизирована по скорости жестоко заблуждаются. Желающие могут проверить, поймав запрос со срезом последних средствами SQL.
44 Patrio_
O_Muerte
 
09.07.09
12:37
(37)Кстати видел в одном запросе одинэсовском прям в тексте этого запроса определялась виртуальная таблица и прям там же использовалась и все в рамках одного запроса. Вот прям интересно было бы так сделать.
45 73
 
09.07.09
13:24
(42) Возможны дубли, если для разных измерений - один период.
Ошибка? Это не ошибка, это системная функция.