Имя: Пароль:
1C
 
Как получить данную выборку из непериодического регистра сведений
0 falselight
 
06.02.18
14:28
Есть непериодический регистр сведений "Состояния сотрудников", который имеет измерения "Сотрудник", "Период", и ресурс "Состояние".
Данные в нем заполнены не на каждый день.
Например:
Иванов 01.01.2013 Работает
Петров 05.01.2013 В_Отпуске
Иванов 09.01.2013 Болеет
Петров 12.01.2013 Работает
Иванов 13.01.2013 Работает

Необходимо написать текст запроса, который выдавал бы актуальные состояния сотрудников на заданную дату &Дата.
Например, на 12.01.2013 Результат запрос должен быть:

Иванов Болеет
Петров Работает
1 azernot
 
06.02.18
14:31
Выбираешь из регистра сотрудников с периодом <= заданного, группируешь по сотруднику с максимумом по периоду, соединяешь с регистром по равенству сотрудника и максимального периода, получаешь состояние сотрудника на нужную дату.
2 VitShvets
 
06.02.18
14:34
Вложенными или пакетными запросами:
1. Поучаешь выборку максимальных дат:
ВЫБРАТЬ Сотрудник, МАКСИМУМ(Период) поместить ВТ1 ИЗ Регистр ГДЕ Период <= &Дата
2. Получаешь нужное
Выбрать Регистр.Сотрудник, Регистр.Состояние
из Регистр Внутреннее соединение ВТ1 ПО период=период и сотрудник = сотрудник.

(1) :) Опередил, но коль уж набрал, то продублирую.
3 falselight
 
06.02.18
14:35
(1,2) Регистр один непериодический регистр сведений "Состояния сотрудников".

Что у вас участвует в связях?
4 azernot
 
06.02.18
14:39
(3) По сути в связях участвуют данные из одного и того же регистра. Можно через ВТ, можно через двойное обращение к таблице регистра.
5 falselight
 
06.02.18
14:40
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    СостоянияСотрудников.Сотрудник КАК Сотрудник,
    МАКСИМУМ(СостоянияСотрудников.ПериодРаботы) КАК ПериодРаботы
ПОМЕСТИТЬ ВТ_МаксимальныеДаты
ИЗ
    РегистрСведений.СостоянияСотрудников КАК СостоянияСотрудников
ГДЕ
    СостоянияСотрудников.ПериодРаботы <= &ПараметрДата

СГРУППИРОВАТЬ ПО
    СостоянияСотрудников.Сотрудник
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    СостоянияСотрудников.Сотрудник КАК Сотрудник,
    СостоянияСотрудников.Состояние КАК Состояние
ИЗ
    РегистрСведений.СостоянияСотрудников КАК СостоянияСотрудников
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_МаксимальныеДаты КАК ВТ_МаксимальныеДаты
        ПО СостоянияСотрудников.Сотрудник = ВТ_МаксимальныеДаты.Сотрудник
            И СостоянияСотрудников.ПериодРаботы = ВТ_МаксимальныеДаты.ПериодРаботы
6 azernot
 
06.02.18
14:42
ВЫБРАТЬ
    СостоянияСотрудников.Сотрудник КАК Сотрудник,
    СостоянияСотрудников.Период КАК Период,
    СостоянияСотрудников.Состояние
ПОМЕСТИТЬ ДанныеРегистра
ИЗ
    РегистрСведений.СостоянияСотрудников КАК СостоянияСотрудников
ГДЕ
    СостоянияСотрудников.Период <= &ДатаСостояния
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ДанныеРегистра.Сотрудник,
    ДанныеРегистра.Состояние
ИЗ
    (ВЫБРАТЬ
        ДанныеРегистра.Сотрудник КАК Сотрудник,
        МАКСИМУМ(ДанныеРегистра.Период) КАК Период
    ИЗ
        ДанныеРегистра КАК ДанныеРегистра
    
    СГРУППИРОВАТЬ ПО
        ДанныеРегистра.Сотрудник) КАК МаксимальныеПериоды
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ДанныеРегистра КАК ДанныеРегистра
        ПО МаксимальныеПериоды.Сотрудник = ДанныеРегистра.Сотрудник
            И МаксимальныеПериоды.Период = ДанныеРегистра.Период
7 falselight
 
06.02.18
15:04
В (5)  работает, лишнее только РАЗРЕШЕННЫЕ, убрал.
В (6) практически тоже самое только с вложенным запросом хитро закручено. Понять остается.