Предыдущая и последующая запись в запросе (LEAD & LAG)

1. user950703 13.03.25 10:12 Сейчас в теме
Доброе время суток, уважаемые.

Задача такая.
Есть непериодический регистр сведений . Конкретно "ИсторияИспользованияШтатногоРасписания" (ЗУП 3.1)
Требуется в запросе получить текущую запись, а также ее предшественника и последователя по имеющемуся упорядочиванию (Измерению "Дата"). Аналог функций LEAD и LAG.

Заранее благодарен.
Найденные решения
6. antz 14.03.25 09:19 Сейчас в теме
(5) Ну, так а мы об том же.

ВЫБРАТЬ
     ТекущаяЗапись.Дата КАК Дата,
     МАКСИМУМ(ПредыдущаяЗапись.Дата) КАК ПредыдущаяДата,
     МИНИМУМ(СледующаяЗапись.Дата) КАК СледующаяДата
ПОМЕСТИТЬ
    Даты
ИЗ
      МойРегистр КАК ТекущаяЗапись
ЛЕВОЕ СОЕДИНЕНИЕ
     МойРегистр КАК ПредыдущаяЗапись
ПО
     ТекущаяЗапись.Дата > ПредыдущаяЗапись.Дата
ЛЕВОЕ СОЕДИНЕНИЕ
     МойРегистр КАК СледующаяЗапись
ПО
     ТекущаяЗапись.Дата < СледующаяЗапись.Дата
;

ВЫБРАТЬ
     ПредыдущаяЗапись.ЗначениеТакоеТо КАК ПредыдущееЗначение,
     ТекущаяЗапись.ЗначениеТакоеТо КАК ТекущееЗначение,
     СледующаяЗапись.ЗначениеТакоеТо КАК СледующееЗначение
ИЗ
     Даты
ЛЕВОЕ СОЕДИНЕНИЕ
     МойРегистр КАК ТекущаяЗапись
ПО
     Даты.Дата = ТекущаяЗапись.Дата
ЛЕВОЕ СОЕДИНЕНИЕ
     МойРегистр КАК ПредыдущаяЗапись
ПО
     Даты.ПредыдущаяДата = ПредыдущаяЗапись.Дата
ЛЕВОЕ СОЕДИНЕНИЕ
     МойРегистр КАК СледующаяЗапись
ПО
     Даты.СледующаяДата = СледующаяЗапись.Дата
Показать


Ну, в вт можно всякие измерения еще выбрать, по ним сгруппировать, по ним же соединяться, их же выбрать во втором запросе как текущие, минус одно соединение будет.
13. Said-We 14.03.25 15:42 Сейчас в теме
(1) Пронумеруй все записи Автономизацией. Для каждой записи возьми предыдущую и следующую.
Первые 10, что бы наглядно было и помещался результат наглядно на картинке. В реальности поставить 9999...99.
Прикрепленные файлы:
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. antz 13.03.25 10:30 Сейчас в теме
Два соединения, одно по дате меньше текущей (вычисляем максимум даты), другое по дате больше текущей (вычисляем минимум) - получаем таблицу с предыдущей и следующей датой. Дальше еще одно соединение по этим датам.
3. user950703 13.03.25 17:17 Сейчас в теме
(2) Вы описали методику, похожую на коррелированный запрос. 1с такое не приветствует. Или я чего-то не понял.
4. starik-2005 3172 13.03.25 18:36 Сейчас в теме
Выбрать *
ИЗ Регистр
ГДЕ Дата В (ВЫБРАТЬ Максимум(Дата) ИЗ Регистр ГДЕ Дата < &Дата
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ Минимум(Дата) ИЗ Регистр ГДЕ Дата > &Дата
ОБЪЕДИНИТЬ ВСЕ 
ВЫБРАТЬ &Дата
)
5. user950703 14.03.25 09:08 Сейчас в теме
(4) Наверное я недостаточно четко поставил задачу.
Нужно выбрать текущую запись, а также ее предшественника и последователя в смысле упорядочения измерения регистра. В данном случае Дата.
Текущая запись НЕ задается параметром.
6. antz 14.03.25 09:19 Сейчас в теме
(5) Ну, так а мы об том же.

ВЫБРАТЬ
     ТекущаяЗапись.Дата КАК Дата,
     МАКСИМУМ(ПредыдущаяЗапись.Дата) КАК ПредыдущаяДата,
     МИНИМУМ(СледующаяЗапись.Дата) КАК СледующаяДата
ПОМЕСТИТЬ
    Даты
ИЗ
      МойРегистр КАК ТекущаяЗапись
ЛЕВОЕ СОЕДИНЕНИЕ
     МойРегистр КАК ПредыдущаяЗапись
ПО
     ТекущаяЗапись.Дата > ПредыдущаяЗапись.Дата
ЛЕВОЕ СОЕДИНЕНИЕ
     МойРегистр КАК СледующаяЗапись
ПО
     ТекущаяЗапись.Дата < СледующаяЗапись.Дата
;

ВЫБРАТЬ
     ПредыдущаяЗапись.ЗначениеТакоеТо КАК ПредыдущееЗначение,
     ТекущаяЗапись.ЗначениеТакоеТо КАК ТекущееЗначение,
     СледующаяЗапись.ЗначениеТакоеТо КАК СледующееЗначение
ИЗ
     Даты
ЛЕВОЕ СОЕДИНЕНИЕ
     МойРегистр КАК ТекущаяЗапись
ПО
     Даты.Дата = ТекущаяЗапись.Дата
ЛЕВОЕ СОЕДИНЕНИЕ
     МойРегистр КАК ПредыдущаяЗапись
ПО
     Даты.ПредыдущаяДата = ПредыдущаяЗапись.Дата
ЛЕВОЕ СОЕДИНЕНИЕ
     МойРегистр КАК СледующаяЗапись
ПО
     Даты.СледующаяДата = СледующаяЗапись.Дата
Показать


Ну, в вт можно всякие измерения еще выбрать, по ним сгруппировать, по ним же соединяться, их же выбрать во втором запросе как текущие, минус одно соединение будет.
9. user950703 14.03.25 11:38 Сейчас в теме
(6)
Попробовал. Теоретически работает, но очень время затратен.
Оно и понятно, для каждой текущей записи просмотр и поиск максимума/минимума по всему регистру...
10. user1936660 14.03.25 11:41 Сейчас в теме
(9)
Оно и понятно
Индексы не предлагать?
12. user950703 14.03.25 11:44 Сейчас в теме
(10)

Индексы и прочие прибамбасы из конкретных условий задачи буду прикручивать сам. Спасибо. Идея хорошая.
7. starik-2005 3172 14.03.25 10:15 Сейчас в теме
(5)
Нужно выбрать текущую запись
А "текущая запись" - это что вообще? В ней есть признак "ТекущаяЗапись = Истина"?
8. user1936660 14.03.25 10:53 Сейчас в теме
(5)
поставил задачу
Поставил, значит...

Давай уж тогда и про сроки выполнения и премии рассказывай, штрафами угрожай. Что ты как маленький?
11. user950703 14.03.25 11:42 Сейчас в теме
(8) Слушаюсь. Больше не повторится. Впредь буду ориентироваться на Ваши оценки.
(8)
13. Said-We 14.03.25 15:42 Сейчас в теме
(1) Пронумеруй все записи Автономизацией. Для каждой записи возьми предыдущую и следующую.
Первые 10, что бы наглядно было и помещался результат наглядно на картинке. В реальности поставить 9999...99.
Прикрепленные файлы:
14. user1936660 14.03.25 15:48 Сейчас в теме
15. user950703 14.03.25 16:27 Сейчас в теме
(13)
Примерно к этому варианту и пришел.
17. user1936660 14.03.25 16:46 Сейчас в теме
(15)
к этому варианту
То есть сначала возмущаемся что производительность никакая, а потом хренак - и соединение по вычисляемому полю. Так победим, да!
20. user950703 14.03.25 17:12 Сейчас в теме
(16)
(17) Въедте, наконец, в тему. Это совершенно другой вариант, с предварительной нумерацией записей. И довольно распространенный.
Рекомендую заняться делом.
23. user1936660 14.03.25 20:28 Сейчас в теме
(20)
Рекомендую заняться делом
Не извольте сумлеваться, барин. Чаго ещё изволите?
16. Said-We 14.03.25 16:29 Сейчас в теме
(1) Можно и так:
Если принять что измерение единственное. В данном примере это Сотрудник и в реальном РС оно не единственное, но предполагаем что оно единственное. У Вас же другой регистр с другой структурой.
Фильтр на код справочника поставил, что бы результат на скрин поместился и взялись сотрудники, по которым движений не много.
Прикрепленные файлы:
18. user1936660 14.03.25 16:47 Сейчас в теме
(16) А вот это уже "коррелированный запрос. 1с такое не приветствует", хехе. См. (2)
19. Said-We 14.03.25 17:00 Сейчас в теме
(1) Но лучше всего, написать гневное письмо в 1С и потребовать срочную реализацию оконных функций, и в том числе "LEAD и LAG". :-)
Думаю, что не только вас задрали эти трёхэтажные запросы на пустом месте. :-)
21. user950703 14.03.25 17:15 Сейчас в теме
(19) Да Вы правы. Лид и Лаг давно уже должны работать в штатном инструментарии запросов 1С. Как и оконные функции.
Предложенные варианты - это конечно ходьба темным лесом.
Но писать письма в 1с меня отучили уже давно.
22. Said-We 14.03.25 17:28 Сейчас в теме
(21)
Но писать письма в 1с меня отучили уже давно.
Ну вот.... А я рассчитывал на Вас. :-)
Оставьте свое сообщение

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