Имя: Пароль:
1C
1С v8
Помогите с запросом к спр. "Графики изменения ставок на услуги"
0 DrManhattan
 
13.05.15
17:04
Имеется справочник "Графики изменения ставок на услуги", в каждом элементе которого есть табличная часть вида "Дата - Ставка"(это означает, что начиная с указанной даты действует указанная ставка).
В результате запроса хочу получить табличку вида:
Код элемента справочника - Актуальная ставка.

Вроде бы должно быть просто, но че-то туплю, не могу
1 pavelul73
 
13.05.15
17:13
Максимум Дата
Ставка
из твоей тч
2 DrManhattan
 
13.05.15
17:15
(1) Ну там может быть дата какая-нибудь типа 01.01.2016. Это будет неакутальная ставка
3 pavelul73
 
13.05.15
17:18
добавьте условие.
Но лучше, такие значения писать в РС
4 anatoly
 
13.05.15
17:20
РС однозначно!
измерение - услуга.
в ТЧ - РССписок с отбором по услуге.
этот велосипед давно уже изобретен, зачем извращаться?
5 DrManhattan
 
13.05.15
17:22
(3)  Я вот и не могу сообразить какое условие. К слову, дата актуальности может быть любая. Этот запрос станет частью отчета, в котором дата актуальности будет задаваться в качестве параметра
6 DrManhattan
 
13.05.15
17:24
(4) Ну конфу переписывать тут не вариант, к сожалению. Регистр сведений это замечательно конечно, но придется изобретать велосипед :(
7 zenik
 
13.05.15
17:35
Вложенный запрос, выбрать первые 1 упорядочить по дате по убыванию где дата <= актуальная дата не?
8 DrManhattan
 
13.05.15
17:44
(7) Попробую завтра, спасибо
9 DrManhattan
 
14.05.15
11:34
По совету (7)  сделал так:

ВЫБРАТЬ
    АР_ГрафикиИзмененияСтавокНаУслуги.Ссылка.Наименование,
    АР_ГрафикиИзмененияСтавокНаУслуги.Ссылка.Код,
    ВложенныйЗапрос.Дата,
    ВложенныйЗапрос.Ставка
ИЗ
    Справочник.АР_ГрафикиИзмененияСтавокНаУслуги КАК АР_ГрафикиИзмененияСтавокНаУслуги
ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ПЕРВЫЕ 1
                            АР_ГрафикиИзмененияСтавокНаУслугиГрафикСтавок.Дата КАК Дата,
                            АР_ГрафикиИзмененияСтавокНаУслугиГрафикСтавок.Ставка КАК Ставка,
                            АР_ГрафикиИзмененияСтавокНаУслугиГрафикСтавок.Ссылка.Код КАК Код
                        ИЗ
                            Справочник.АР_ГрафикиИзмененияСтавокНаУслуги.ГрафикСтавок КАК АР_ГрафикиИзмененияСтавокНаУслугиГрафикСтавок
                        ГДЕ
                            АР_ГрафикиИзмененияСтавокНаУслугиГрафикСтавок.Дата <= ДАТАВРЕМЯ(2015,5,10)
                        УПОРЯДОЧИТЬ ПО
                            АР_ГрафикиИзмененияСтавокНаУслугиГрафикСтавок.Дата УБЫВ) КАК ВложенныйЗапрос
ПО    АР_ГрафикиИзмененияСтавокНаУслуги.Ссылка.Код = ВложенныйЗапрос.Код

Сразу почему-то не обратил внимания, что результатом вложенного запроса будет всего 1 элемент, а это неправильно. Ну или я неправильно понял подсказку.. Сильно только не пинайте, я начинающий :)
10 фобка
 
14.05.15
11:36
(9) "выбрать первые 1" это 1 или 0 элементов
11 zenik
 
14.05.15
11:50
1. Соединение все же лучше по ссылке элемента делать, а не по коду.
2. Элементы выбирать из справочника, а не из ТЧ. И потом левое соединение с ТЧ по ссылке.

Для каждого элемента справочника будет выбрана крайняя дата не дальше актуальной.
12 DrManhattan
 
14.05.15
12:02
(11) Сейчас попробую, спасибо! Только не понял фразу "Элементы выбирать из справочника, а не из ТЧ". Можно плз фрагмент кода, как не надо и фрагмент, как надо
13 zenik
 
14.05.15
12:34
Ну блин, как то так:
ВЫБРАТЬ
  Справочник.Ссылка
ИЗ Справочник КАК Справочник
ЛЕВОЕ СОЕДИНЕНИЕ (
ВЫБРАТЬ ПЕРВЫЕ 1
  ТабличнаяЧастьСправочника ...

Если выбирать по ТЧ, то не получишь элементов у которых ТЧ пустая.
14 DrManhattan
 
14.05.15
12:46
Так?

ВЫБРАТЬ
    АР_ГрафикиИзмененияСтавокНаУслуги.Ссылка    
ИЗ
    Справочник.АР_ГрафикиИзмененияСтавокНаУслуги КАК АР_ГрафикиИзмененияСтавокНаУслуги
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ПЕРВЫЕ 1
                            АР_ГрафикиИзмененияСтавокНаУслугиГрафикСтавок.Дата КАК Дата,
                            АР_ГрафикиИзмененияСтавокНаУслугиГрафикСтавок.Ставка КАК Ставка,
                            АР_ГрафикиИзмененияСтавокНаУслугиГрафикСтавок.Ссылка КАК Ссылка
                        ИЗ
                            Справочник.АР_ГрафикиИзмененияСтавокНаУслуги.ГрафикСтавок КАК АР_ГрафикиИзмененияСтавокНаУслугиГрафикСтавок
                        ГДЕ
                            АР_ГрафикиИзмененияСтавокНаУслугиГрафикСтавок.Дата <= ДАТАВРЕМЯ(2015,5,10)
                        УПОРЯДОЧИТЬ ПО
                            АР_ГрафикиИзмененияСтавокНаУслугиГрафикСтавок.Дата УБЫВ) КАК ВложенныйЗапрос
ПО    АР_ГрафикиИзмененияСтавокНаУслуги.Ссылка = ВложенныйЗапрос.Ссылка


В результате запроса выдается только ссылка на элемент справочника :(
15 xamass
 
14.05.15
12:53
Вытащи в верхний запрос еще и дату (ВложенныйЗапрос.Дата), тогда будет ссылка и дата (в том случае если таблица не пустая и есть даты больше условия, иначе будет NULL)
16 zenik
 
14.05.15
12:55
Так дописывай что выбираешь по желанию:
ВЫБРАТЬ
    АР_ГрафикиИзмененияСтавокНаУслуги.Код,
    ВложенныйЗапрос.Дата,
    ВложенныйЗапрос.Ставка
...
17 DrManhattan
 
14.05.15
12:56
(15) (16) Получаются одни NULLы во всех строках кроме одной (видимо той единственной, которая является результатом вложенного запроса)
18 xamass
 
14.05.15
13:09
(17)  Да, так и будет, так как верхний запрос вытягивает все значения справочника, а левое соединение делает только ПЕРВЫЕ 1
19 xamass
 
14.05.15
13:10
Убери ПЕРВЫЕ 1, будут даты для всего справочника
20 DrManhattan
 
14.05.15
13:15
(19) Тогда из каждого элемента справочника попадает не только актуальная дата и ставка, но и все <= даты актуальности. А надо чтоб из каждого элемента справочника была только одна актуальная ставка.
21 zenik
 
14.05.15
13:43
(20) тогда может стоит весь твой запрос засунуть во вложенный, сгруппировать по ссылке, и функцию на МАКСИМУМ(Дата)... Ну это если рассматривать вариант (19)
22 DrManhattan
 
14.05.15
13:50
(21) А при этом получится получить ставку соответствующую "максимальной" дате?
23 DrManhattan
 
14.05.15
16:59
Кароч сделал вот так в итоге, если кому интересно

ВЫБРАТЬ
        МАКСИМУМ(АР_ГрафикиИзмененияСтавокНаУслугиГрафикСтавок.Дата) КАК Дата,
        АР_ГрафикиИзмененияСтавокНаУслугиГрафикСтавок.Ссылка КАК Ссылка
ПОМЕСТИТЬ ВТ_АктДаты
ИЗ
        Справочник.АР_ГрафикиИзмененияСтавокНаУслуги.ГрафикСтавок КАК АР_ГрафикиИзмененияСтавокНаУслугиГрафикСтавок
ГДЕ
        АР_ГрафикиИзмененияСтавокНаУслугиГрафикСтавок.Дата <= ДАТАВРЕМЯ(2015,1,1)
СГРУППИРОВАТЬ ПО
        АР_ГрафикиИзмененияСтавокНаУслугиГрафикСтавок.Ссылка
        
;

ВЫБРАТЬ
    АР_ГрафикиИзмененияСтавокНаУслугиГрафикСтавок.Ссылка КАК Ссылка,
    АР_ГрафикиИзмененияСтавокНаУслугиГрафикСтавок.Дата КАК Дата,
    АР_ГрафикиИзмененияСтавокНаУслугиГрафикСтавок.Ставка,
    АР_ГрафикиИзмененияСтавокНаУслугиГрафикСтавок.Ссылка.Код
ПОМЕСТИТЬ ВТ_Ставки
ИЗ
    Справочник.АР_ГрафикиИзмененияСтавокНаУслуги.ГрафикСтавок КАК АР_ГрафикиИзмененияСтавокНаУслугиГрафикСтавок
    
;

ВЫБРАТЬ
*
ИЗ
    ВТ_АктДаты КАК ВТ_АктДаты
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
    ВТ_Ставки КАК ВТ_Ставки
ПО
    ВТ_АктДаты.Ссылка = ВТ_Ставки.Ссылка
    И ВТ_АктДаты.Дата = ВТ_Ставки.Дата


Вроде работает..)
Основная теорема систематики: Новые системы плодят новые проблемы.