Запрос. Выбрать последнего ответственного, при этом если до этого по запись была по нему же, то выбрать самого раннего.

1. mqlochink 7 21.10.19 06:04 Сейчас в теме
Здравствуйте. Подскажите, имеется периодический регистр сведений подчинённый регистратору, при перемещении ОС создаётся запись период, ОС, и ФизЛицо. Например: 01.01.2019 Тумба Иванов
01.02.2019 Тумба Петров
01.03.2019 Тумба Иванов
02.03.2019 Тумба Иванов

Необходимо вывести список всех ОС и период последнего изменения состояния, при этом если Физ лицо повторяется, выбрать первого из повторяемых, то есть в примере Тумба 01.03.2019
Вознаграждение за ответ
Показать полностью
Найденные решения
13. nvilku 22.10.19 10:45 Сейчас в теме +0.81 $m
ВЫБРАТЬ
Рег.МОЛ КАК МОЛ,
Рег.ОсновноеСредство КАК ОС
ПОМЕСТИТЬ Таб
ИЗ
РегистрСведений.МестонахождениеОСБухгалтерскийУчет.СрезПоследних(&КонецПериода, ) КАК Рег
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
Таб.МОЛ,
Таб.ОС,
МАКСИМУМ(Рег.Период) КАК Период
ПОМЕСТИТЬ ТабПредел
ИЗ
Таб КАК Таб
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МестонахождениеОСБухгалтерскийУчет КАК Рег
ПО Таб.МОЛ <> Рег.МОЛ
И Таб.ОС = Рег.ОсновноеСредство

СГРУППИРОВАТЬ ПО
Таб.МОЛ,
Таб.ОС
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
Таб.МОЛ,
Таб.ОС,
ТабПредел.Период КАК ПериодПредел
ПОМЕСТИТЬ ТабВрем
ИЗ
Таб КАК Таб
ЛЕВОЕ СОЕДИНЕНИЕ ТабПредел КАК ТабПредел
ПО Таб.ОС = ТабПредел.ОС
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
ТабВрем.МОЛ,
ТабВрем.ОС,
МИНИМУМ(Рег.Период) КАК Период
ИЗ
ТабВрем КАК ТабВрем
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МестонахождениеОСБухгалтерскийУчет КАК Рег
ПО ТабВрем.МОЛ = Рег.МОЛ
И ТабВрем.ОС = Рег.ОсновноеСредство
И (ЕСТЬNULL(ТабВрем.ПериодПредел, ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)) <= Рег.Период)

СГРУППИРОВАТЬ ПО
ТабВрем.МОЛ,
ТабВрем.ОС
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. mqlochink 7 21.10.19 07:46 Сейчас в теме +0.81 $m
ВЫБРАТЬ
	МестонахождениеОСБухгалтерскийУчетСрезПоследних.МОЛ КАК МОЛ,
	МестонахождениеОСБухгалтерскийУчетСрезПоследних.ОсновноеСредство КАК ОсновноеСредство,
	МестонахождениеОСБухгалтерскийУчетСрезПоследних.Период
ПОМЕСТИТЬ ТекМОЛ
ИЗ
	РегистрСведений.МестонахождениеОСБухгалтерскийУчет.СрезПоследних(&КонецПериода, ) КАК МестонахождениеОСБухгалтерскийУчетСрезПоследних

ИНДЕКСИРОВАТЬ ПО
	МОЛ,
	ОсновноеСредство
;

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

СГРУППИРОВАТЬ ПО
	МестонахождениеОСБухгалтерскийУчет.ОсновноеСредство,
	МестонахождениеОСБухгалтерскийУчет.МОЛ

ИНДЕКСИРОВАТЬ ПО
	МОЛ,
	ОсновноеСредство
;

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

СГРУППИРОВАТЬ ПО
	МестонахождениеОСБухгалтерскийУчетСрезПоследних.ОсновноеСредство,
	МестонахождениеОСБухгалтерскийУчетСрезПоследних.МОЛ
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	МинПериодТекМол.ОсновноеСредство КАК ОсновноеСредство,
	МинПериодТекМол.МОЛ КАК МОЛ,
	МАКСИМУМ(БывшМОЛ.Период) КАК ДоЭтогоПериод,
	МАКСИМУМ(МинПериодТекМол.Период) КАК КрайнийПериод
ПОМЕСТИТЬ ВТ
ИЗ
	МинПериодТекМол КАК МинПериодТекМол
		ЛЕВОЕ СОЕДИНЕНИЕ БывшМОЛ КАК БывшМОЛ
		ПО МинПериодТекМол.ОсновноеСредство = БывшМОЛ.ОсновноеСредство

СГРУППИРОВАТЬ ПО
	МинПериодТекМол.ОсновноеСредство,
	МинПериодТекМол.МОЛ

ИНДЕКСИРОВАТЬ ПО
	МОЛ,
	ОсновноеСредство
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ.ОсновноеСредство,
	ВТ.МОЛ,
	МИНИМУМ(ВЫБОР
			КОГДА МестонахождениеОСБухгалтерскийУчет.Период ЕСТЬ NULL
				ТОГДА ВТ.КрайнийПериод
			ИНАЧЕ МестонахождениеОСБухгалтерскийУчет.Период
		КОНЕЦ) КАК Период
ИЗ
	ВТ КАК ВТ
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МестонахождениеОСБухгалтерскийУчет КАК МестонахождениеОСБухгалтерскийУчет
		ПО ВТ.ОсновноеСредство = МестонахождениеОСБухгалтерскийУчет.ОсновноеСредство
			И ВТ.МОЛ = МестонахождениеОСБухгалтерскийУчет.МОЛ
			И ВТ.ДоЭтогоПериод < МестонахождениеОСБухгалтерскийУчет.Период

СГРУППИРОВАТЬ ПО
	ВТ.ОсновноеСредство,
	ВТ.МОЛ
Показать


Сделал так, неужели нельзя проще?
3. romulanin 21.10.19 08:48 Сейчас в теме
4. mqlochink 7 21.10.19 08:50 Сейчас в теме
(3) Срез первых выдаст 01.01.2019 Тумба Иванов, что неверно
9. infi188 21.10.19 11:13 Сейчас в теме
(2) Это же 1с ;) иногда хорошо что вообще работает и не важно проще или сложнее)
mqlochink; +1 Ответить
5. uk09 21.10.19 09:06 Сейчас в теме
Добрый день!
Вопрос - актуальный ?
6. mqlochink 7 21.10.19 09:46 Сейчас в теме
(5) Добрый день, да, если есть более оптимальный запрос
7. soft_wind 21.10.19 09:50 Сейчас в теме
классика, (возможны еще варианты)

ВЫБРАТЬ
Рег.МОЛ КАК МОЛ,
Рег.ОсновноеСредство КАК ОС
поместить Таб
РегистрСведений.МестонахождениеОСБухгалтерскийУчет.СрезПоследних(&КонецПериода, ) КАК Рег
;
Выбрать 
Таб.МОЛ,
Таб.ОС,
Минимум(Рег.Период) как Период
Из Таб
левое соединение
РегистрСведений.МестонахождениеОСБухгалтерскийУчет КАК Рег
по Таб.Мол = Рег.Мол
и Таб.ОС = Рег.ОсновноеСредство 
Сгруппировать по
Таб.МОЛ,
Таб.ОС
Показать
8. mqlochink 7 21.10.19 10:01 Сейчас в теме
(7)
Прошу прощения, протестировал, выдаёт неверно, выдаёт 01.01.2019 Тумба Иванов, что неверно.

ВЫБРАТЬ
	Рег.МОЛ КАК МОЛ,
	Рег.ОсновноеСредство КАК ОС
ПОМЕСТИТЬ Таб
ИЗ
	РегистрСведений.МестонахождениеОСБухгалтерскийУчет.СрезПоследних(&КонецПериода) КАК Рег
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Таб.МОЛ,
	Таб.ОС,
	МИНИМУМ(Рег.Период) КАК Период
ИЗ
	Таб КАК Таб
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МестонахождениеОСБухгалтерскийУчет КАК Рег
		ПО Таб.МОЛ = Рег.МОЛ
			И Таб.ОС = Рег.ОсновноеСредство

СГРУППИРОВАТЬ ПО
	Таб.МОЛ,
	Таб.ОС
Показать
12. soft_wind 22.10.19 09:47 Сейчас в теме
(8) попробуйте такой пример, данные переидического РС сэмулированы доп запросом, в общем из коментов понятно как все работает

//эмуляция периодического РС 
ВЫБРАТЬ "ос1" как ОС, "тест1" как Мол, ДатаВремя(2019,1,1) как Период, 0 как Срез Поместить Таб
Объединить все ВЫБРАТЬ "ос1", "тест2", ДатаВремя(2019,2,1), 0
Объединить все ВЫБРАТЬ "ос1", "тест1", ДатаВремя(2019,3,1), 0
Объединить все ВЫБРАТЬ "ос1", "тест1", ДатаВремя(2019,4,1), 0
Объединить все ВЫБРАТЬ "ос1", "тест1", ДатаВремя(2019,5,1), 1
Объединить все ВЫБРАТЬ "ос2", "тест2", ДатаВремя(2019,2,1), 0
Объединить все ВЫБРАТЬ "ос2", "тест1", ДатаВремя(2019,3,1), 0
Объединить все ВЫБРАТЬ "ос2", "тест2", ДатаВремя(2019,4,1), 1
Объединить все ВЫБРАТЬ "ос3", "тест3", ДатаВремя(2019,5,1), 0
Объединить все ВЫБРАТЬ "ос3", "тест3", ДатаВремя(2019,7,1), 1
;
//эмуляция результата срез последних
Выбрать Таб.* Поместить Рег где Срез = 1
;

//получаем таб с периодом от предыдущего Мол
Выбрать
	Рег.Мол,
	Рег.ОС,
	Максимум(Пром.Период) как ПериодОт
Поместить РегОт	
Из
	Рег

левое соединение Таб Пром
по Рег.ОС = Пром.ОС
и  Рег.Мол <> Пром.Мол
и  Рег.Период > Пром.Период
Сгруппировать по
	Рег.Мол,
	Рег.ОС
;

//получаем результат с минимальным периоодом по текущему Мол
Выбрать
	Рег.Мол,
	Рег.ОС,
	Минимум(Пром.Период) как ПериодС
Из
	РегОт Рег
//подтягиваем другого Мол с макс датой	
левое соединение Таб Пром
по Рег.ОС = Пром.ОС
и  Рег.Мол = Пром.Мол
и  ЕстьNull(Рег.ПериодОт,Пром.Период) <= Пром.Период
Сгруппировать по
	Рег.Мол,
	Рег.ОС

Показать
14. mqlochink 7 22.10.19 11:28 Сейчас в теме
(12) Согласен, Ваш второй, изменённый запрос, на эмуляции данных, выводит верные значения, но в самом запросе происходит соединение дважды с таблицей Таб, которая эмулирует регистр сведений. Необходимо соединятся с регистром сведений в запросе? У меня время запроса показало какие то дикие 54 секунды, против 1.4 мой вариант, я ещё попробую попозже ваш вариант.
10. nvilku 21.10.19 13:56 Сейчас в теме
ВЫБРАТЬ
	Рег.МОЛ КАК МОЛ,
	Рег.ОсновноеСредство КАК ОС
ПОМЕСТИТЬ Таб
ИЗ
	РегистрСведений.МестонахождениеОСБухгалтерскийУчет.СрезПоследних(&КонецПериода, ) КАК Рег
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Таб.МОЛ,
	Таб.ОС,
	МАКСИМУМ(Рег.Период) КАК Период
ПОМЕСТИТЬ ТабПредел
ИЗ
	Таб КАК Таб
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МестонахождениеОСБухгалтерскийУчет КАК Рег
		ПО Таб.МОЛ <> Рег.МОЛ
			И Таб.ОС = Рег.ОсновноеСредство

СГРУППИРОВАТЬ ПО
	Таб.МОЛ,
	Таб.ОС
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Таб.МОЛ,
	Таб.ОС,
	ТабПредел.Период КАК ПериодПредел
ПОМЕСТИТЬ ТабВрем
ИЗ
	Таб КАК Таб
		ЛЕВОЕ СОЕДИНЕНИЕ ТабПредел КАК ТабПредел
		ПО Таб.ОС = ТабПредел.ОС
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ТабВрем.МОЛ,
	ТабВрем.ОС,
	МИНИМУМ(Рег.Период) КАК Период
ИЗ
	ТабВрем КАК ТабВрем
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МестонахождениеОСБухгалтерскийУчет КАК Рег
		ПО ТабВрем.МОЛ = Рег.МОЛ
			И ТабВрем.ОС = Рег.ОсновноеСредство
			И ТабВрем.ПериодПредел < Рег.Период

СГРУППИРОВАТЬ ПО
	ТабВрем.МОЛ,
	ТабВрем.ОС
Показать
11. mqlochink 7 22.10.19 05:54 Сейчас в теме
(10)
ВЫБРАТЬ
Рег.МОЛ КАК МОЛ,
Рег.ОсновноеСредство КАК ОС
ПОМЕСТИТЬ Таб
ИЗ
РегистрСведений.МестонахождениеОСБухгалтерскийУчет.СрезПоследних(&КонецПериода, ) КАК Рег
;

////////////////////////////////////////////////////////////­­////////////////////
ВЫБРАТЬ
Таб.МОЛ,
Таб.ОС,
МАКСИМУМ(Рег.Период) КАК Период
ПОМЕСТИТЬ ТабПредел
ИЗ
Таб КАК Таб
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МестонахождениеОСБухгалтерскийУчет КАК Рег
ПО Таб.МОЛ <> Рег.МОЛ
И Таб.ОС = Рег.ОсновноеСредство

СГРУППИРОВАТЬ ПО
Таб.МОЛ,
Таб.ОС
;

////////////////////////////////////////////////////////////­­////////////////////
ВЫБРАТЬ
Таб.МОЛ,
Таб.ОС,
ТабПредел.Период КАК ПериодПредел
ПОМЕСТИТЬ ТабВрем
ИЗ
Таб КАК Таб
ЛЕВОЕ СОЕДИНЕНИЕ ТабПредел КАК ТабПредел
ПО Таб.ОС = ТабПредел.ОС
;

////////////////////////////////////////////////////////////­­////////////////////
ВЫБРАТЬ
ТабВрем.МОЛ,
ТабВрем.ОС,
МИНИМУМ(Рег.Период) КАК Период
ИЗ
ТабВрем КАК ТабВрем
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МестонахождениеОСБухгалтерскийУчет КАК Рег
ПО ТабВрем.МОЛ = Рег.МОЛ
И ТабВрем.ОС = Рег.ОсновноеСредство
И ТабВрем.ПериодПредел < Рег.Период

СГРУППИРОВАТЬ ПО
ТабВрем.МОЛ,
ТабВрем.ОС
Показать


Протестировал только что, прошу прощения, но если единственная запись по ОС, то запрос период не выводит
15. soft_wind 22.10.19 12:59 Сейчас в теме
(10) попробуйте порядок условий связи поменять

ПО Таб.МОЛ <> Рег.МОЛ
И Таб.ОС = Рег.ОсновноеСредство
и
ПО Таб.ОС = Рег.ОсновноеСредство
И Таб.МОЛ <> Рег.МОЛ

это две большие разницы и т.д.
13. nvilku 22.10.19 10:45 Сейчас в теме +0.81 $m
ВЫБРАТЬ
Рег.МОЛ КАК МОЛ,
Рег.ОсновноеСредство КАК ОС
ПОМЕСТИТЬ Таб
ИЗ
РегистрСведений.МестонахождениеОСБухгалтерскийУчет.СрезПоследних(&КонецПериода, ) КАК Рег
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
Таб.МОЛ,
Таб.ОС,
МАКСИМУМ(Рег.Период) КАК Период
ПОМЕСТИТЬ ТабПредел
ИЗ
Таб КАК Таб
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МестонахождениеОСБухгалтерскийУчет КАК Рег
ПО Таб.МОЛ <> Рег.МОЛ
И Таб.ОС = Рег.ОсновноеСредство

СГРУППИРОВАТЬ ПО
Таб.МОЛ,
Таб.ОС
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
Таб.МОЛ,
Таб.ОС,
ТабПредел.Период КАК ПериодПредел
ПОМЕСТИТЬ ТабВрем
ИЗ
Таб КАК Таб
ЛЕВОЕ СОЕДИНЕНИЕ ТабПредел КАК ТабПредел
ПО Таб.ОС = ТабПредел.ОС
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
ТабВрем.МОЛ,
ТабВрем.ОС,
МИНИМУМ(Рег.Период) КАК Период
ИЗ
ТабВрем КАК ТабВрем
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МестонахождениеОСБухгалтерскийУчет КАК Рег
ПО ТабВрем.МОЛ = Рег.МОЛ
И ТабВрем.ОС = Рег.ОсновноеСредство
И (ЕСТЬNULL(ТабВрем.ПериодПредел, ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)) <= Рег.Период)

СГРУППИРОВАТЬ ПО
ТабВрем.МОЛ,
ТабВрем.ОС
16. soft_wind 22.10.19 13:02 Сейчас в теме
(13)
вот это
И (ЕСТЬNULL(ТабВрем.ПериодПредел, ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)) <= Рег.Период)

не правильно!!! (ну что-ж, вы даже из примера не правильно списываете)
17. soft_wind 22.10.19 13:06 Сейчас в теме
(13) и для оптимизации, вам же не все данные сразу нужны? какие-то отборы у вас должны же быть, примените их, отберите и поместите во временные таблицы эти данные, по тем же группам ОС или подразделениям и т.д.
и уже складывать временные таблицы а не весь РС
19. mqlochink 7 22.10.19 14:21 Сейчас в теме
мне нужны данные по всем ОС на конец периода
18. soft_wind 22.10.19 13:10 Сейчас в теме
(13) это что?

ВЫБРАТЬ
Таб.МОЛ,
Таб.ОС,
МАКСИМУМ(Рег.Период) КАК Период
ПОМЕСТИТЬ ТабПредел
ИЗ
Таб КАК Таб
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МестонахождениеОСБухгалтерскийУчет КАК Рег
ПО Таб.МОЛ <> Рег.МОЛ
И Таб.ОС = Рег.ОсновноеСредство

в примере - не так!!!
да вы батенька списывать не умеете! (чему вас только в школе учили?)
20. mqlochink 7 22.10.19 14:23 Сейчас в теме
21. soft_wind 22.10.19 14:43 Сейчас в теме
(20)
Не понимаю вас

Таб КАК Таб
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МестонахождениеОСБухгалтерскийУчет КАК Рег
ПО Таб.МОЛ <> Рег.МОЛ
И Таб.ОС = Рег.ОсновноеСредство

и

Рег
левое соединение Таб Пром
по Рег.ОС = Пром.ОС
и Рег.Мол <> Пром.Мол
и Рег.Период > Пром.Период

если найдете 5 отличий, тогда еще не все потеряно ...
Оставьте свое сообщение

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