Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Выбор в запросе 1С (Бухгалтерия 3.0) цен из предпоследнего документа Поступление

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


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

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

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


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

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

кто предложит еще более извращенный вариант?
   gero
 
2 - 18.08.16 - 12:42
(0)
Документов вида Поступления с одинаковыми датами в инф. базе не встречается?
   mistergluck
 
3 - 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. В моем решение есть место для вашего таланта по оптимизации запроса. Я такой цели не преследовал.

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

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

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

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

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

[/code]
   mistergluck
 
7 - 25.08.16 - 12:49
+code
ВЫБРАТЬ
    ПослуплениеТоваровУслугТовары.Ссылка КАК Ссылка,
    ПослуплениеТоваровУслугТовары.Номенклатура КАК Номенклатура
ПОМЕСТИТЬ СрезПоследних
ИЗ

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

ГДЕ

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

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

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

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


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

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

ГДЕ

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

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

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

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


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

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

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.