Имя: Пароль:
1C
1С v8
Помогите с запросом
,
0 IvanVlad1
 
05.03.22
14:52
Помню где-то видел такой запрос, который сворачивает периоды
Есть таблица
ТН            ДатаНачала    ДатаОкончания    График
01934000    03.02.2022    03.02.2022    График1
01934000    04.02.2022    13.02.2022    График1
01934000    14.02.2022    16.02.2022    График1
01934000    17.02.2022    21.02.2022    График25
01934000    22.02.2022    31.12.3999    График1

Надо свернуть периоды и получить результат
ТН              ДатаНачала    ДатаОкончания    График
01934818    03.02.2022    16.02.2022    График1
01934818    17.02.2022    21.02.2022    График25
01934818    22.02.2022    31.12.3999    График1
1 МихаилМ
 
05.03.22
16:05
Ищите по "тэта-соединение"
2 МихаилМ
 
05.03.22
16:06
(0) не понял ,как 01934000    у Вас превратилась  01934000    в 01934818
3 Homer
 
05.03.22
16:12
Вот для примера

//
ВЫБРАТЬ
    "Отрезок1" КАК Ссылка,
    ДАТАВРЕМЯ(2021, 10, 1) КАК ДатаНачала,
    ДАТАВРЕМЯ(2021, 10, 2) КАК ДатаКонца,
    "+" КАК Аналитика1
ПОМЕСТИТЬ мТаб

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

ВЫБРАТЬ
    "Отрезок1",
    ДАТАВРЕМЯ(2021, 10, 2),
    ДАТАВРЕМЯ(2021, 10, 5),
    "+"
ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Отрезок1",
    ДАТАВРЕМЯ(2021, 10, 5),
    ДАТАВРЕМЯ(2021, 10, 6),
    "+"
ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Отрезок1",
    ДАТАВРЕМЯ(2021, 10, 6),
    ДАТАВРЕМЯ(2021, 10, 7),
    "+"
ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Отрезок1",
    ДАТАВРЕМЯ(2021, 10, 7),
    ДАТАВРЕМЯ(2021, 10, 9),
    "+"
ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Отрезок1",
    ДАТАВРЕМЯ(2021, 10, 9),
    ДАТАВРЕМЯ(2021, 10, 10),
    "+"
ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Отрезок1",
    ДАТАВРЕМЯ(2021, 10, 10),
    ДАТАВРЕМЯ(2021, 10, 11),
    "+"

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

ВЫБРАТЬ
    "Отрезок1",
    ДАТАВРЕМЯ(2021, 10, 5),
    ДАТАВРЕМЯ(2021, 10, 8),
    "-"

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

ВЫБРАТЬ
    "Отрезок1",
    ДАТАВРЕМЯ(2021, 10, 22),
    ДАТАВРЕМЯ(2021, 10, 25),
    "+"

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

ВЫБРАТЬ
    "Отрезок1",
    ДАТАВРЕМЯ(2021, 10, 25),
    ДАТАВРЕМЯ(2021, 10, 26),
    "+"

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

ВЫБРАТЬ
    "Отрезок2",
    ДАТАВРЕМЯ(2021, 10, 1),
    ДАТАВРЕМЯ(2021, 10, 7),
    "+"
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Таб.Ссылка КАК Ссылка,
    Таб.ДатаНачала КАК НачалоДуги,
    Таб.ДатаКонца КАК КонецДуги,
    Таб.Аналитика1
ПОМЕСТИТЬ ЗамыканияДлины1
ИЗ
    мТаб КАК Таб
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    ПерваяДуга.НачалоДуги,
    ВтораяДуга.КонецДуги,
    ВтораяДуга.Ссылка,
    ВтораяДуга.Аналитика1
ПОМЕСТИТЬ ЗамыканияДлины2
ИЗ
    ЗамыканияДлины1 КАК ПерваяДуга
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины1 КАК ВтораяДуга
        ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги
            И ПерваяДуга.Ссылка = ВтораяДуга.Ссылка
            И ПерваяДуга.Аналитика1 = ВтораяДуга.Аналитика1

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    Таб.ДатаНачала,
    Таб.ДатаКонца,
    Таб.Ссылка,
    Таб.Аналитика1
ИЗ
    мТаб КАК Таб
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    ПерваяДуга.НачалоДуги,
    ВтораяДуга.КонецДуги,
    ВтораяДуга.Ссылка,
    ВтораяДуга.Аналитика1
ПОМЕСТИТЬ ЗамыканияДлины4
ИЗ
    ЗамыканияДлины2 КАК ПерваяДуга
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины2 КАК ВтораяДуга
        ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги
            И ПерваяДуга.Ссылка = ВтораяДуга.Ссылка
            И ПерваяДуга.Аналитика1 = ВтораяДуга.Аналитика1

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    Таб.ДатаНачала,
    Таб.ДатаКонца,
    Таб.Ссылка,
    Таб.Аналитика1
ИЗ
    мТаб КАК Таб
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    ПерваяДуга.НачалоДуги,
    ВтораяДуга.КонецДуги,
    ВтораяДуга.Ссылка,
    ВтораяДуга.Аналитика1
ПОМЕСТИТЬ ЗамыканияДлины8
ИЗ
    ЗамыканияДлины4 КАК ПерваяДуга
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗамыканияДлины4 КАК ВтораяДуга
        ПО ПерваяДуга.КонецДуги = ВтораяДуга.НачалоДуги
            И ПерваяДуга.Ссылка = ВтораяДуга.Ссылка
            И ПерваяДуга.Аналитика1 = ВтораяДуга.Аналитика1

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    Таб.ДатаНачала,
    Таб.ДатаКонца,
    Таб.Ссылка,
    Таб.Аналитика1
ИЗ
    мТаб КАК Таб
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЗамыканияДлины8.НачалоДуги КАК Предок,
    МАКСИМУМ(ЗамыканияДлины8.КонецДуги) КАК Потомок,
    ЗамыканияДлины8.Ссылка,
    ЗамыканияДлины8.Аналитика1
ПОМЕСТИТЬ м1
ИЗ
    ЗамыканияДлины8 КАК ЗамыканияДлины8
ГДЕ
    ЗамыканияДлины8.НачалоДуги <> ЗамыканияДлины8.КонецДуги

СГРУППИРОВАТЬ ПО
    ЗамыканияДлины8.Ссылка,
    ЗамыканияДлины8.НачалоДуги,
    ЗамыканияДлины8.Аналитика1
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    МИНИМУМ(м1.Предок) КАК Предок,
    м1.Потомок,
    м1.Ссылка,
    м1.Аналитика1
ИЗ
    м1 КАК м1

СГРУППИРОВАТЬ ПО
    м1.Ссылка,
    м1.Потомок,
    м1.Аналитика1
4 Kigo_Kigo
 
05.03.22
16:56
а чем
ТЗ= Запрос.Выполнить.Выгрузить()
Тз.Свернуть("Колонка1,Колонка2","Количество")
не подходит?
5 hockeyist
 
05.03.22
18:14
(4) Примерно ничем, если внимательно читать вопрос
6 Dmitrii
 
гуру
05.03.22
19:16
Походе на историю, когда разработчики решили использовать регистр сведений или справочник там, где надо было сделать простейший регистр расчета с графиком и периодом действия.
7 Dmitrii
 
гуру
05.03.22
19:16
(6) *Похоже
8 youalex
 
05.03.22
20:48
(6) Разрабы типового  ЗУП , насколько я помню,  РР тоже не особо балуют, а эмулируют его на РН, и дальше всю логику строят на РН.
И существенный плюс - то что они отказались от рудиментарных семерочных  периодических регистров/срезов, а переделали всю основную логику на условно интервальные регистры (хоть и криво)
9 rsv
 
05.03.22
21:16
(0) выбрать тн, график, min(дн) , max(до) из табличка group by тн, график

Должно помочь
10 SuperMario
 
06.03.22
10:06
(9) тогда две записи будут.

03.02.2022 31.12.3999 График1
17.02.2022 21.02.2022 График25
11 Said_We
 
18.03.22
14:25
(0) Для каждой записи нужно найти ближайшую с другим значением График. Можно как после, так и перед.
Далее уже можно сворачивать.
До сих пор не понимаю зачем в РС использовать дату окончания. Запросы по вытаскиванию данных строить сложнее и данные вытаскивать сложнее. Не на много, но сложнее. Запросы получаются длиннее - из пустого в порожнее.
12 Said_We
 
18.03.22
15:37
(0)
Есть таблица
ТН            ДатаНачала    ДатаОкончания    График
01934000    03.02.2022    03.02.2022    График1
01934000    04.02.2022    13.02.2022    График1
01934000    14.02.2022    16.02.2022    График1
01934000    17.02.2022    21.02.2022    График25
01934000    22.02.2022    31.12.3999    График1

Если тут периоды всегда полные, т.е. после даты окончания не равной 31.12.3999 всегда следует запись с датой начала = дата окончания текущей записи +1 день. Можно упростить задачу и дата окончания вообще не нужна. Её можно мотом посчитать.

Есть таблица
ТН            ДатаНачала    ДатаОкончания    График    Предыдущий_График    Изменияет_График
01934000    03.02.2022    03.02.2022    График1        NULL                 Да
01934000    04.02.2022    13.02.2022    График1        График1              Нет
01934000    14.02.2022    16.02.2022    График1        График1              Нет
01934000    17.02.2022    21.02.2022    График25       График1              Да
01934000    22.02.2022    31.12.3999    График1        График25             Да

Далее не учитываем все записи, которые график не меняют и дату окончания тоже:
ТН            ДатаНачала    График    Изменияет_График
01934000    03.02.2022    График1          Да
01934000    17.02.2022    График25         Да
01934000    22.02.2022    График1          Да

А дальше собственно по такой таблице построить период не составляет сложностей.
В результате получите требуемую таблицу.
13 ejikbeznojek
 
18.03.22
15:41
Минимум (ДатаНачала), Максимум(ДатаОкончания)
Сгруппировать по ТН, График
14 ejikbeznojek
 
18.03.22
15:47
(13)
Выбрать
Минимум(ТЗ.ДатаНачала) как ДатаНачала,
Максимум(ТЗ.ДатаОкончания) как ДатаОкончания,
ТЗ.ТН как ТН,
ТЗ.График как График
из &ТвояТЗ как ТЗ
Сгруппировать по ТН, График
15 Said_We
 
18.03.22
15:52
(14) Неа. Так не пойдет. Результат будет как в (10), а это неверный результат.
16 Said_We
 
18.03.22
16:11
+ к (12) построение периода из последовательностей дат.
8.3 Накопленный итог запросом

Часть постов скрыты, например 21 - но можно смотреть по кнопке >>.
Там построение периода не в 1С если интересно. В 1С этим всё грустно - километровыми запросами решается.
17 Said_We
 
18.03.22
16:15
Странно в (16) ссылка не открывается....
Повторим для проверки
8.3 Накопленный итог запросом