Получить последние 3 документа

1. aleks xantaev 8 13.01.17 18:19 Сейчас в теме
Подскажите как получить последние 3 документа прихода в запросе по номенклатуре.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. alex-l19041 8 13.01.17 18:25 Сейчас в теме
(1) вот пример как получить последнюю и предпоследнюю запись (может поможет)

ВЫБРАТЬ
    "Номенклатура1" КАК Номенклатура,
    "Состояние1" КАК Состояние,
    ДАТАВРЕМЯ(2016, 8, 1) КАК Период
ПОМЕСТИТЬ Регистр

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    "Номенклатура1",
    "Состояние2",
    ДАТАВРЕМЯ(2016, 8, 2)

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    "Номенклатура1",
    "Состояние3",
    ДАТАВРЕМЯ(2016, 8, 3)

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    "Номенклатура1",
    "Состояние4",
    ДАТАВРЕМЯ(2016, 8, 4)
;

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

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

////////////////////////////////////////////////////////////­­////////////////////
ВЫБРАТЬ
    регистр.Номенклатура,
    МАКСИМУМ(регистр.Период) КАК ДатаПоследнегоСостояния
ПОМЕСТИТЬ ВТ_ПоследнееСостояние
ИЗ
    Регистр КАК регистр

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

////////////////////////////////////////////////////////////­­////////////////////
ВЫБРАТЬ
    Регистр.Номенклатура,
    МАКСИМУМ(Регистр.Период) КАК ДатаПредпоследнегоСостояния
ПОМЕСТИТЬ ВТ_ПредпоследнееСостояние
ИЗ
    Регистр КАК Регистр
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ПоследнееСостояние КАК ВТ_ПоследнееСостояние
        ПО Регистр.Номенклатура = ВТ_ПоследнееСостояние.Номенклатура
            И Регистр.Период = ВТ_ПоследнееСостояние.ДатаПоследнегоСостояния
ГДЕ
    ВТ_ПоследнееСостояние.Номенклатура ЕСТЬ NULL 

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

////////////////////////////////////////////////////////////­­////////////////////
ВЫБРАТЬ
    ВТ_ПервоеСостояние.Номенклатура,
    РегистрДляПервого.Состояние КАК ПервоеСостояние,
    РегистрДляПредпоследнего.Состояние КАК ПредпоследнееСостояние,
    РегистрДляПоследнего.Состояние КАК ПоследнееСостояние
ИЗ
    ВТ_ПервоеСостояние КАК ВТ_ПервоеСостояние
        ЛЕВОЕ СОЕДИНЕНИЕ Регистр КАК РегистрДляПервого
        ПО ВТ_ПервоеСостояние.Номенклатура = РегистрДляПервого.Номенклатура
            И ВТ_ПервоеСостояние.ДатаПервогоСостояния = РегистрДляПервого.Период
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ПредпоследнееСостояние КАК ВТ_ПредпоследнееСостояние
        ПО ВТ_ПервоеСостояние.Номенклатура = ВТ_ПредпоследнееСостояние.Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ Регистр КАК РегистрДляПредпоследнего
        ПО (ВТ_ПредпоследнееСостояние.Номенклатура = РегистрДляПредпоследнего.Номенклатура)
            И (ВТ_ПредпоследнееСостояние.ДатаПредпоследнегоСостояния = РегистрДляПредпоследнего.Период)
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ПоследнееСостояние КАК ВТ_ПоследнееСостояние
        ПО ВТ_ПервоеСостояние.Номенклатура = ВТ_ПоследнееСостояние.Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ Регистр КАК РегистрДляПоследнего
        ПО (ВТ_ПоследнееСостояние.Номенклатура = РегистрДляПоследнего.Номенклатура)
            И (ВТ_ПоследнееСостояние.ДатаПоследнегоСостояния = РегистрДляПоследнего.Период)
Показать
Shaldryn; +1 Ответить
8. пользователь 04.06.20 12:25
Сообщение было скрыто модератором.
...
9. Jovi 04.06.20 12:28 Сейчас в теме
(1) Вот как я получал три последние реализации по номенклатуре:
ВЫБРАТЬ
	Продажи.Номенклатура КАК Номенклатура
ПОМЕСТИТЬ НоменклатураВозвратов
ИЗ
	РегистрНакопления.Продажи КАК Продажи
ГДЕ
	Продажи.Регистратор ССЫЛКА Документ.ВозвратТоваровОтПокупателя
	И НАЧАЛОПЕРИОДА(Продажи.Период, ДЕНЬ) = &ДатаВозврата

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

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

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

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

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

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	МАКСИМУМ(РеализацииНоменклатуыВозвратов.ДатаРеализации) КАК ДатаРеализации,
	РеализацииНоменклатуыВозвратов.Номенклатура КАК Номенклатура
ПОМЕСТИТЬ ВтороеСостояние
ИЗ
	РеализацииНоменклатуыВозвратов КАК РеализацииНоменклатуыВозвратов
		ЛЕВОЕ СОЕДИНЕНИЕ ПервоеСостояние КАК ПервоеСостояние
		ПО РеализацииНоменклатуыВозвратов.Номенклатура = ПервоеСостояние.Номенклатура
			И РеализацииНоменклатуыВозвратов.ДатаРеализации = ПервоеСостояние.ДатаРеализации
ГДЕ
	ПервоеСостояние.Номенклатура ЕСТЬ NULL

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

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	МАКСИМУМ(РеализацииНоменклатуыВозвратов.ДатаРеализации) КАК ДатаРеализации,
	РеализацииНоменклатуыВозвратов.Номенклатура КАК Номенклатура
ПОМЕСТИТЬ ТретьеСостояние
ИЗ
	РеализацииНоменклатуыВозвратов КАК РеализацииНоменклатуыВозвратов
		ЛЕВОЕ СОЕДИНЕНИЕ ПервоеСостояние КАК ПервоеСостояние
		ПО РеализацииНоменклатуыВозвратов.Номенклатура = ПервоеСостояние.Номенклатура
			И РеализацииНоменклатуыВозвратов.ДатаРеализации = ПервоеСостояние.ДатаРеализации
		ЛЕВОЕ СОЕДИНЕНИЕ ВтороеСостояние КАК ВтороеСостояние
		ПО РеализацииНоменклатуыВозвратов.Номенклатура = ВтороеСостояние.Номенклатура
			И РеализацииНоменклатуыВозвратов.ДатаРеализации = ВтороеСостояние.ДатаРеализации
ГДЕ
	ВтороеСостояние.Номенклатура ЕСТЬ NULL
	И ПервоеСостояние.Номенклатура ЕСТЬ NULL

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

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ПервоеСостояние.Номенклатура КАК Номенклатура,
	РеализацииНоменклатуыВозвратов.Реализация КАК Реализация
ИЗ
	ПервоеСостояние КАК ПервоеСостояние
		ЛЕВОЕ СОЕДИНЕНИЕ РеализацииНоменклатуыВозвратов КАК РеализацииНоменклатуыВозвратов
		ПО ПервоеСостояние.Номенклатура = РеализацииНоменклатуыВозвратов.Номенклатура
			И ПервоеСостояние.ДатаРеализации = РеализацииНоменклатуыВозвратов.ДатаРеализации

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	ВтороеСостояние.Номенклатура,
	РеализацииНоменклатуыВозвратов.Реализация
ИЗ
	ВтороеСостояние КАК ВтороеСостояние
		ЛЕВОЕ СОЕДИНЕНИЕ РеализацииНоменклатуыВозвратов КАК РеализацииНоменклатуыВозвратов
		ПО ВтороеСостояние.Номенклатура = РеализацииНоменклатуыВозвратов.Номенклатура
			И ВтороеСостояние.ДатаРеализации = РеализацииНоменклатуыВозвратов.ДатаРеализации

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	ТретьеСостояние.Номенклатура,
	РеализацииНоменклатуыВозвратов.Реализация
ИЗ
	ТретьеСостояние КАК ТретьеСостояние
		ЛЕВОЕ СОЕДИНЕНИЕ РеализацииНоменклатуыВозвратов КАК РеализацииНоменклатуыВозвратов
		ПО ТретьеСостояние.Номенклатура = РеализацииНоменклатуыВозвратов.Номенклатура
			И ТретьеСостояние.ДатаРеализации = РеализацииНоменклатуыВозвратов.ДатаРеализации

УПОРЯДОЧИТЬ ПО
	Реализация УБЫВ,
	Номенклатура
ИТОГИ
	КОЛИЧЕСТВО(Реализация)
ПО
	Номенклатура
АВТОУПОРЯДОЧИВАНИЕ
Показать
Shaldryn; +1 Ответить
2. bad_wag 48 13.01.17 18:25 Сейчас в теме
ВЫБРАТЬ ПЕРВЫЕ 3
	ПоступлениеТоваровУслуг.Ссылка
ИЗ
	Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг

УПОРЯДОЧИТЬ ПО
	ПоступлениеТоваровУслуг.Дата УБЫВ
Prad2002; MarchTomCat; Healer; +3 Ответить
5. sanjabor 17 13.01.17 20:36 Сейчас в теме
По одной номенклатуре можно сделать как написано в (2), только запрос будет по табличной части с условием по номенклатуре.

А вот если нужно по каждой номенклатуре вывести такой список последних поступлений, при этом получать данные одним запросом, задача сложнее.

Пример для первой формулировки задачи (на УТ 10.3):

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

УПОРЯДОЧИТЬ ПО
	ПоступлениеТоваровУслугТовары.Ссылка.Дата УБЫВ
Показать
Andrekaa; Healer; +2 Ответить
4. aleks xantaev 8 13.01.17 18:58 Сейчас в теме
получаю в запросе список номенклатуры и мне надо получить список последних трех приходов этой номенклатуры. по каждой номенклатуре.
6. Healer 1 14.01.17 00:53 Сейчас в теме
Да, выбрать последние три поступления для списка номенклатуры просто можно лишь обходом списка и выполнением запроса,приведённого в предыдущем посте. Если же надо обойтись лишь запросом (напрмер, в СКД), задача усложняется. Я бы сделал пакет из двух запросов: в первом выбираем номенклатуру и помещаем в ВТ, во втором соединяем ВТ с подзапросом, вроде изложенного выше.
7. Healer 1 17.01.17 22:58 Сейчас в теме
(6) ... это, правда, типичный пример того, как не надо делать... почитать можно в статье ИТС "Типичные причины неоптимальной работы запросов и методы оптимизации" (ссылка на статью):

Основные причины неоптимальной работы запросов, диагностируемые на уровне кода конфигурации и структуры метаданных:

соединения с подзапросами
соединения с виртуальными таблицами
несоответствие индексов и условий запроса
использование логического ИЛИ в условиях
использование подзапросов в условии соединения
получение данных через точку от полей составного типа
фильтрация виртуальных таблиц без использования параметров
.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот