Имя: Пароль:
1C
1С v8
дан регистр сведений. В нем есть объект и каждый день фиксируется состояние объекта
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
2 + 2 = 3.9999999999999999999999999999999...