Имя: Пароль:
1C
1С v8
Нужна помощь по запросу
,
0 WED
 
03.04.16
13:46
1. Есть Документ1
У Документ1 есть реквизит Дата.
Также есть табличная часть Материалы.
В Материалы есть реквизиты
Номенклатура - СправочникСсылка и
Количество - число.

2. Есть регистр сведений "ЦеныНоменклатуры". В нем есть
Измерения:
Период - ДатаВремя,
Номенклатура - справочник,
Валюта - справочник,
ТипЦен - справочник,

Ресурс:
Цена - число

Задача:
Получить сумму в заданном типе цен и валюте для номенклатуры прошедшей в Материалы в Документ1 за период с Дата1 по Дата2. При этом цена (по которой считать сумму) должна быть последней на дату каждого Документ1

Все это надо одним запросом.
Никак я с ним не могу сообразить...

Понимаю, что надо получить пары Номенклатура-Дата (с Количество у каждой пары):

ВЫБРАТЬ
    Документ1Материалы.Номенклатура КАК Номенклатура,
    Документ1Материалы.Количество КАК Количество,
    Документ1Материалы.Ссылка.Дата КАК Дата
ПОМЕСТИТЬ ТаблНоменклатуры
ИЗ
    Документ.Документ1.Материалы КАК Документ1Материалы
ГДЕ
    Документ1Материалы.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
    И Документ1Материалы.Ссылка.Проведен
Поместить в ТаблНоменлатуры


А вот как получить последнюю цену (с отбором по типуц цен и валюте) для каждой строки в ТаблНоменклатуры ?
1 WED
 
03.04.16
13:48
Получить последнюю цену для 1 номенклатуры проблем нет ,а вот как для таблицы?
2 Джинн
 
03.04.16
13:52
3 WED
 
03.04.16
14:09
(2) Увы, видел. Там ресурс (курс в их примере, цена - в моем) получают либо на дату, либо по регистратору), а у меня таблица с Номенклатура-Дата, т.е. Дата не задана, а в таблице
4 WED
 
03.04.16
14:16
Вот таким запросом я получаю две таблицы:

ТаблМатериалы - материалы прошедшие в документах за период
и ТаблЦеныНоменклатуры - все цены на номенклатуру из ТаблМатериалы

но не могу никак соединить их между собой так, чтобы
для каждой строки в ТаблМатериалы (а это Номенклатура,Количество,Дата) взять последнюю из ТаблЦеныНоменклатуры

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЦеныНоменклатуры.Номенклатура,
    ЦеныНоменклатуры.Цена,
    ЦеныНоменклатуры.Период
ПОМЕСТИТЬ ТаблЦеныНоменклатуры
ИЗ
    РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
ГДЕ
    ЦеныНоменклатуры.Номенклатура В
            (ВЫБРАТЬ
                ТаблНоменклатуры.Номенклатура
            ИЗ
                ТаблНоменклатуры)
    И ЦеныНоменклатуры.ТипЦен = &ТипЦен
    И ЦеныНоменклатуры.Валюта = &Валюта
5 hhhh
 
03.04.16
14:20
а где знак >= ? Или <= ? Ты (2) читал?
6 WED
 
03.04.16
14:24
(5) Читал. Но твой вопрос не понял
7 WED
 
03.04.16
16:02
В (2) цены берутся на заранее заднную ДАТУ, у меня же даты нет, точнее для каждой строки таблицы ТаблМатериалы дата своя.

Есть идеи как запросом взять из регистра последнюю цену на дату из каждой строки ТаблМатериалы ?
8 Джинн
 
03.04.16
16:08
(7) Ептыть, перестаньте курить, включите мозг!

Какая разница в какой таблице что лежит? Вам принцип продемонстрировали - выбрали все даты, получили максимальное значение периодического регистра сведений с периодом меньшим этих дат. А дальше соединить таблицы.

Не пытайтесь скопировать, попытайтесь понять принцип.
9 ВРедная
 
03.04.16
16:08
(7) Где ты в (2) увидел, что цена берется на заданную дату?
Там запрос, которым собираются цены на целую кучу дат, которые получаются там же в запросе.
10 WED
 
03.04.16
16:25
Да, спасибо! Уже разобрался.
Итоговый запрос:

ВЫБРАТЬ
    ТребованиеНакладнаяМатериалы.Номенклатура КАК Номенклатура,
    ТребованиеНакладнаяМатериалы.Количество КАК Количество,
    ТребованиеНакладнаяМатериалы.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
    ТребованиеНакладнаяМатериалы.Ссылка.Дата КАК Период
ПОМЕСТИТЬ Продажи
ИЗ
    Документ.ТребованиеНакладная.Материалы КАК ТребованиеНакладнаяМатериалы
ГДЕ
    ТребованиеНакладнаяМатериалы.Ссылка.Организация = &Организация
    И ТребованиеНакладнаяМатериалы.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
    И ТребованиеНакладнаяМатериалы.Ссылка.Проведен
;

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Продажи.Номенклатура КАК Номенклатура,
    СУММА(Продажи.Количество) КАК Количество,
    ВЫРАЗИТЬ(СУММА(ЦеныПериоды.Цена * Продажи.Количество) КАК ЧИСЛО(15, 2)) КАК СтоимостьЗакупки
ИЗ
    Продажи КАК Продажи
        ЛЕВОЕ СОЕДИНЕНИЕ ЦеныПериоды КАК ЦеныПериоды
        ПО Продажи.Номенклатура = ЦеныПериоды.Номенклатура
            И Продажи.Период = ЦеныПериоды.Период

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

УПОРЯДОЧИТЬ ПО
    Номенклатура,
    СтоимостьЗакупки
11 WED
 
03.04.16
16:26
Точнее вот так:


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

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТаблМатериалы.Номенклатура КАК Номенклатура,
    СУММА(ТаблМатериалы.Количество) КАК Количество,
    ВЫРАЗИТЬ(СУММА(ЦеныПериоды.Цена * ТаблМатериалы.Количество) КАК ЧИСЛО(15, 2)) КАК СтоимостьЗакупки
ИЗ
    ТаблМатериалы КАК ТаблМатериалы
        ЛЕВОЕ СОЕДИНЕНИЕ ЦеныПериоды КАК ЦеныПериоды
        ПО ТаблМатериалы.Номенклатура = ЦеныПериоды.Номенклатура
            И ТаблМатериалы.Период = ЦеныПериоды.Период

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

УПОРЯДОЧИТЬ ПО
    Номенклатура,
    СтоимостьЗакупки
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший