![]() |
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 | вот те два Покритикуйте решение - выборка количества пересекающихся периодов |
|
Список тем форума |