Имя: Пароль:
1C
1С v8
УТ11 Помогите с запросом
0 breezee
 
26.05.15
09:43
Недавно мне сильно помогли с запросом, еще раз спасибо. Нужно установить период на который выбираются документы - я создал параметр дату начала и дату конца, когда была просто дата конца - все работала -когда ставлю еще и дату начала - отчет выдает ошибку "Ошибка обработки представления РегистрСведений.ЦенымНоменклатуры.СрезПоследних Нсоответствие типов параметров 1 ВНУТРЕНННЕ Соединение РегистрСвед" - тут обрывается, при наведнии полный текст не показывается, я так понимаю что проблема в том что я сначала сравниваю в запросе с последним значением чтобы найти предпоследнее и + сравниваю в условии со значением начальной даты - по этому система и выдает ошибку, потому что не знает с чем сравнивать. Помогите разобраться, пожалуйста. Вот код запроса
ВЫБРАТЬ
    ЦеныНоменклатуры.ВидЦены,
    ЦеныНоменклатуры.Номенклатура,
    ЦеныНоменклатуры.Характеристика,
    МАКСИМУМ(ЦеныНоменклатуры.Период) КАК Период,
    ЦеныНоменклатурыСрезПоследних.Цена
ПОМЕСТИТЬ ВременнаяТаблицаПредпоследнийПериод
ИЗ
    РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних
        ПО ЦеныНоменклатуры.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
            И ЦеныНоменклатуры.ВидЦены = ЦеныНоменклатурыСрезПоследних.ВидЦены
            И ЦеныНоменклатуры.Характеристика = ЦеныНоменклатурыСрезПоследних.Характеристика
            И ЦеныНоменклатуры.Период < ЦеныНоменклатурыСрезПоследних.Период

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЦеныНоменклатуры.Номенклатура КАК Номенклатура,
    ВременнаяТаблицаПредпоследнийПериод.Цена КАК ЦенаНовая,
    ЦеныНоменклатуры.Цена КАК ЦенаСтарая,
    ВременнаяТаблицаПредпоследнийПериод.Цена - ЦеныНоменклатуры.Цена КАК Разность,
    ЦеныНоменклатуры.Регистратор
ИЗ
    ВременнаяТаблицаПредпоследнийПериод КАК ВременнаяТаблицаПредпоследнийПериод
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
        ПО ВременнаяТаблицаПредпоследнийПериод.ВидЦены = ЦеныНоменклатуры.ВидЦены
            И ВременнаяТаблицаПредпоследнийПериод.Номенклатура = ЦеныНоменклатуры.Номенклатура
            И ВременнаяТаблицаПредпоследнийПериод.Характеристика = ЦеныНоменклатуры.Характеристика
            И ВременнаяТаблицаПредпоследнийПериод.Период = ЦеныНоменклатуры.Период
ГДЕ
    ЦеныНоменклатуры.ВидЦены = &ВидЦены

УПОРЯДОЧИТЬ ПО
    Номенклатура
1 breezee
 
26.05.15
10:12
ОК, я подправил - ошибка была идиотская - я просто использовал операторы ">" "<" с датами и все заработало. Чтобы не зря создать ветку - подскажите по запросу(который выше) если я вначале нахожу в физической таблице цен номенклатуры предпоследнюю запись(получается максимально последняя, из которой исключается самая последняя срезыванием последних), так почему я выбираю не её, а цену из вирт. таблицы? Если выбираю её - выбирается какая-то фигня.
2 К_Дач
 
26.05.15
10:41
1 пакет: выбрать максимальный период из физической таблицы регистра цен, условие ИМЕЮЩИЕ максимум(период) < СрезПоследних.Период, группировка по номенклатура, вид цен

2 пакет: выбираешь из 1 пакета поля и к ним слева приклеиваешь цену из физической таблицы регистра цен по равенству номенклатура, вид цены, период
3 breezee
 
26.05.15
10:44
(2) ААААА, примноооого благодарен! Понял, спасибо!
4 ls300
 
26.05.15
10:45
(2) Может у автора так задача поставлена, что если нет предыдущей цены, то в запросе пусто) И во втором пакете не понятно правда зачем еще условие по виду цены если соединение полное. Автор что конкретно не так сейчас ценой, которую ты во втором пакете выбираешь из физической таблицы?
5 ls300
 
26.05.15
10:47
и на фейхуа здесь имеющие, если соединение внутреннее?
6 breezee
 
26.05.15
10:49
(4) Как пустоту побороть? С помощью Is NULL? Куда его вставлять? Заранее спасибо за ответ!
7 ls300
 
26.05.15
10:49
в (4) описка про "полное"..
8 ls300
 
26.05.15
10:49
(6) пустоту где?
9 ls300
 
26.05.15
10:50
(6) лучше бороть такую пустоту хотя-бы книжкой Радченко..
10 breezee
 
26.05.15
10:50
(4) >>(2) Может у автора так задача поставлена, что если нет предыдущей цены, то в запросе пусто)
Получается что у меня не выбирается номенклатура и цена для незаплненной предыдущей?
11 ls300
 
26.05.15
10:53
конечно, чтобы получить 0 при том что цена первая, нужно использовать левое соединение а в итоговой таблице при выборе цены вместо "ЦеныНоменклатуры.Цена КАК ЦенаСтарая,"
Нужно "ЕстьNUll(ЦеныНоменклатуры.Цена,0) КАК ЦенаСтарая"

И в поле ВременнаяТаблицаПредпоследнийПериод.Цена - ЦеныНоменклатуры.Цена КАК Разность, тоже самое.
12 breezee
 
26.05.15
11:07
(11) Премного благодарен. Понял, что для всех полей, которые могут не существовать - надо ставить такое услвие - за это отдельное спасибо). И все же ошибку я не исправл - вообще можно оставить все как есть, но пользователю будет удобней выбирать с помощью стандартного периода начало и конец, а не с помощью выбора 2-х отдельных дат. Может я что-то не так делаю. 1) условия составил - в 1-ом пакете запроса для вирт. таблицы - период таблицы<=конечной дате и =>начальной. У меня в пармаетрах был период - для него поставил тип стандартный период и для даты начала и даты окончания в выражении заполнил "&Период.ДатаНачала" и "&Период.ДатаОкончания" - пишет то же самое Ошибка обработки представления РегистрСведений.ЦенымНоменклатуры.СрезПоследних Нсоответствие типов параметров 1 ВНУТРЕНННЕ Соединение РегистрСвед
13 ls300
 
26.05.15
11:11
(12) в этом случае нужно в параметр сразу передавать даты из периода, т.е. еще в момент установки параметра запроса.
14 К_Дач
 
26.05.15
11:11
(5) да, я чет не посмотрел, что внутреннее, думал левое

Вот так будет работать:

____

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

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВременнаяТаблицаПредпоследнийПериод.ТипЦен,
    ВременнаяТаблицаПредпоследнийПериод.Номенклатура,
    ВременнаяТаблицаПредпоследнийПериод.ХарактеристикаНоменклатуры,
    ВременнаяТаблицаПредпоследнийПериод.Период,
    ЦеныНоменклатуры.Цена
ИЗ
    ВременнаяТаблицаПредпоследнийПериод КАК ВременнаяТаблицаПредпоследнийПериод
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
        ПО ВременнаяТаблицаПредпоследнийПериод.ТипЦен = ЦеныНоменклатуры.ТипЦен
            И ВременнаяТаблицаПредпоследнийПериод.Номенклатура = ЦеныНоменклатуры.Номенклатура
            И ВременнаяТаблицаПредпоследнийПериод.ХарактеристикаНоменклатуры = ЦеныНоменклатуры.ХарактеристикаНоменклатуры
            И ВременнаяТаблицаПредпоследнийПериод.Период = ЦеныНоменклатуры.Период

____
15 ls300
 
26.05.15
11:12
вводится 2 параметра и уже их мы заполняем из стандартного периода, который выбрал пользователь.
16 ls300
 
26.05.15
11:14
(14) В таком виде тоже не будет работать.
1) в первом пакете тоже левое соединение.
2) Во втором пакете не использовано "ЕстьNull()"
17 К_Дач
 
26.05.15
11:16
(16) в первом пакете внутреннее вообще-то.

ну уж естьнулл то он сам догадется подставить, я думаю
18 К_Дач
 
26.05.15
11:17
да к тому же насчет естьнулл - в первом пакете выборка из той же самой таблицы, если там попался такой период - значит и во втором пакете будет, так что можно и без естьнулл. Все работает
19 breezee
 
26.05.15
11:19
Везде проставил ЕстьNULL, в первом пакете сделал левое по физической таблице. (13) То есть мне все же придется сделать объект в скд, а не запрос и напрямую передавать параметры в запрос?
20 ls300
 
26.05.15
11:20
(17) Мы же рассматриваем вариант когда цена задана только одна. В этом случае должен быть 0 в реквизите "Цена старая", но результат запроса не должен быть пустой. Поэтому в первом пакете должно быть левое соединение.
21 К_Дач
 
26.05.15
11:22
(20) а, ну тогда ясное дело. Я думал, надо возвращать предпоследнюю цену, только если она есть. Тогда конечно левое
22 ls300
 
26.05.15
11:22
(19) Да, в СКД это еще проще делается. Создается новый параметр "Стандартный период". В запросе два обычных параметра типа "ДАТА". Потом в СКД для 2-х параметрам в ячейке "Выражение" пишем "&СтандартныйПериод.ДатаНачала" и т.д.
23 breezee
 
26.05.15
11:23
(22) Дак я так и написал >>(12) И все же ошибку я не исправл - вообще можно оставить все как есть, но пользователю будет удобней выбирать с помощью стандартного периода начало и конец, а не с помощью выбора 2-х отдельных дат. Может я что-то не так делаю. 1) условия составил - в 1-ом пакете запроса для вирт. таблицы - период таблицы<=конечной дате и =>начальной. У меня в пармаетрах был период - для него поставил тип стандартный период и для даты начала и даты окончания в выражении заполнил "&Период.ДатаНачала" и "&Период.ДатаОкончания" - пишет то же самое Ошибка обработки представления РегистрСведений.ЦенымНоменклатуры.СрезПоследних Нсоответствие типов параметров 1 ВНУТРЕНННЕ Соединение РегистрСвед

И все равно ругается
24 breezee
 
26.05.15
11:29
Абсолютно внезапно создал новый стандартный период - назвал "Спериод" - сделал все тоже самое - ошибка перестала выходить, наверное это потому что "Период" использовался ранее
25 Basilio
 
26.05.15
11:30
(23) у тебя в параметрах Среза последних дата должна быть, а не период
26 ls300
 
26.05.15
11:30
(23) Все я понял твою ошибку)) Надо задать явно параметры виртуальной таблицы СрезПоследних
27 ls300
 
26.05.15
11:31
И для чего пользователю нужна дата начала периода?
28 breezee
 
26.05.15
11:34
(27) Там вообще все переоценки выбираются, а с отбором с начала периода - только с какого-то момента.
29 ls300
 
26.05.15
11:36
(28) ну значит надо все это описать в условиях и параметрах среза, в первом пакете запроса.
30 breezee
 
26.05.15
11:37
Если я просто копирую условие - пишет что не найдено и >= &ДатаНачала тоже не могу поставить, не могу обратиться, да в принципе и так нормально работает. Думаю оставить все как есть
31 breezee
 
26.05.15
11:38
(29) в смысле если указываю в параметрах виртуальой таблицы, а не в условиях
32 ls300
 
26.05.15
11:40
ВЫБРАТЬ
    ЦеныНоменклатуры.ТипЦен,
    ЦеныНоменклатуры.Номенклатура,
    ЦеныНоменклатуры.ХарактеристикаНоменклатуры,
    МАКСИМУМ(ЦеныНоменклатуры.Период) КАК Период
ПОМЕСТИТЬ ВременнаяТаблицаПредпоследнийПериод
ИЗ
    РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаОкончания, Номенклатура = &Номенклатура) КАК ЦеныНоменклатурыСрезПоследних
        ПО ЦеныНоменклатуры.ТипЦен = ЦеныНоменклатурыСрезПоследних.ТипЦен
            И ЦеныНоменклатуры.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
            И ЦеныНоменклатуры.ХарактеристикаНоменклатуры = ЦеныНоменклатурыСрезПоследних.ХарактеристикаНоменклатуры
            И ЦеныНоменклатуры.Период < ЦеныНоменклатурыСрезПоследних.Период

СГРУППИРОВАТЬ ПО
    ЦеныНоменклатуры.ТипЦен,
    ЦеныНоменклатуры.Номенклатура,
    ЦеныНоменклатуры.ХарактеристикаНоменклатуры
Где
   ЦеныНоменклатурыСрезПоследних.Период >= &ДатаНачала
;
33 ls300
 
26.05.15
11:41
вуаля?)
34 breezee
 
26.05.15
11:44
(33) Спасибо!
35 ls300
 
26.05.15
11:45
(34) Только не забудь внутреннее соединение на левое замениить)
Основная теорема систематики: Новые системы плодят новые проблемы.