Работа с запросами. Получение последней цены товара из табличной части документа. Несколько вариантов

На нескольких собеседованиях это спрашивали, решил поделиться. Обычно я использую вариант №2. Остальные варианты нашел в интернете.

Задача. Есть список документов поступлений. Написать запрос, который получает последнюю цену товара из табличной части документа.

Вариант №1. Нашел в интернете.

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

 

Вариант №2. так делаю я, работает быстрее варианта №1.

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

СГРУППИРОВАТЬ ПО
ПоступлениеТоваровУслугТовары.Номенклатура,
ПоступлениеТоваровУслугТовары.ХарактеристикаНоменклатуры

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

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

 

Вариант №3. Нашел в интернете.

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

СГРУППИРОВАТЬ ПО
ПоступлениеТоваровУслугТовары.Номенклатура) КАК ВложенныйЗапрос
ПО ПоступлениеТоваровУслугТовары.Ссылка.Дата = ВложенныйЗапрос.Дата
И ПоступлениеТоваровУслугТовары.Номенклатура = ВложенныйЗапрос.Номенклатура

 

Проверял на конфигурации Управление производственным предприятием, редакция 1.3 (1.3.49.1) .

Какие еще есть варианты решения этой задачи через запросы? Поделитесь, добавлю в статью.

25 Comments

  1. wowik

    За интересный ответ и комментарий добавлено вознаграждение)

    Reply
  2. pm74

    (1) для учебных примерв сойдет , в реале может быть такое :

    -2 одинаковых строки с номенклатурой и разными ценами ,

    -несколько поступлений одной датой ,

    — разные валюты , упаковки

    — разный способ учета НДС в цене,

    + цена = 1 (классика)

    Reply
  3. acanta

    Разный способ учёта НДС в цене это вообще пестня. Объясните мне темной почему это не функциональная опция или хотя бы учётная политика?

    И почему в базе нет полей с НДС и без НДС, а надо рассчитывать это динамически в запросе.

    Reply
  4. capitan

    Есть добрый и рекомендованный совет, задающим такие вопросы на собеседованиях — не получать такие вещи из документов, на это существуют регистры )

    Reply
  5. HEKPOH

    Если на собеседовании принимают такие решения как правильные, то это грусть

    Reply
  6. wowik

    (4)https://infostart.ru/public/236627/ — бывает еще хуже)

    Reply
  7. wowik

    (6) примеры незаконченные. Понятно что могут учитываться проведенные, помеченные на удаление и т.д. как в (2). Это уже потом начинаются фантики.

    Цель статьи донести возможные варианты.

    Вот всем понятен вариант №1?

    Можете объяснить вариант №1? почему он так работает? И почему вообще работает?

    Reply
  8. AlX0id

    А вот за второй вариант дал бы в голову больно..

    Какого *я сначала получаем даты по всей номенклатуре, собираем их в таблицу, чтобы потом во втором запросе отобрать по номенклатуре??

    И еще — если с вас будут просить на собеседовании собрать подобные данные с табличных частей документов — сразу шлите их в неприличном направлении. Если люди знающие — пойдут и вас на работу возьмут впридачу. Если не знающие — нечего вам у них делать.

    Reply
  9. wowik

    (9) эти придирки к мелочам, коллега))

    Reply
  10. AlX0id

    (10)

    Зависит от должности, на которую вы претендуете.. Если разработчик-падаван, то вас с руками оторвут с такими запросами. Если что-то большее — то уже начнут общение с этих «мелочей» (которые могут колом базу поставить вообще говоря). А оно вам надо начинать общение с вот такой ноты?

    Reply
  11. wowik

    (11) в (10) имелось ввиду что да, надо мелочи предусматривать. Здесь запросы урезанные в примерах, даже без учета характеристик. Меньше текста, чтобы лучше были видны разные подходы получения данных.

    Reply
  12. vipchep

    там где получение реквизита через «.» можно заменить на левое соединение, по идее должно ускорить запрос

    
    МАКСИМУМ(ПоступлениеТоваровУслугСсылка.Дата) КАК Дата,
    ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура
    ИЗ
    Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
    левое соединение
    Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслугСсылка
    по
    ПоступлениеТоваровУслугСсылка.Ссылка = ПоступлениеТоваровУслугТовары.Ссылка
    Где
    ЕстьNULL(ПоступлениеТоваровУслугСсылка.Ссылка,0) <> 0
    
    

    Показать

    Reply
  13. androidT1C

    А теперь представим, что могут быть два документа с одним товаром и одинаковой датой. И получаем задвоение строк в запросах 2 и 3.

    Кроме того, в запросах 1 и 3 не учтены характеристики (хотя 3, по сути, тот же 2).

    Reply
  14. rudnitskij

    (13) Если через одну точку — оно особо не ускоряет. При обращении через одну точку база строит такое же левое соединение, как вы предлагаете написать. А если идет обращение через две — то там уже надо

    Reply
  15. bulpi

    Способ (1) работает не на всех релизах. Начиная с какого-то релиза, я точно не знаю.

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

    Показать

    Чем такой вариант плох?

    Reply
  17. МимохожийОднако

    Как может выглядеть запрос для получения списка документов Установка цен номенклатуры, в которых неактуальные цены (не последние)?

    Например, для УТ10.3 или КА1.1

    Reply
  18. wowik

    (17) неплох, но если не одна номенклатура? Получать в цикле? В публикации рассмотрено получение последних цен для списка номенклатуры.

    Reply
  19. echo77

    (0) Вариант 2 и 3, по сути одно и тоже: одном случае последнюю дату помещаем в ВТ в другом во вложенный запрос. Или нет?

    Если будет несколько документов с одной и номенклатурой на одну дату, например 31.05.2019 23:59:59 то будет несколько «последних» цен номенклатуры.

    Reply
  20. DataReducer

    (8) Дал развёрнутый ответ здесь

    Reply
  21. wowik

    (20)

    Если будет несколько документов с одной и номенклатурой на одну дату, например 31.05.2019 23:59:59 то будет несколько «последних» цен номенклатуры.

    да, это уже сказано в (2)

    Reply
  22. wowik

    (20)

    Вариант 2 и 3, по сути одно и тоже: одном случае последнюю дату помещаем в ВТ в другом во вложенный запрос. Или нет?

    да,только вариант 3 работает намного медленнее.

    Reply
  23. wowik

    статья стала поводом для написания более подробной статьи — https://infostart.ru/public/1073908/ . Спасибо автору за интерес.

    Reply
  24. wowik

    (20) временные таблицы появились в 8.1, ранее только через вариант 3 можно было. Я еще попал в те времена, когда не было временных таблиц)

    Reply
  25. gloom_prov

    Не знаю как кто относиться к таким запросам но с разбором почему быстрее с анализам плана, это респект. Но хочу сказать что часто приходится иметь бубен. И на 100% согласен что строить запросы к документам это печаль.

    Вот к чему привели меня пользователи )) Будни по производству. Вот ту как раз и используются механизмы последнего ))) Может если будит много запросов так и по выкладываю обработки. Тут идет подсчет плановой себестоимости по всем полуфабрикатам одно этапного производства по заданным Ресурсным спецификациям.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *