Версия для печати темы (https://pro1c.org.ua/index.php?s=2c6214fbb46ec28ad7b0c4f16d6625c3&showtopic=47999)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Управление торговлей для Украины редакция 2 (Управление торговлей для России редакция 10) _ Получить две последние цены товара

Автор: Pashaboston 25.09.18, 13:15

Конфигурация УТ для Украины 2.3.24, платформа 8.3. Вопрос как запросом получить товары у которых менялась цена и получить последнюю и предпоследнюю цену на определенную дату.

Автор: Vladal 26.09.18, 14:10

Pashaboston @ Вчера, 14:15 * ,

Вы уже нашли "срез последних на каждую дату"?

Пока я не перед компьютером, опишу принцип:

1. Выбрать список цен по заданной номенклатуре из обычной таблицы (не из виртуальных СрезПоследних) и поместить во временную таблицу. Она нам пригодится не раз.
Колонки первой таблицы: Номенклатура, Период, Цена

2. Затем соединять таблицу товаров с таблицей цен с максимальной датой (Период <= ДатаПоискаЦен) и поместить во вторую временную таблицу.
Получится таблица с колонками: Номенклатура, Цена1. Период1 - это последние изменения цен на указанную дату.

3. Со второй временной таблицей снова соединить первую таблицу точно таким же способом по условию (Период первой таблицы < Период1 из второй таблицы)
Полученную цену и дату предпоследнего изменения поместить в колонки Цена2 и Период2.

Позже добавлю текст запроса

// может, тему перенести в форум для программистов?

Автор: McTSIMCO 26.09.18, 15:19

Да, только тут нюансы в постановке задачи.
К примеру, должны ли товары попадать в выборку, если предыдущая цена равна последней?

Автор: RedCat77 26.09.18, 16:13

Цитата(McTSIMCO @ 26.09.18, 16:19) *
К примеру, должны ли товары попадать в выборку, если предыдущая цена равна последней?

В запросе использовать "РАЗЛИЧНЫЕ"

Автор: Vladal 26.09.18, 17:11

Цитата(RedCat77 @ 26.09.18, 17:13) *
В запросе использовать "РАЗЛИЧНЫЕ"

РАЗЛИЧНЫЕ отсечет одинаковые строки.
А если выборка будет такой?

Товар1, 01.07.18, 10 грн
Товар2, 02.09.18, 12 грн
Товар2, 01.05.18, 14 грн
Товар1, 02.09.18, 12 грн

Или такой?

Товар1, 01.07.18, 10 грн, 02.09.18, 12 грн
Товар2, 01.06.18, 18 грн, 02.09.18, 12 грн

РАЗЛИЧНЫЕ не помогут.

Автор: Vladal 28.09.18, 13:22

Смотрите, пользуйтесь.

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

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    втНоменклатура.Номенклатура КАК Номенклатура,
    ЕСТЬNULL(втЦеныНоменклатуры.Цена, 0) КАК ПоследняяЦена,
    ЕСТЬNULL(втЦеныНоменклатуры.Период, ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)) КАК ДатаПосленейЦены
ПОМЕСТИТЬ втПоследняяЦена
ИЗ
    втНоменклатура КАК втНоменклатура
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ втЦеныНоменклатуры КАК втЦеныНоменклатуры
        ПО втНоменклатура.Номенклатура = втЦеныНоменклатуры.Номенклатура
            И (втЦеныНоменклатуры.Период В
                (ВЫБРАТЬ ПЕРВЫЕ 1
                    втЦеныНоменклатуры.Период КАК Период
                ИЗ
                    втЦеныНоменклатуры КАК втЦеныНоменклатуры
                ГДЕ
                    втЦеныНоменклатуры.Период <= &ДатаПолученияЦен
                    И втЦеныНоменклатуры.Номенклатура = втНоменклатура.Номенклатура
                УПОРЯДОЧИТЬ ПО
                    Период УБЫВ))
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    втПоследняяЦена.Номенклатура КАК Номенклатура,
    втПоследняяЦена.ПоследняяЦена КАК ПоследняяЦена,
    втПоследняяЦена.ДатаПосленейЦены КАК ДатаПосленейЦены,
    ЕСТЬNULL(втЦеныНоменклатуры.Цена, 0) КАК ПредпоследняяЦена,
    ЕСТЬNULL(втЦеныНоменклатуры.Период, ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)) КАК ДатаПредпоследнейЦены
ИЗ
    втПоследняяЦена КАК втПоследняяЦена
        ЛЕВОЕ СОЕДИНЕНИЕ втЦеныНоменклатуры КАК втЦеныНоменклатуры
        ПО втПоследняяЦена.Номенклатура = втЦеныНоменклатуры.Номенклатура
            И (втЦеныНоменклатуры.Период В
                (ВЫБРАТЬ ПЕРВЫЕ 1
                    втЦеныНоменклатуры.Период КАК Период
                ИЗ
                    втЦеныНоменклатуры КАК втЦеныНоменклатуры
                ГДЕ
                    втЦеныНоменклатуры.Период < втПоследняяЦена.ДатаПосленейЦены
                    И втЦеныНоменклатуры.Номенклатура = втПоследняяЦена.Номенклатура
                УПОРЯДОЧИТЬ ПО
                    Период УБЫВ))

УПОРЯДОЧИТЬ ПО
    Номенклатура,
    ДатаПосленейЦены,
    ДатаПредпоследнейЦены
АВТОУПОРЯДОЧИВАНИЕ


В результате будет таблица с последними двумя ценами номенклатуры с указанием дат установки цены.

Если надо сгруппировать по товару, то просто в последнем подзапросе таблицы не соединять, а объединять и потом сгруппировать по номенклатуре.


Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua