Имя: Пароль:
1C
1С v8
Из периода убрать периоды в запросе
, ,
0 Pershin Sergei88
 
27.12.16
10:22
Не пойму как сделать связь в запросе, подскажите куда копать.

Имеем 2 таблицы:
1)
Начало     | конец
01.01.2016 |  31.12.2016

2)
Начало     | конец
15.01.2016 |  05.02.2016
01.08.2016 |  10.08.2016


Необходимо получить таблицу
Начало     | конец
01.01.2016 |  14.01.2016
06.02.2016 |  31.07.2016
11.08.2016 |  31.12.2016
1 desaint08
 
27.12.16
10:26
а в третьей таблице колонка "конец"откуда?
2 Pershin Sergei88
 
27.12.16
10:27
(1) из первой
3 Pershin Sergei88
 
27.12.16
10:27
нужно исключить из первой таблицы периоды 2й
4 desaint08
 
27.12.16
10:27
то есть я не пойму как собирается третья таблица,опишите хоть чуть чуть
5 Pershin Sergei88
 
27.12.16
10:29
есть год, это запись первой табл., из этого года нужно исключить периоды которые находятся во 2й табл.
6 CMblCL
 
27.12.16
10:29
(0) Получается из периодов первой строки "вычитаются" периоды второй строки, и в результате остаются только те дни, которые есть в первой таблице, но остутствуют во второй?
7 Pershin Sergei88
 
27.12.16
10:30
(6) верно
8 CMblCL
 
27.12.16
10:30
(6) первой таблицы*
второй таблицы*
9 Pershin Sergei88
 
27.12.16
10:31
(8) смысл ты понял верно
10 SeraFim
 
27.12.16
10:32
Внутри каждой таблицы периоды могут пересекаться?
11 desaint08
 
27.12.16
10:37
интересно,ищу.
12 Pershin Sergei88
 
27.12.16
10:43
(10) внутри таблиц периоды не пересекаются
13 osa1C
 
27.12.16
10:43
(0) Что-то на вытеснение похоже. В ЗУП же есть что-то похожее. Я просто ЗУП не занимаюсь
14 ГдеСобака Зарыта
 
27.12.16
10:44
Надо Таб 2 привести в линейный вид типа
01.01.2016 |Начало
05.02.2016 |Конец
01.08.2016 |Начало
10.08.2016 |Конец
А дальше дело техники
15 Pershin Sergei88
 
27.12.16
10:45
(13) в зуп есть вытеснение регистрами расчета реализовано. но тут нужно проделать похожее в запросе
уже голову сломал себе этим
16 Pershin Sergei88
 
27.12.16
10:47
(14) что даст этот линейный вид ?
допустим привел (это не сложно будет сделать)
01.01.2016 |Начало
31.12.2016 |Конец
15.01.2016 |Начало
05.02.2016 |Конец
01.08.2016 |Начало
10.08.2016 |Конец
17 desaint08
 
27.12.16
10:50
а если попробовать что то типа взять чтото из перваятаблица левое соединение втораятаблица по перваятаблица.начало не между втораятаблица началои вторая таблица конец ),это я так думаю,но опыта у меня мало.
18 SeraFim
 
27.12.16
10:52
1. Преобразуешь в таблицу со всеми датами изменения:
Дата
01.01.2016
15.01.2016
05.02.2016
01.08.2016
10.08.2016
31.12.2016

2. Для каждой даты ищешь следующую дату, минимально возможную. От неё отнимаешь 1 день получаешь все возможные периоды.
01.01.2016 - 15.01.2016
15.01.2016 - 05.02.2016
05.02.2016 - 01.08.2016
01.08.2016 - 10.08.2016
10.08.2016 - 31.12.2016
31.12.2016 - неизвестно

далее остается исключить ненужные периоды. Как проще? Зависит от начилия пересечений
19 desaint08
 
27.12.16
10:55
таблица1.дата между таблица1.начало и таблица1.конец <> таблица2.дата между таблица2.начало и таблица2.конец
20 SeraFim
 
27.12.16
10:59
+(18)тьфу. Забыл поменять. Правильно так:
1. Преобразуешь в таблицу со всеми датами изменения с учетом того, что "изменения" происходят после даты окончания. Другими словами - даты начала берешь как есть, а к датам окончания прибавляешь 1 день.
Дата
01.01.2016
15.01.2016
06.02.2016
01.08.2016
11.08.2016
31.12.2016

2. Для каждой даты ищешь следующую дату, минимально возможную. От неё отнимаешь 1 день получаешь все возможные периоды.
01.01.2016 - 14.01.2016
15.01.2016 - 05.02.2016
06.02.2016 - 31.07.2016
01.08.2016 - 10.08.2016
11.08.2016 - 31.12.2016
01.01.2017 - неизвестно

далее остается исключить ненужные периоды.
21 SeraFim
 
27.12.16
11:03
Пункт 2 делается что-то типа такого (работоспособность не проверял - лень)))

ВЫБРАТЬ
    ВТДаты.Период КАК ДатаНачала,
    МИНИМУМ(ЕСТЬNULL(ДОБАВИТЬКДАТЕ(СледующиеИзменения.Период, ДЕНЬ, -1), &КонецМесяца)) КАК ДатаОкончания
ПОМЕСТИТЬ ВТПериоды
ИЗ
    ВТДаты КАК ВТДаты
        ЛЕВОЕ СОЕДИНЕНИЕ ВТДаты КАК СледующиеИзменения
        ПО ВТДаты.Период < СледующиеИзменения.Период
22 desaint08
 
27.12.16
11:08
автор отпишись как оно работать будет
23 Pershin Sergei88
 
27.12.16
11:09
(22) моделирую идею  SeraFim в консоли запросов.
24 Pershin Sergei88
 
27.12.16
11:17
https://cloud.mail.ru/public/9rV7/tsMpZA6uU
запрос в консоле

(21) Спасибо. все получилось
25 Pershin Sergei88
 
27.12.16
11:17
ВЫБРАТЬ
    &НачалоТ1 КАК Начало,
    &КонецТ1 КАК конец
ПОМЕСТИТЬ ВТТаблица1
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    &Начало1Т2 КАК Начало,
    &Конец1Т2 КАК конец
ПОМЕСТИТЬ ВТТаблица2

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    &Начало2Т2,
    &Конец2Т2
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТТаблица1.Начало КАК Период
ПОМЕСТИТЬ SeraFim_1
ИЗ
    ВТТаблица1 КАК ВТТаблица1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ВТТаблица2.Начало
ИЗ
    ВТТаблица2 КАК ВТТаблица2

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(ВТТаблица1.конец, ДЕНЬ, 1)
ИЗ
    ВТТаблица1 КАК ВТТаблица1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(ВТТаблица2.конец, ДЕНЬ, 1)
ИЗ
    ВТТаблица2 КАК ВТТаблица2
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    SeraFim_1.Период КАК ДатаНачала,
    МИНИМУМ(ДОБАВИТЬКДАТЕ(СледующиеПериоды.Период, ДЕНЬ, -1)) КАК ДатаКонец
ПОМЕСТИТЬ SeraFim_2
ИЗ
    SeraFim_1 КАК SeraFim_1
        ЛЕВОЕ СОЕДИНЕНИЕ SeraFim_1 КАК СледующиеПериоды
        ПО SeraFim_1.Период < СледующиеПериоды.Период
ГДЕ
    НЕ СледующиеПериоды.Период ЕСТЬ NULL

СГРУППИРОВАТЬ ПО
    SeraFim_1.Период
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    SeraFim_2.ДатаНачала,
    SeraFim_2.ДатаКонец,
    ВТТаблица2.Начало,
    ВТТаблица2.конец
ИЗ
    SeraFim_2 КАК SeraFim_2
        ЛЕВОЕ СОЕДИНЕНИЕ ВТТаблица2 КАК ВТТаблица2
        ПО SeraFim_2.ДатаНачала = ВТТаблица2.Начало
            И SeraFim_2.ДатаКонец = ВТТаблица2.конец
ГДЕ
    ВТТаблица2.Начало ЕСТЬ NULL
26 desaint08
 
27.12.16
11:17
(23) все равно конечный рабочий вариант я посмотрел бы интересная задачка
27 Pershin Sergei88
 
27.12.16
11:18
(26) выложил выше
28 desaint08
 
27.12.16
11:23
(27) я понял,спасибо.
Закон Брукера: Даже маленькая практика стоит большой теории.