Последняя дата продажи и поступления. Обычные формы.

1. Andrey1804 3 07.06.24 16:06 Сейчас в теме
Всем доброго дня! УТ 10.3. Подскажите, как в запросе вытащить еще и дату последней продажи ?
ВЫБРАТЬ
	ПартииТоваровНаСкладах.Номенклатура,
	МАКСИМУМ(ПартииТоваровНаСкладах.Регистратор.Дата) КАК ДатаПоступления
ИЗ
	РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
ГДЕ
	ПартииТоваровНаСкладах.Номенклатура = &Номенклатура
	И ПартииТоваровНаСкладах.ВидДвижения = &ВидДвижения //приход

СГРУППИРОВАТЬ ПО
	ПартииТоваровНаСкладах.Номенклатура
Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. independ 1557 07.06.24 19:55 Сейчас в теме
(1)
ВЫБРАТЬ
	"Продажа" КАК операция,
	МАКСИМУМ(Продажи.Период) КАК Дата
ИЗ
	РегистрНакопления.Продажи КАК Продажи
ГДЕ
	Продажи.Номенклатура = &Номенклатура

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

ВЫБРАТЬ
	"Поступление",
	МАКСИМУМ(ПоступлениеТоваровУслугТовары.Ссылка.Дата)
ИЗ
	Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
ГДЕ
	ПоступлениеТоваровУслугТовары.Номенклатура = &Номенклатура
	И ПоступлениеТоваровУслугТовары.Ссылка.Проведен
Показать
user1619761; +1 Ответить
2. booksfill 07.06.24 17:05 Сейчас в теме
ВЫБРАТЬ 
    Продажи.Номенклатура,
    Продажи.ХарактеристикаНоменклатуры,
    МАКСИМУМ(Продажи.Период) КАК ДатаПоследнейПродажи
ИЗ
    РегистрНакопления.Продажи КАК Продажи
    ГДЕ Количество > 0 
 СГРУППИРОВАТЬ ПО    	
 Продажи.Номенклатура,
     Продажи.ХарактеристикаНоменклатуры
Показать


Думаю, вы понимаете к чему приведет в вашем первом запросе ПартииТоваровНаСкладах.Регистратор.Дата, в плане производительности?

Да и в моем запросе тоже я бы подумал хотя бы о том, что дата последней продажи более чем за, скажем, текущие 365 дней уже никого не волнует.

Ладно, будем полагать, что это нечастый запрос и что у вас в СУБД читатели не блокируют писателей.
user1619761; +1 Ответить
3. Andrey1804 3 07.06.24 17:36 Сейчас в теме
(2)Спасибо, дату поступления сделал аналогично вашему запросу. Так Лучше ?
ВЫБРАТЬ
    ПартииТоваровНаСкладах.Номенклатура,
    МАКСИМУМ(ПартииТоваровНаСкладах.Период) КАК ДатаПоступления
ИЗ
    РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
ГДЕ
    ПартииТоваровНаСкладах.Номенклатура В Иерархии (&Номенклатура)
    И ПартииТоваровНаСкладах.ВидДвижения = &ВидДвижения //приход

СГРУППИРОВАТЬ ПО
    ПартииТоваровНаСкладах.Номенклатура
Показать
5. booksfill 10.06.24 09:21 Сейчас в теме
(3) Да.
Теперь вы избавились от множества неявных левых соединений.

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

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

ВЫБРАТЬ 
    Продажи.Номенклатура,
    МАКСИМУМ(Продажи.Период) КАК ДатаПоследнейПродажи
ИЗ
    РегистрНакопления.Продажи КАК Продажи
    ГДЕ Количество > 0 
И Продажи.Номенклатура В (ВЫБРАТЬ ВТ.Номенклатура ИЗ ВТ КАК ВТ)
 СГРУППИРОВАТЬ ПО        
 Продажи.Номенклатура,
Показать
6. Andrey1804 3 17.06.24 16:08 Сейчас в теме
(5)А если нужен еще и отбор по складу, как быть ? В регистре Продажи склада нет (
7. booksfill 17.06.24 17:46 Сейчас в теме
Вариант 1 - Вытягивайте склад из ДокументПродажи и отбирайтесь.

Вариант 2 - используйте вместо Продажи РН.ТоварыНаСкладах, отбираясь по виду движения - расход, складу, виду регистратора - уж чем вы там продаете (ЧекККМ, ЧекККМКоррекции, ОтчетОРозничныхПродажах, РТУ и т.п.).

Скачайте УТ, там куча отчетов.
Отвечающих на множество вопросов типа, "а теперь мне нужен курс валюты на каждую дату продажи" или "а как учесть в продажах возвраты", или "а движения документа корректировки регистров надо учитывать в посл. продаже" и т.д. и т.п

P.S.
На всякий случай, использовать РН.ПартииТоваровНаСкладах для определения продаж не надо бы, по ряду причин.
8. Andrey1804 3 18.06.24 16:19 Сейчас в теме
(7)мне без соединения не обойтись, мне нужны еще данные из таблицы. Если склад вытаскиваю из Документа продажи РН, то запрос 18 сек идет, если из документа ОтчетОРозничныхПродажах(через него продажи), то 6 секунд, что тоже не мало. Причем строк в ВТТ 300.
Выбрать
 			ВТТ.Склад,
			ВТТ.Номенклатура,
			ВТТ.Остаток Как Остаток,
			ВТТ.СуммаОстаток КАК СуммаОстаток,	
			ВТТ.ДатаПоступления,
			Максимум(ОтчетОрозничныхПродажахТовары.Ссылка.Дата) как ПоследняяДатаПродажи
//		        МАКСИМУМ(Продажи.Период) КАК ДатаПоследнейПродажи

             ИЗ ВТТ как ВТТ
//             Левое соединение  
//			РегистрНакопления.Продажи КАК Продажи ПО  Продажи.Номенклатура = ВТТ.Номенклатура
//			ГДЕ Продажи.Количество > 0  и
//		 Продажи.ДокументПродажи.Склад = ВТТ.Склад            
                 
Левое СОЕДИНЕНИЕ Документ.ОтчетОрозничныхПродажах.Товары КАК ОтчетОрозничныхПродажахТовары
				ПО (ОтчетОрозничныхПродажахТовары.Номенклатура	= ВТТ.Номенклатура)
				 И  ОтчетОрозничныхПродажахТовары.Ссылка.Склад = ВТТ.Склад

           Сгруппировать ПО
			ВТТ.Склад,
			ВТТ.Номенклатура,
			ВТТ.ДатаПоступления,
			ВТТ.Остаток,
			ВТТ.СуммаОстаток
Показать
9. booksfill 18.06.24 18:08 Сейчас в теме
(8)
Кто вам сказал, что продажи оформляются только документом ОтчетОРозничныхПродажах?

По поводу левого соединения в вашем примере (хммм... "изобретательно" - не надо так):

Если хотите скрестить ужа по дате поступления и ежа по дате последней продажи, то делайте 3-и таблицы - в одной уж, в другой еж, в третьей соединение ужа с ежом.

Сколько выполняется такой вот код:
ВЫБРАТЬ 
    Продажи.Номенклатура,
    МАКСИМУМ(Продажи.Период) КАК ДатаПоследнейПродажи,
    isNull(Продажи.ДокументПродажи.Склад, Значение(Справочник.Склады.ПустаяСсылка)) КАК Склад
Поместить ВТ_Еж
ИЗ
    РегистрНакопления.Продажи КАК Продажи
    ГДЕ Количество > 0 
И Продажи.Номенклатура В (ВЫБРАТЬ ВТ.Номенклатура ИЗ ВТ КАК ВТ)
 СГРУППИРОВАТЬ ПО        
 Продажи.Номенклатура,
  isNull(Продажи.ДокументПродажи.Склад, Значение(Справочник.Склады.ПустаяСсылка))
Показать


И, да, вот это вот "Продажи.ДокументПродажи.Склад" отсыпет вам левых соединений по числу регистраторов.
Еще не мешает проверить во всех ли документах продажи есть склад, если нет, то придется все же по РН.

Напоминаю - тянете продажи за весь период работы, если это нужно для какого-то хитрого отчета, то пусть выполняется хоть 30 минут.
Это только аналитику интересно (один раз за время его работы) узнать что у вас такой-то невнятный товар последний раз продался в 1913 году с ныне неиспользуемого склада.

В остальных случаях урезайте осетра, т.е. делайте ограничения по дате.
10. Andrey1804 3 30.06.24 13:41 Сейчас в теме
(9) Я не говорил, что продажи оформляются только документом ОтчетОРозничныхПродажах, я сказал, что у нас продажи только этими документами. Меня интересуют остатки с датой последнего поступления и датой последней продажи. И да у нас товары есть, которые и 10 лет назад продажа была последняя.
Вот такой код работает быстрее всего, но в таблицу не попадают товары по которому не было продаж. Я так понимаю из-за отбора по ДокументПродажи.Склад в(&Склад). Как мне сделать, чтоб выводились все строчки с продажей 0 тоже.
ВЫБРАТЬ   
   Продажи.Номенклатура,
    МАКСИМУМ(Продажи.ДокументПродажи.Дата) КАК ДатаПоследнейПродажи
ИЗ
    РегистрНакопления.Продажи.Обороты(,,,Номенклатура В (ВЫБРАТЬ ВТ.Номенклатура ИЗ ВТ КАК ВТ) и ДокументПродажи.Склад в(&Склад)  ) КАК Продажи
ГДЕ КоличествоОборот > 0

СГРУППИРОВАТЬ ПО        
 Продажи.Номенклатура
Показать
11. booksfill 01.07.24 10:32 Сейчас в теме
(10) Ну, дело ваше. Вот ответ на конкретный последний вопрос (причем первый запрос, просто скопировал у вас - тут уж сами за него отвечайте):
  ВЫБРАТЬ   
   Продажи.Номенклатура,
    МАКСИМУМ(Продажи.ДокументПродажи.Дата) КАК ДатаПоследнейПродажи
Поместить ВтПродажи
ИЗ
    РегистрНакопления.Продажи.Обороты(,,,Номенклатура В (ВЫБРАТЬ ВТ.Номенклатура ИЗ ВТ КАК ВТ) и ДокументПродажи.Склад в (&Склад)  ) КАК Продажи
ГДЕ КоличествоОборот > 0

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

ВЫБРАТЬ Различные Номенклатура Поместить ВТНомПоступала ИЗ РегистрНакопления.ТоварыНаСкладах
ГДЕ Склад В (&Склад);

ВЫБРАТЬ Ном.Номенклатура КАК Номенклатура,
isNull(ВтПродажи.ДатаПоследнейПродажи, ДатаВремя(1, 1, 1)) КАК ДатаПоследнейПродажи
 ИЗ ВТНомПоступала КАК Ном
ЛЕВОЕ Соединение ВтПродажи КАК ВтПродажи
ПО ВтПродажи.Номенклатура  = Ном.Ссылка
Показать


Смысл, думаю, понятен, код не проверял.
А так, смотрите сами, что у вас за база, может все регистрируется исключительно ПТУ, тогда и обращайтесь к товарной части проведенных ПТУ, будет быстрей.
Оставьте свое сообщение

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