Имя: Пароль:
1C
1С v8
Запрос для отчета
0 Никмейн
 
28.01.22
11:38
Добрый день!!! помогите доработать запрос(примерно): Если я формирую отчет без фильтрации <на рассмотрении>, то он учитывает и все другие статусы, и считает время обработки, как и должно быть. Выбрал кандидата Бирюкову Анну, но если я формирую отчет с фильтром <на рассмотрении> Бирюкова снова вываливается в отчет, хотя уже не должна, т.к. по ней работа уже прошла (есть другой статус).
Т.е. он считает всех, у кого есть этот статус в принципе. А не тех, у кого такая последняя запись, я думаю еще одну связь надо, или не правильно думаю?
ВЫБРАТЬ
    МАКСИМУМ(Рег.Период) КАК Период,
    Рег.ЗаявкаКандидата КАК Кандидат,
    Рег.Состояние КАК Состояние
ПОМЕСТИТЬ ВТ_Кандидаты
ИЗ
    РегистрСведений.ТекущаяРаботаПоЗаявкамКандидатов КАК Рег
ГДЕ
    Рег.Период МЕЖДУ &ДатаНачало И &ДатаКонец
    И НЕ Рег.ЗаявкаКандидата.ПометкаУдаления

СГРУППИРОВАТЬ ПО
    Рег.ЗаявкаКандидата,
    Рег.Состояние
;

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    МЕСЯЦ(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ВТ_Сек.СекундыВсего)) - 1 КАК ЦелыхМесяцев,
    ДЕНЬ(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ВТ_Сек.СекундыВсего)) - 1 КАК ЦелыхДней,
    ЧАС(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ВТ_Сек.СекундыВсего)) КАК ЦелыхЧасов,
    МИНУТА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ВТ_Сек.СекундыВсего)) КАК ЦелыхМинут,
    СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ВТ_Сек.СекундыВсего)) КАК ЦелыхСекунд,
    ВТ_Сек.ДатаОткрытия,
    ВТ_Сек.Кандидат,
    ВТ_Сек.Состояние,
    ВТ_Сек.ДатаПредыдущегоСтатуса
ИЗ
    ВТ_Сек КАК ВТ_Сек
ГДЕ
    НЕ ВТ_Сек.Кандидат.ПометкаУдаления
1 Ёпрст
 
гуру
28.01.22
11:57
(0)
ГДЕ
    НЕ табНаРассмотрении.Кандидат ЕСТЬ NULL

вот это делает твой лефт джоин в иннер джоин и ...делайте выводы.
2 Ryzeman
 
28.01.22
12:13
Делай отбор к итоговой таблице.
Но вообще я не понимаю как это может работать правильно. У тебя всего два статуса? А что если их будет три?
Да и даже как есть допустим, у тебя записи в регистре
Иванов 10.01 НаРассмотрении
Петров 15.01 Рассмотрено
Состояние разное, оно не сгруппируется, в ВТ_Сек оно попадёт как
10.01 Иванов НаРассмотрении 10.01 0
15.01 Петров Рассмотрено 15.01 0
И тут косяк:

  ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Кандидаты КАК таб2
        ПО таб.Кандидат = таб2.Кандидат
            И таб.Период > таб2.Период

Если разные кандидаты меняют статус, оно никогда не будет считаться предыдущим...

Я бы сделал срез последних для того что б узнать текущий статус, сам регистр с АВТОНОМЕРЗАПИСИ() выкинул бы по ВТ за нужный период, а там уже по этому полю связал бы, что б узнать дату предыдущего изменения.
3 Никмейн
 
28.01.22
12:16
АВТОНОМЕРЗАПИСИ() к сожалению нету в скд, у меня версия УПП 8.2
4 Ёпрст
 
гуру
28.01.22
12:22
(3) кто сказал , что нету ?
5 Ёпрст
 
гуру
28.01.22
12:22
а..8.2, ну да, там еще не было.
Но, перенумеровать записи можно и там
6 Никмейн
 
28.01.22
12:25
(2) а как тогда в соединении правильно сделать?
7 Никмейн
 
28.01.22
12:26
(1) это условие убрать?
8 Никмейн
 
28.01.22
12:27
(1) это отбор убрать?
9 Ryzeman
 
28.01.22
12:32
(3) Пронумеровать можно через КОЛИЧЕСТВО(), сделав условие по дате и сгруппировав все остальные поля временной таблицы. Если данных много, это будет медленно, зато хоть правильно...
10 Никмейн
 
28.01.22
12:43
(9) можете примерно сказать как будет выглядеть запрос, я тут накидал:
ВЫБРАТЬ
    МАКСИМУМ(Рег.Период) КАК Период,
    Рег.ЗаявкаКандидата КАК Кандидат,
    Рег.Состояние КАК Состояние
ПОМЕСТИТЬ ВТ_Кандидаты
ИЗ
    РегистрСведений.ТекущаяРаботаПоЗаявкамКандидатов.СрезПоследних(, ) КАК Рег
ГДЕ
    Рег.Период МЕЖДУ &ДатаНачало И &ДатаКонец
    И НЕ Рег.ЗаявкаКандидата.ПометкаУдаления

СГРУППИРОВАТЬ ПО
    Рег.ЗаявкаКандидата,
    Рег.Состояние
;

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

СГРУППИРОВАТЬ ПО
    таб.Период,
    таб.Кандидат,
    ЕСТЬNULL(таб.Состояние, таб2.Состояние),
    ЕСТЬNULL(таб2.Период, таб.Период),
    РАЗНОСТЬДАТ(ЕСТЬNULL(таб2.Период, таб.Период), таб.Период, СЕКУНДА)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    МЕСЯЦ(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ВТ_Сек.СекундыВсего)) - 1 КАК ЦелыхМесяцев,
    ДЕНЬ(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ВТ_Сек.СекундыВсего)) - 1 КАК ЦелыхДней,
    ЧАС(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ВТ_Сек.СекундыВсего)) КАК ЦелыхЧасов,
    МИНУТА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ВТ_Сек.СекундыВсего)) КАК ЦелыхМинут,
    СЕКУНДА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, ВТ_Сек.СекундыВсего)) КАК ЦелыхСекунд,
    ВТ_Сек.ДатаОткрытия,
    ВТ_Сек.Кандидат,
    ВТ_Сек.Состояние,
    ВТ_Сек.ДатаПредыдущегоСтатуса
ИЗ
    ВТ_Сек КАК ВТ_Сек
ГДЕ
    НЕ ВТ_Сек.Кандидат.ПометкаУдаления
ччто-то не то?
11 Ryzeman
 
28.01.22
13:14
(10) Начнём с 1.
Ну и если сюда попадают помеченные на удаление ЗаявкаКандидата то это тоже некорректно.

ВЫБРАТЬ
    Рег.Период КАК Период,
    Рег.ЗаявкаКандидата КАК Кандидат,
    Рег.Состояние КАК Состояние
ПОМЕСТИТЬ ВТ_ТекущийСтатус
ИЗ
    РегистрСведений.ТекущаяРаботаПоЗаявкамКандидатов.СрезПоследних(&ДатаКонец) КАК Рег
  
Затем

ВЫБРАТЬ
    Рег.Период КАК Период,
    Рег.ЗаявкаКандидата КАК ЗаявкаКандидата
ПОМЕСТИТЬ ВТ_ВыборкаПоДатамИзменения
ИЗ
    РегистрСведений.ТекущаяРаботаПоЗаявкамКандидатов КАК Рег
ГДЕ
    Рег.Период МЕЖДУ &ДатаНачало И &ДатаКонец
;
ВЫБРАТЬ
    КОЛИЧЕСТВО( РАЗЛИЧНЫЕ ТаблицаДляСвязи.ЗаявкаКандидата) КАК Номер,
    Таблица.Период,
    Таблица.ЗаявкаКандидата
ИЗ
    ВТ_ВыборкаПоДатамИзменения КАК Таблица
ЛЕВОЕ СОЕДИНЕНИЕ
    ВТ_ВыборкаПоДатамИзменения КАК ТаблицаДляСвязи
    ПО Таблица.ЗаявкаКандидата = ТаблицаДляСвязи.ЗаявкаКандидата  
    И Таблица.Период >= ТаблицаДляСвязи.Период  
СГРУППИРОВАТЬ ПО
    Таблица.Период
    Таблица.ЗаявкаКандидата
;
УНИЧТОЖИТЬ ВТ_ВыборкаПоДатамИзменения
;
ВЫБРАТЬ
ЛеваяТаблица.ЗаявкаКандидата КАК ЗаявкаКандидата,
ЛеваяТаблица.Период КАК ДатаПоследнегоСтатуса,
ЕСТЬNULL(ПраваяТаблица.Период, ЛеваяТаблица.Период)  КАК ДатаПредыдущегоСтатуса,
РАЗНОСТЬДАТ(ЕСТЬNULL(ПраваяТаблица.Период, ЛеваяТаблица.Период), ЛеваяТаблица.Период) КАК СекундыВсего
ИЗ
  ВТ_ВыборкаПоДатамИзменения КАК ЛеваяТаблица
ЛЕВОЕ СОЕДИНЕНИЕ
  ВТ_ВыборкаПоДатамИзменения КАК ПраваяТаблица
ПО
  ЛеваяТаблица.ЗаявкаКандидата = ПраваяТаблица.ЗаявкаКандидата
  И ЛеваяТаблица.Номер = ПраваяТаблица.Номер + 1



Могут быть ошибки и неточности, естественно я это не отлаживал, дальше думай сам :)
12 Никмейн
 
28.01.22
13:49
(11) спасибо
13 Никмейн
 
31.01.22
09:59
(11) ошибка пишет в строчке, что типа нету Номера
И ЛеваяТаблица.Номер = ПраваяТаблица.Номер + 1