Имя: Пароль:
1C
1С v8
Выбор в запросе 1С (Бухгалтерия 3.0) цен из предпоследнего документа Поступление
0 mistergluck
 
18.08.16
11:51
Добрый день., помогите решить задачу: необходимо запросом получить цены списка номенклатуры из предпоследнего документа поступления товаров и услуг, в котором эта номенклатура встречается. Конфигурация Бухгалтерия предприятия 3.0,(хотя это не так важно). Собственно для последнего документа:
ВЫБРАТЬ
    ПослуплениеТоваровУслугТовары.Номенклатура,
    ПослуплениеТоваровУслугТовары.Цена
ИЗ
    Документ.ПоступлениеТоваровУслуг.Товары КАК ПослуплениеТоваровУслугТовары
ГДЕ
    ПослуплениеТоваровУслугТовары.Ссылка В
            (ВЫБРАТЬ ПЕРВЫЕ 1
                РегПериод.Ссылка
            ИЗ
                Документ.ПоступлениеТоваровУслуг.Товары КАК РегПериод
            ГДЕ
                РегПериод.Номенклатура = ПослуплениеТоваровУслугТовары.Номенклатура
                И РегПериод.Ссылка.Проведен = ИСТИНА
            УПОРЯДОЧИТЬ ПО
                РегПериод.Ссылка.Дата УБЫВ)
    И ПослуплениеТоваровУслугТовары.Номенклатура В(&Номенклатура)
    И ПослуплениеТоваровУслугТовары.Ссылка.Проведен = ИСТИНА


Для Двух последних начал вот с чего:

ВЫБРАТЬ
    ПослуплениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
    ПослуплениеТоваровУслугТовары.Цена,
    ПослуплениеТоваровУслугТовары.Ссылка.Дата КАК Дата
ИЗ
    Документ.ПоступлениеТоваровУслуг.Товары КАК ПослуплениеТоваровУслугТовары
ГДЕ
    ПослуплениеТоваровУслугТовары.Ссылка В
            (ВЫБРАТЬ ПЕРВЫЕ 2
                РегПериод.Ссылка
            ИЗ
                Документ.ПоступлениеТоваровУслуг.Товары КАК РегПериод
            ГДЕ
                РегПериод.Номенклатура = ПослуплениеТоваровУслугТовары.Номенклатура
                И РегПериод.Ссылка.Проведен = ИСТИНА
            УПОРЯДОЧИТЬ ПО
                РегПериод.Ссылка.Дата УБЫВ)
    И ПослуплениеТоваровУслугТовары.Номенклатура В(&Номенклатура)
    И ПослуплениеТоваровУслугТовары.Ссылка.Проведен = ИСТИНА

УПОРЯДОЧИТЬ ПО
    Номенклатура,
    Дата


Сейчас при выводе в отчете в цикле выбираю только первую цену, вторую игнорирую, но хотелось бы сделать все в запросе.
1 lodger
 
18.08.16
12:33
прикольно.
а сделай через вложенные запросы.
например так:

ВЫБРАТЬ
    ВложенныйЗапрос.Цена КАК Цена,
    ВложенныйЗапрос.Дата КАК Дата,
    ВложенныйЗапрос.Номенклатура КАК Номенклатура
ИЗ
    (ВЫБРАТЬ ПЕРВЫЕ 1
        ВложенныйЗапрос1.Цена КАК Цена,
        ВложенныйЗапрос1.Дата КАК Дата,
        ВложенныйЗапрос1.Номенклатура КАК Номенклатура
    ИЗ
        (ВЫБРАТЬ ПЕРВЫЕ 2
            ПоступлениеТоваровУслугТовары.Цена КАК Цена,
            ПоступлениеТоваровУслугТовары.Ссылка.Дата КАК Дата,
            ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура
        ИЗ
            Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
        ГДЕ
            ПоступлениеТоваровУслугТовары.Ссылка.Проведен
            И ПоступлениеТоваровУслугТовары.Номенклатура В(&Номенклатура)
        
        УПОРЯДОЧИТЬ ПО
            Дата УБЫВ) КАК ВложенныйЗапрос1
    
    УПОРЯДОЧИТЬ ПО
        Дата) КАК ВложенныйЗапрос

кто предложит еще более извращенный вариант?
2 gero
 
18.08.16
12:42
(0)
Документов вида Поступления с одинаковыми датами в инф. базе не встречается?
3 mistergluck
 
18.08.16
12:54
(1) не работает, выводит цену только одной номенклатуры
(2) документы поступления могут быть одной даты, но разного времени
4 Новиков
 
18.08.16
14:33
ВЫБРАТЬ
    Номенклатура.Ссылка КАК Номенклатура
ПОМЕСТИТЬ ТаблицаНоменклатуры
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Ссылка В(&СписокНоменклатуры)
;

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

ИНДЕКСИРОВАТЬ ПО
    ТЧТовары.Номенклатура,
    ДатаДок
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТСрезПоследних.Номенклатура КАК Номенклатура,
    МАКСИМУМ(ТЧ.Ссылка.Дата) КАК ДатаДок
ПОМЕСТИТЬ ВТСрезПредпоследних
ИЗ
    ВТСрезПоследних КАК ВТСрезПоследних
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг.Товары КАК ТЧ
        ПО ВТСрезПоследних.Номенклатура = ТЧ.Номенклатура
            И ВТСрезПоследних.ДатаДок > ТЧ.Ссылка.Дата

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

ИНДЕКСИРОВАТЬ ПО
    Номенклатура,
    ДатаДок
;

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

;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТаблицаНоменклатуры.Номенклатура КАК Номенклатура,
    ISNULL(ВТНоменклатураСЦенами.ДатаДок, ДАТАВРЕМЯ(0001, 1, 1, 0, 0, 0)) КАК ДатаДок,
    ISNULL(ВТНоменклатураСЦенами.Цена,0) КАК Цена
ИЗ
    ТаблицаНоменклатуры КАК ТаблицаНоменклатуры
        ЛЕВОЕ СОЕДИНЕНИЕ ВТНоменклатураСЦенами КАК ВТНоменклатураСЦенами
        ПО ТаблицаНоменклатуры.Номенклатура = ВТНоменклатураСЦенами.Номенклатура
5 Новиков
 
18.08.16
14:40
Пояснения

1. Если предпоследней цены нет, а есть последняя - считаю что ее цена = 0. Если хотите, чтобы цена выводилась последняя, предлагаю самостоятельно приклеить последнюю цену. Это совершенно не сложно.
2. Если цены вообще нет - считаю, что ее цена = 0. Если это не устраивает, то просто уберите крайнюю выборку, и сделайте оную из ВТНоменклатураСЦенами.
3. В моем решение есть место для вашего таланта по оптимизации запроса. Я такой цели не преследовал.

А задание интересное. Вполне можно давать на собеседовании, чтоб понять - работал ли человек с запросами или нет.
6 mistergluck
 
19.08.16
04:09
Спасибо за верное решение, оно мне навеяло вариант с выбрать первые 1 и 2: Вот тоже рабочий вариант:
[code]
ВЫБРАТЬ
    ПослуплениеТоваровУслугТовары.Ссылка.Дата КАК Дата,
    ПослуплениеТоваровУслугТовары.Номенклатура КАК Номенклатура
ПОМЕСТИТЬ СрезПоследних
ИЗ
    Документ.ПоступлениеТоваровУслуг.Товары КАК ПослуплениеТоваровУслугТовары
ГДЕ
    ПослуплениеТоваровУслугТовары.Ссылка В
            (ВЫБРАТЬ ПЕРВЫЕ 1
                РегПериод.Ссылка
            ИЗ
                Документ.ПоступлениеТоваровУслуг.Товары КАК РегПериод
            ГДЕ
                РегПериод.Номенклатура = ПослуплениеТоваровУслугТовары.Номенклатура
                И РегПериод.Ссылка.Проведен = ИСТИНА
            УПОРЯДОЧИТЬ ПО
                РегПериод.Ссылка.Дата УБЫВ)
    И ПослуплениеТоваровУслугТовары.Номенклатура В(&Номенклатура)
;

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    СрезДвухПоследних.Номенклатура,
    СрезДвухПоследних.Цена
ИЗ
    СрезДвухПоследних КАК СрезДвухПоследних
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ СрезПоследних КАК СрезПоследних
        ПО СрезДвухПоследних.Номенклатура = СрезПоследних.Номенклатура
            И СрезДвухПоследних.Дата <> СрезПоследних.Дата

[/code]
7 mistergluck
 
25.08.16
12:49
+code
ВЫБРАТЬ

    ПослуплениеТоваровУслугТовары.Ссылка КАК Ссылка,
    ПослуплениеТоваровУслугТовары.Номенклатура КАК Номенклатура
ПОМЕСТИТЬ СрезПоследних
ИЗ

    Документ.ПоступлениеТоваровУслуг.Товары КАК ПослуплениеТоваровУслугТовары

ГДЕ

    ПослуплениеТоваровУслугТовары.Ссылка В
            (ВЫБРАТЬ ПЕРВЫЕ 1
                РегПериод.Ссылка
            ИЗ
                Документ.ПоступлениеТоваровУслуг.Товары КАК РегПериод

            ГДЕ
                РегПериод.Номенклатура = ПослуплениеТоваровУслугТовары.Номенклатура
                И РегПериод.Ссылка.Проведен = ИСТИНА
            УПОРЯДОЧИТЬ ПО
                РегПериод.Ссылка.Дата УБЫВ)

    И ПослуплениеТоваровУслугТовары.Номенклатура В(&Номенклатура)
;

////////////////////////////////////////////////////////////////////////////////

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

    Документ.ПоступлениеТоваровУслуг.Товары КАК ПослуплениеТоваровУслугТовары

ГДЕ

    ПослуплениеТоваровУслугТовары.Ссылка В
            (ВЫБРАТЬ ПЕРВЫЕ 2
                РегПериод.Ссылка
            ИЗ
                Документ.ПоступлениеТоваровУслуг.Товары КАК РегПериод

            ГДЕ
                РегПериод.Номенклатура = ПослуплениеТоваровУслугТовары.Номенклатура
                И РегПериод.Ссылка.Проведен = ИСТИНА
            УПОРЯДОЧИТЬ ПО
                РегПериод.Ссылка.Дата УБЫВ)

    И ПослуплениеТоваровУслугТовары.Номенклатура В(&Номенклатура)
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    СрезДвухПоследних.Номенклатура,
    СрезДвухПоследних.Цена
ИЗ
    СрезДвухПоследних КАК СрезДвухПоследних
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ СрезПоследних КАК СрезПоследних
        ПО СрезДвухПоследних.Номенклатура = СрезПоследних.Номенклатура
            И СрезДвухПоследних.Ссылка <> СрезПоследних.Ссылка
8 ovrfox
 
09.09.16
13:30
Да зачем так сложно, если выборка первых двух уже есть
ВЫБРАТЬ
    ПослуплениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
    ПослуплениеТоваровУслугТовары.Цена,
    ПослуплениеТоваровУслугТовары.Ссылка.Дата КАК Дата
Поместить ПервыеДва
ИЗ
    Документ.ПоступлениеТоваровУслуг.Товары КАК ПослуплениеТоваровУслугТовары
ГДЕ
    ПослуплениеТоваровУслугТовары.Ссылка В
            (ВЫБРАТЬ ПЕРВЫЕ 2
                РегПериод.Ссылка
            ИЗ
                Документ.ПоступлениеТоваровУслуг.Товары КАК РегПериод
            ГДЕ
                РегПериод.Номенклатура = ПослуплениеТоваровУслугТовары.Номенклатура
                И РегПериод.Ссылка.Проведен = ИСТИНА
            УПОРЯДОЧИТЬ ПО
                РегПериод.Ссылка.Дата УБЫВ)
    И ПослуплениеТоваровУслугТовары.Номенклатура В(&Номенклатура)
    И ПослуплениеТоваровУслугТовары.Ссылка.Проведен = ИСТИНА

Индексировать ПО
    Номенклатура,
    Дата
;
Выбрать ПервыеДва.Номенклатура,
      ПервыеДва.Дата,
      ПервыеДва.Цена
Из ПервыеДва как ПервыеДва
Где ПервыеДва.Дата в (Выбрать Первые 1 ПР.Дата
             из ПервыеДва Как ПР
             где ПР.Номенклатура = ПервыеДва.Номенклатура
             Упорядочить по ПР.Дата)
9 ovrfox
 
09.09.16
13:33
Т.к. даты могут совпасть, то более правильный вариант будет
Выбрать ПервыеДва.Номенклатура,
      ПервыеДва.Дата,
      ПервыеДва.Цена
Из ПервыеДва как ПервыеДва
Где (ПервыеДва.Дата , ПервыеДва.Номенклатура )в (Выбрать Первые 1 ПР.Дата, ПР.Номенклатура
             из ПервыеДва Как ПР
             где ПР.Номенклатура = ПервыеДва.Номенклатура
             Упорядочить по ПР.Дата)