Имя: Пароль:
1C
1С v8
Запрос к периодическому РС - свернуть в таблицу "начало-окончание"
0 mikhailovaew
 
09.10.13
10:41
ПРошу подсказать, как правильно написать запрос к периодическому регистру сведений, чтобы на выходе получалась таблица вида Измерение - Начало - Окончание.
Помещаю движения регистра в ВТ, соединяю ее с собой по неравенству периода - получаются лишние записи. То есть такой текст:
//////////////////////////////////////////////////////////////////////ВЫБРАТЬ
    РС.Период,
    РС.Сотрудник,
    РС.Подразделение
ПОМЕСТИТЬ ВТ_Перемещения
ИЗ
    РегистрСведений.Сотрудники КАК РС
;

//////////////////////////////////////////////////////////////////////ВЫБРАТЬ
    ВТ1.Сотрудник,
    ВТ1.Подразделение,
    ВТ1.Период КАК Начало,
    ВТ2.Период КАК Окончание
ИЗ
    ВТ_Перемещения КАК ВТ1
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Перемещения КАК ВТ2
        ПО ВТ1.Сотрудник = ВТ2.Сотрудник
            И ВТ1.Период < ВТ2.Период

при наличии в регистре 3 записей по сотруднику (перемещения 01.04, 01.08, 01.10) дает 3 строки:
1) 01.04-01.08
2) 01.04-01.10 (лишняя строка!)
3) 01.08-01.10
а нужно 2:
1) 01.04-01.08
2) 01.08-01.10

Как правильно составить запрос?
1 Sabbath
 
09.10.13
10:47
(0) сгруппировать по минимум(начало) максимум(окончание)
2 Sabbath
 
09.10.13
10:48
+(1) а, не так задачу понял, думал одна строка нужна
3 mikhailovaew
 
09.10.13
10:49
(2) нужно разбить РС на периоды
4 Rovan
 
гуру
09.10.13
10:49
ВТ1.Сотрудник,
    ВТ1.Подразделение,
    ВТ1.Период КАК Начало,
    МАКСИМУМ(ВТ2.Период) КАК Окончание
5 Sabbath
 
09.10.13
10:50
тогда можно сделать два таких запроса в одном группировка два раза по минимум в другом два раза по максимуму и объединить их
6 mikhailovaew
 
09.10.13
10:52
(4) тогда получается так:
1) 01.04-01.10
2) 01.08-01.10
7 Sabbath
 
09.10.13
10:52
(4) не прокатит с другими данными
8 mikhailovaew
 
09.10.13
10:53
(5) не совсем поняла, не могли бы Вы привести полный текст запроса?
9 mikhailovaew
 
09.10.13
10:53
(7) оно и с текущими не прокатывает, не те периоды получаются...
10 Rie
 
09.10.13
10:54
(8) Посмотри v8: Сделать отчет по времени сопровождения клиентов
там - аналогичная задача.
11 Ненавижу 1С
 
гуру
09.10.13
10:54
ВТ1.Сотрудник,
    ВТ1.Подразделение,
    ВТ1.Период КАК Начало,
    MIN(ВТ2.Период) КАК Окончание
ИЗ
    ВТ_Перемещения КАК ВТ1
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Перемещения КАК ВТ2
        ПО ВТ1.Сотрудник = ВТ2.Сотрудник
            И ВТ1.Период < ВТ2.Период

СГРУППИРОВАТЬ ПО
ВТ1.Сотрудник,
    ВТ1.Подразделение,
    ВТ1.Период
12 mikhailovaew
 
09.10.13
10:55
(11) да, то, что нужно! спасибо!
13 Sabbath
 
09.10.13
10:59
(5)

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

//////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ВТ1.Сотрудник,
    ВТ1.Подразделение,
    ВТ1.Период КАК Начало,
    ВТ2.Период КАК Окончание
ПОМЕСТИТЬ ВТ_Периоды
ИЗ
    ВТ_Перемещения КАК ВТ1
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Перемещения КАК ВТ2
        ПО ВТ1.Сотрудник = ВТ2.Сотрудник
            И ВТ1.Период < ВТ2.Период

//////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ВТ.Сотрудник,
    ВТ.Подразделение,
    МИНИМУМ(ВТ.Начало) КАК Начало,
    МИНИМУМ(ВТ.Окончание) КАК Окончание
ИЗ
    ВТ_Периоды КАК ВТ

СГРУППИРОВАТЬ ПО
ВТ.Сотрудник,
    ВТ.Подразделение
      
ОБЪЕДИНИТЬ

ВЫБРАТЬ
    ВТ.Сотрудник,
    ВТ.Подразделение,
    МАКСИМУМ(ВТ.Начало) КАК Начало,
    МАКСИМУМ(ВТ.Окончание) КАК Окончание
ИЗ
    ВТ_Периоды КАК ВТ

СГРУППИРОВАТЬ ПО
ВТ.Сотрудник,
    ВТ.Подразделение
14 mikhailovaew
 
09.10.13
11:04
(13) спасибо Вам за помощь. Решение (11) мне пока нравится больше, оно на 2 запроса короче, его работоспособность я уже проверила.
Есть ситуации, когда Ваше решение отработает лучше?
15 Sabbath
 
09.10.13
11:12
(11) написал как (4)
Не прокатит если будет вот так
01.04-01.08
01.04-01.05
01.04-01.10
01.05-01.08
01.05-01.10
01.08-01.10

в результате будет три строки
01.04-01.08
01.05-01.08
01.08-01.10

Я так понимаю надо две строки первую и последнюю
16 Sabbath
 
09.10.13
11:14
+(15) (14) Перечитал задачу, сплю. Задача не в этом и (11) правильно
17 mikhailovaew
 
09.10.13
11:18
(16) да, я прогнала на тестовых данных (11), получила как раз что надо:
1) 01.04-01.08
2) 01.08-01.10
3) 01.10-null (что тоже неплохо, хоть в первоначальной постановке не озвучено)
18 ProgAL
 
09.10.13
11:36
А зачем лишние соединения.

ВЫБРАТЬ
    РС.Товар,
    РС.Контрагент,
    МИНИМУМ(РС.Период),
    МАКСИМУМ(РС.Период)
ИЗ
    РегистрСведений.РС КАК РС

СГРУППИРОВАТЬ ПО
    РС.Товар,
    РС.Контрагент
19 Sabbath
 
09.10.13
11:39
(18) так ты получишь одну строку, а надо несколько последовательных периодов как бы
20 Sabbath
 
09.10.13
11:40
(17) да, я просто понял задачу, что нужен первый и последний период, а нужны и промежуточные. Так что с (11) все ок
21 Sabbath
 
09.10.13
11:41
(17) последнюю строку можно отсеять условием не есть Null кстати, если не нужна