Имя: Пароль:
1C
1С v8
Последние цены для нескольких номенклатур
0 cmex
 
15.03.12
10:47
День добрый.Подскажите приемлемое решение.Есть 3 регистра сведений,ЦеныНоменклатуры, ЦеныНоменклатурыКонтрагентов и УсловияПоставокПоДоговорамКонтрагентовПоНоменклатуре.Необходимо из них выбрать самую последнюю цену для нескольких номенклатур в одном запросе.Сложность в том,что периоды могут совпадать,то есть несколько различных видов документов имеют одинаковую дату и время.Вероятно нужно как то использовать еще и МоментВремени,но как ума не прилажу.Какие будут идеи?Спасибо
1 golden-pack
 
15.03.12
10:48
приложу.
2 patapum
 
15.03.12
10:50
Юзать для всех регистров срез последних, который из трех последний определять оператором ВЫБОР
3 cmex
 
15.03.12
10:50
и не приложу и не прилажу.по существу плиз)
4 cmex
 
15.03.12
10:52
пример: ЦеныНоменклатуры 01.01.2012 0:00:00  100
ЦеныНомКонтр 01.01.2012 0:00:00   150
УсловияПост 01.01.2012 0:00:00  200 Какую брать?
5 patapum
 
15.03.12
10:53
Это уже к тебе вопрос, как к постановщику задачи. Какую брать? )))
6 cmex
 
15.03.12
10:55
хронологически от последнего документа,то есть ктр самый крайний на временной оси.но беда в том,что я не могу выбрать максимальный моментвремени((
7 cmex
 
15.03.12
10:56
я могу только упорядочить по нему,а мне нужно оставить только одну строчку для каждой номенклатуры.приемлемо было бы даже не самую крайнюю,но главное ОДНУ
8 patapum
 
15.03.12
10:59
связываешь все таблицы по номенклатуре, пишешь
ВЫБОР
КОГДА ЦеныНомСрезПоследних.Период >=ЦеныКонтрСрезПоследних.Период И ЦеныНомСрезПоследних.Период >= УсловияПоставкиСрезПоследних.Период
ТОГДА ЦеныНомСрезПоследних.Цена
КОГДА ЦеныКонтрСрезПоследних.Период >= УсловияПоставкиСрезПоследних.Период
ТОГДА ЦеныКонтрСрезПоследних.Цена
ИНАЧЕ УсловияПоставкиСрезПоследних.Цена
КОНЕЦ КАК Цена
9 cmex
 
15.03.12
11:05
а как связать?
10 cmex
 
15.03.12
11:10
и как быть если не будет в одном из регистров вообще номенклатуры?
11 patapum
 
15.03.12
11:14
как связать - ты запрос конструктором делаешь? на вкладке связи таблиц
если не будет номенклатуры - это ты прав, тогда везде вместо
какаятотаблица.период
надо писать
ЕСТЬNULL(какаятотаблица.период, ДАТАВРЕМЯ(1,1,1))
а поле номенклатура придется составлять так
ЕСТЬNULL(ЦеныНомСрезПоследних.Номенклатура, ЕСТЬNULL(ЦеныКонтрСрезПоследних.Номенклатура, УсловияПоставкиСрезПоследних.Номенклатура))
12 cmex
 
15.03.12
11:18
вот так пойдет?
ВЫБРАТЬ
   ВЫБОР
       КОГДА ЕСТЬNULL(ЦН.Период, &ПустаяДата) >= ЕСТЬNULL(ЦНК.Период, &ПустаяДата)
               И ЕСТЬNULL(ЦН.Период, &ПустаяДата) >= ЕСТЬNULL(Ус.Период, &ПустаяДата)
           ТОГДА ЦН.Цена
       КОГДА ЕСТЬNULL(ЦНК.Период, &ПустаяДата) >= ЕСТЬNULL(Ус.Период, &ПустаяДата)
           ТОГДА ЦНК.Цена
       ИНАЧЕ Ус.Цена
   КОНЕЦ КАК Цена
ИЗ
   РегистрСведений.ЦеныНоменклатурыКонтрагентов.СрезПоследних(&Дата, Номенклатура В (&Номенклатура)) КАК ЦН
       ПОЛНОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, Номенклатура В (&Номенклатура)) КАК ЦНК
           ПОЛНОЕ СОЕДИНЕНИЕ РегистрСведений.УсловияПоставокПоДоговорамКонтрагентовПоНоменклатуре.СрезПоследних(&Дата, Номенклатура В (&Номенклатура)) КАК Ус
           ПО ЦНК.Номенклатура = Ус.Номенклатура
       ПО ЦН.Номенклатура = ЦНК.Номенклатура
13 cmex
 
15.03.12
11:19
&Дата это у меня пустая дата
14 2mugik
 
15.03.12
11:23
(0)У регистра сведений разве есть момент времени?
15 cmex
 
15.03.12
11:25
нет,есть у регистратора
16 2mugik
 
15.03.12
11:29
(15)Ну сгруппируй по моментувремени и сделай соединение.
17 cmex
 
15.03.12
11:31
(16)А можно запрос посмотреть,а то я чет не пойму как вы это предлагаете сделать?Какую функцию агрегирования применить к моментувремени?
18 badboychik
 
15.03.12
11:34
если упорядочить можешь то бери "ПЕРВЫЕ 1" в запросе
19 cmex
 
15.03.12
11:36
(18) нужно для нескольких номенклатур
20 patapum
 
15.03.12
11:41
(12) пойдет, только тебе еще нужно поле Номенклатура. как его написать см. (11)
21 КМ155
 
15.03.12
11:43
(0)[последнюю цену] + [имеют одинаковую дату и время]
если два документа установили разную цену, то бессмысленно говорить об последней цене

вернись к постановщику задачи и получи ответ, как быть в такой ситуации, обычно либо берётся средняя цена, либо выбирается приоритет типа документа
22 cmex
 
15.03.12
11:49
(21) это мы понимаем,а начальство даже не пытается понять ситуацию,выбирай говорит любую,а там разберемся,при этом нужно регистратора знать
23 cmex
 
15.03.12
11:50
(20) ВЫБРАТЬ
   ВЫБОР
       КОГДА Ус.Номенклатура ЕСТЬ НЕ NULL
           ТОГДА Ус.Номенклатура
       КОГДА ЦН.Номенклатура ЕСТЬ НЕ NULL
           ТОГДА ЦН.Номенклатура
       ИНАЧЕ ЦНК.Номенклатура
   КОНЕЦ КАК Номенклатура

у меня почему то несколько строк выскакивает,где то косяк у меня?
24 badboychik
 
15.03.12
11:51
(19) ну дык бери список номенклатур и соединяй с подзапросом, который для каждой номенклатуры будет брать "ПЕРВЫЕ 1" начиная с максимального момента времени
25 cmex
 
15.03.12
11:54
(24) то есть коррелированный запрос?или запрос в цикле выполнять?
26 КМ155
 
15.03.12
12:05
(22) [выбирай говорит любую]
взять максимум по номеру регистратора и не париться
27 cmex
 
15.03.12
12:11
(26) виды доков разные,номера могут тоже совпасть(
28 badboychik
 
15.03.12
12:16
(25) да, кореллированный вроде называется
29 КМ155
 
15.03.12
12:25
(27)[номера могут тоже совпасть]
звездёж
а запрос вот он, для компактности перепиши через ВТ:
ВЫБРАТЬ
   ТоварПериодНомер.Номенклатура,
   ТоварПериодНомер.Период,
   ТоварПериодНомер.РегистраторНомер,
   Цены.Цена
ИЗ
   (ВЫБРАТЬ
       ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
       ЦеныНоменклатурыСрезПоследних.Регистратор КАК Регистратор,
       ЦеныНоменклатурыСрезПоследних.Период КАК Период,
       ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
   ИЗ
       РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен = &ТипЦен) КАК ЦеныНоменклатурыСрезПоследних
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
       ЦеныНоменклатурыКонтрагентовСрезПоследних.Номенклатура,
       ЦеныНоменклатурыКонтрагентовСрезПоследних.Регистратор,
       ЦеныНоменклатурыКонтрагентовСрезПоследних.Период,
       ЦеныНоменклатурыКонтрагентовСрезПоследних.Цена
   ИЗ
       РегистрСведений.ЦеныНоменклатурыКонтрагентов.СрезПоследних(, ТипЦен = &ТипЦенПоставщика) КАК ЦеныНоменклатурыКонтрагентовСрезПоследних) КАК Цены
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           ВложенныйЗапрос.Номенклатура КАК Номенклатура,
           МАКСИМУМ(ВложенныйЗапрос.Регистратор.Номер) КАК РегистраторНомер,
           МАКСИМУМ(ВложенныйЗапрос.Период) КАК Период
       ИЗ
           (ВЫБРАТЬ
               ТоварРегистратор.Номенклатура КАК Номенклатура,
               ТоварРегистратор.Регистратор КАК Регистратор,
               ТоварРегистратор.Период КАК Период
           ИЗ
               (ВЫБРАТЬ
                   ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
                   ЦеныНоменклатурыСрезПоследних.Регистратор КАК Регистратор,
                   ЦеныНоменклатурыСрезПоследних.Период КАК Период
               ИЗ
                   РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен = &ТипЦен) КАК ЦеныНоменклатурыСрезПоследних
               
               ОБЪЕДИНИТЬ ВСЕ
               
               ВЫБРАТЬ
                   ЦеныНоменклатурыКонтрагентовСрезПоследних.Номенклатура,
                   ЦеныНоменклатурыКонтрагентовСрезПоследних.Регистратор,
                   ЦеныНоменклатурыКонтрагентовСрезПоследних.Период
               ИЗ
                   РегистрСведений.ЦеныНоменклатурыКонтрагентов.СрезПоследних(, ТипЦен = &ТипЦенПоставщика) КАК ЦеныНоменклатурыКонтрагентовСрезПоследних) КАК ТоварРегистратор) КАК ВложенныйЗапрос
       
       СГРУППИРОВАТЬ ПО
           ВложенныйЗапрос.Номенклатура) КАК ТоварПериодНомер
       ПО Цены.Номенклатура = ТоварПериодНомер.Номенклатура
           И Цены.Регистратор.Номер = ТоварПериодНомер.РегистраторНомер
30 cmex
 
15.03.12
14:50
(28) напиши запрос,плиз,а то я не могу сам догнать, как сие организовать?
31 cmex
 
15.03.12
14:51
(29) почему звездёж?
32 КМ155
 
15.03.12
15:34
(31) [почему звездёж]
по факту
33 cmex
 
15.03.12
16:31
(32) документ ПоступлениеТМЦ номер 001 от 01.01.2012 0:00:00 и УстановкаЦенНоменклатуры 001 от от 01.01.2012 0:00:00, все совпадает,движения по разным регистрам.такого не может быть или я чего то не понимаю?