|   |   | 
| 
 | дан регистр сведений. В нем есть объект и каждый день фиксируется состояние объекта | ☑ | ||
|---|---|---|---|---|
| 0
    
        Dmitriy1C_ Rookie 29.03.21✎ 16:36 | 
        дан регистр сведений. В нем есть объект и каждый день фиксируется состояние объекта действителен или нет. нужно сделать отчет в котором будет объекты и их промежутки времени когда они были действительны. Как это можно сделать?     | |||
| 1
    
        Dmitriy1C_ Rookie 29.03.21✎ 16:38 | 
        Непериодический регистр сведений нужно разбить на периоды     | |||
| 2
    
        Dmitriy1C_ Rookie 29.03.21✎ 16:39 | 
        не понимаю как можно разбить даты на периоды в отчете     | |||
| 3
    
        Kassern 29.03.21✎ 16:43 | 
        (2) и как ты себе это представляешь? Представь себе объект и его история 1-5 действителен, далее 7,9,11. В остальные дни не действителен. Как ты себе представляешь вывод периодами? Если ты выведешь даты как отдельные колонки таблицы, а объект в строки это подойдет?     | |||
| 4
    
        RomanYS 29.03.21✎ 16:46 | ||||
| 5
    
        Dmitriy1C_ Rookie 29.03.21✎ 16:51 | 
        объект1 1.01.2000 действителен
 объект1 2.01.2000 действителен объект1 3.01.2000 действителен объект1 4.01.2000 недействителен объект1 5.01.2000 недействителен объект1 6.01.2000 действителен должно вывестись ОБЪЕКТЫ С ПО объект1 1.01.2000 3.01.2000 объект1 6,01,2000 сегодня | |||
| 6
    
        Dmitriy1C_ Rookie 29.03.21✎ 16:52 | 
        и это нужно сделать в виде отчета     | |||
| 7
    
        Kassern 29.03.21✎ 16:57 | 
        (5) можно попробовать соединить с этой же таблицей. В соединении привязать по объекту, дату сделать больше чем в левой таблице и указать, что недействителен. В правой таблице взять минимум по дате.     | |||
| 8
    
        Kassern 29.03.21✎ 16:58 | 
        (7) если "По" null, тогда текушая дата     | |||
| 9
    
        Kassern 29.03.21✎ 17:02 | 
        (7) грубо говоря ты привяжешь 2 одинаковые таблицы, в первой таблице у тебя должны быть только строки с "действителен", во второй - только с "недействителен". Дата второй таблицы должна быть больше чем в первой и взять минимальную дату по этой таблице.     | |||
| 10
    
        Alres 29.03.21✎ 17:05 | 
        т.е. для каждой строки нужно подтянуть дату когда значение этой строки изменилось, это минимум по дате из всех следующих записей с противоположным состоянием.
 Потом эту таблицу свернуть соотв. по минимуму текущей даты | |||
| 11
    
        Dmitriy1C_ Rookie 29.03.21✎ 18:13 | 
        ВЫБРАТЬ
 СостояниеРаботыУстройств.Устройство КАК Устройство, СостояниеРаботыУстройств.Включено КАК Состояние, СостояниеРаботыУстройств.ДатаСостояния КАК НачПериод, МИНИМУМ(СостояниеРаботыУстройств1.ДатаСостояния) КАК КонПериод ИЗ РегистрСведений.СостояниеРаботыУстройств КАК СостояниеРаботыУстройств ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостояниеРаботыУстройств КАК СостояниеРаботыУстройств1 ПО (СостояниеРаботыУстройств.Устройство = СостояниеРаботыУстройств1.Устройство) И (СостояниеРаботыУстройств.ДатаСостояния < СостояниеРаботыУстройств1.ДатаСостояния) СГРУППИРОВАТЬ ПО СостояниеРаботыУстройств.Устройство, СостояниеРаботыУстройств.ДатаСостояния, СостояниеРаботыУстройств.Включено УПОРЯДОЧИТЬ ПО СостояниеРаботыУстройств.Устройство выводит объект1 4.01.2000 5.01.2000 недействителен объект1 5.01.2000 5.01.2000 недействителен | |||
| 12
    
        Kesim 29.03.21✎ 18:24 | 
        имхо: вывести полную таблицу, обойти кодом, вывести в табдок     | |||
| 13
    
        Eiffil123 29.03.21✎ 18:36 | 
        Сделать регистр расчета, там настроить вытеснение по двум видам расчета ))
 но вообще в качестве затравки можно так: 1. получить даты изменения состояния - соединяем таблицу с собой же по объекту и дате - прибавляем 1 день. Будет таблица вида Объект Дата состояния Состояние на текущую дату Состояние на прошлую дату 2. Фильтруем полученную таблицу, где состояние текущее и предыдущее не равно. 3. Соединяем полученную таблицу с собой же по максимуму даты (а-ля срез последних) и объекту. ps задача интересная для собеседования | |||
| 14
    
        b_ru 29.03.21✎ 20:21 | 
        (11) Во-первых забыл связь по состояние1 <> состояние2. Во-вторых должно быть 2 последовательных операции группировки. Как-то так:
 ВЫБРАТЬ СостояниеРаботыУстройств.Устройство, СостояниеРаботыУстройств.Состояние, МИНИМУМ(СостояниеРаботыУстройств.НачПериод), СостояниеРаботыУстройств1.КонПериод ИЗ (ВЫБРАТЬ СостояниеРаботыУстройств.Устройство КАК Устройство, СостояниеРаботыУстройств.Включено КАК Состояние, СостояниеРаботыУстройств.ДатаСостояния КАК НачПериод, МИНИМУМ(СостояниеРаботыУстройств1.ДатаСостояния) КАК КонПериод ИЗ РегистрСведений.СостояниеРаботыУстройств КАК СостояниеРаботыУстройств ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостояниеРаботыУстройств КАК СостояниеРаботыУстройств1 ПО (СостояниеРаботыУстройств.Устройство = СостояниеРаботыУстройств1.Устройство) И (СостояниеРаботыУстройств.ДатаСостояния < СостояниеРаботыУстройств1.ДатаСостояния) И (СостояниеРаботыУстройств.Включено <> СостояниеРаботыУстройств1.Включено) СГРУППИРОВАТЬ ПО СостояниеРаботыУстройств.Устройство, СостояниеРаботыУстройств.ДатаСостояния, СостояниеРаботыУстройств.Включено УПОРЯДОЧИТЬ ПО СостояниеРаботыУстройств.Устройство) КАК СостояниеРаботыУстройств СГРУППИРОВАТЬ ПО СостояниеРаботыУстройств.Устройство, СостояниеРаботыУстройств.Состояние, СостояниеРаботыУстройств.КонПериод | |||
| 15
    
        Dmitriy1C_ Rookie 29.03.21✎ 21:07 | 
        (11) поле не найдено СостояниеРаботыУстройств1.КонПериод (5 строка)     | |||
| 16
    
        Dmitriy1C_ Rookie 29.03.21✎ 21:15 | 
        СостояниеРаботыУстройств1.КонПериод нужно заменить на  СостояниеРаботыУстройств.КонПериод     | |||
| 17
    
        mikecool 29.03.21✎ 21:20 | 
        в 4 был ответ
 можно еще поискать тета-соединение в запросе | |||
| 18
    
        mikecool 29.03.21✎ 21:21 | ||||
| 19
    
        mikecool 29.03.21✎ 21:21 | 
        вот те два Покритикуйте решение - выборка количества пересекающихся периодов
 но тут есть дефекты | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |