Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

дан регистр сведений. В нем есть объект и каждый день фиксируется состояние объекта

дан регистр сведений. В нем есть объект и каждый день фиксируется состояние объекта
Я
   Dmitriy1C_Rookie
 
29.03.21 - 16:36
дан регистр сведений. В нем есть объект и каждый день фиксируется состояние объекта действителен или нет. нужно сделать отчет в котором будет объекты и их промежутки времени когда они были действительны. Как это можно сделать?
   Dmitriy1C_Rookie
 
1 - 29.03.21 - 16:38
Непериодический регистр сведений нужно разбить на периоды
   Dmitriy1C_Rookie
 
2 - 29.03.21 - 16:39
не понимаю как можно разбить даты на периоды в отчете
   Kassern
 
3 - 29.03.21 - 16:43
(2) и как ты себе это представляешь? Представь себе объект и его история 1-5 действителен, далее 7,9,11. В остальные дни не действителен. Как ты себе представляешь вывод периодами? Если ты выведешь даты как отдельные колонки таблицы, а объект в строки это подойдет?
   RomanYS
 
4 - 29.03.21 - 16:46
   Dmitriy1C_Rookie
 
5 - 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  сегодня
   Dmitriy1C_Rookie
 
6 - 29.03.21 - 16:52
и это нужно сделать в виде отчета
   Kassern
 
7 - 29.03.21 - 16:57
(5) можно попробовать соединить с этой же таблицей. В соединении привязать по объекту, дату сделать больше чем в левой таблице и указать, что недействителен. В правой таблице взять минимум по дате.
   Kassern
 
8 - 29.03.21 - 16:58
(7) если "По" null, тогда текушая дата
   Kassern
 
9 - 29.03.21 - 17:02
(7) грубо говоря ты привяжешь 2 одинаковые таблицы, в первой таблице у тебя должны быть только строки с "действителен", во второй - только с "недействителен". Дата второй таблицы должна быть больше чем в первой и взять минимальную дату по этой таблице.
   Alres
 
10 - 29.03.21 - 17:05
т.е. для каждой строки нужно подтянуть дату когда значение этой строки изменилось, это минимум по дате из всех следующих записей с противоположным состоянием.
Потом эту таблицу свернуть соотв. по минимуму текущей даты
   Dmitriy1C_Rookie
 
11 - 29.03.21 - 18:13
ВЫБРАТЬ
    СостояниеРаботыУстройств.Устройство КАК Устройство,
    СостояниеРаботыУстройств.Включено КАК Состояние,
    СостояниеРаботыУстройств.ДатаСостояния КАК НачПериод,
    МИНИМУМ(СостояниеРаботыУстройств1.ДатаСостояния) КАК КонПериод
ИЗ
    РегистрСведений.СостояниеРаботыУстройств КАК СостояниеРаботыУстройств
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостояниеРаботыУстройств КАК СостояниеРаботыУстройств1
        ПО (СостояниеРаботыУстройств.Устройство = СостояниеРаботыУстройств1.Устройство)
            И (СостояниеРаботыУстройств.ДатаСостояния < СостояниеРаботыУстройств1.ДатаСостояния)

СГРУППИРОВАТЬ ПО
    СостояниеРаботыУстройств.Устройство,
    СостояниеРаботыУстройств.ДатаСостояния,
    СостояниеРаботыУстройств.Включено

УПОРЯДОЧИТЬ ПО
    СостояниеРаботыУстройств.Устройство

выводит
объект1 4.01.2000 5.01.2000 недействителен
объект1 5.01.2000 5.01.2000 недействителен
   Kesim
 
12 - 29.03.21 - 18:24
имхо: вывести полную таблицу, обойти кодом, вывести в табдок
   Eiffil123
 
13 - 29.03.21 - 18:36
Сделать регистр расчета, там настроить вытеснение по двум видам расчета ))

но вообще в качестве затравки можно так:
1. получить даты изменения состояния - соединяем таблицу с собой же по объекту и дате - прибавляем 1 день.
Будет таблица вида
Объект
Дата состояния
Состояние на текущую дату
Состояние на прошлую дату
2. Фильтруем полученную таблицу, где состояние текущее и предыдущее не равно.
3. Соединяем полученную таблицу с собой же по максимуму даты (а-ля срез последних) и объекту.

ps задача интересная для собеседования
   b_ru
 
14 - 29.03.21 - 20:21
(11) Во-первых забыл связь по состояние1 <> состояние2. Во-вторых должно быть 2 последовательных операции группировки. Как-то так:

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

ИЗ
(ВЫБРАТЬ
    СостояниеРаботыУстройств.Устройство КАК Устройство,
    СостояниеРаботыУстройств.Включено КАК Состояние,
    СостояниеРаботыУстройств.ДатаСостояния КАК НачПериод,
    МИНИМУМ(СостояниеРаботыУстройств1.ДатаСостояния) КАК КонПериод
ИЗ
    РегистрСведений.СостояниеРаботыУстройств КАК СостояниеРаботыУстройств
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостояниеРаботыУстройств КАК СостояниеРаботыУстройств1
        ПО (СостояниеРаботыУстройств.Устройство = СостояниеРаботыУстройств1.Устройство)
            И (СостояниеРаботыУстройств.ДатаСостояния < СостояниеРаботыУстройств1.ДатаСостояния)
            И (СостояниеРаботыУстройств.Включено <> СостояниеРаботыУстройств1.Включено)

СГРУППИРОВАТЬ ПО
    СостояниеРаботыУстройств.Устройство,
    СостояниеРаботыУстройств.ДатаСостояния,
    СостояниеРаботыУстройств.Включено

УПОРЯДОЧИТЬ ПО
    СостояниеРаботыУстройств.Устройство) КАК СостояниеРаботыУстройств
СГРУППИРОВАТЬ ПО
    СостояниеРаботыУстройств.Устройство,
    СостояниеРаботыУстройств.Состояние,
    СостояниеРаботыУстройств.КонПериод
   Dmitriy1C_Rookie
 
15 - 29.03.21 - 21:07
(11) поле не найдено СостояниеРаботыУстройств1.КонПериод (5 строка)
   Dmitriy1C_Rookie
 
16 - 29.03.21 - 21:15
СостояниеРаботыУстройств1.КонПериод нужно заменить на  СостояниеРаботыУстройств.КонПериод
   mikecool
 
17 - 29.03.21 - 21:20
в 4 был ответ
можно еще поискать тета-соединение в запросе
   mikecool
 
18 - 29.03.21 - 21:21
   mikecool
 
19 - 29.03.21 - 21:21

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.