Имя: Пароль:
1C
1С v8
Разность дат из строк РегистраСведений
,
0 Antoshik86
 
10.05.16
11:42
Имеется регистр сведений, содержащий заявки клиентов.

Необходимо получить количество дней обслуживания за искомый период, положим за месяц апрель(04):
К примеру : с 01.04 по 30.04

1|21.03.16 ПостановкаНаОсблуж
2|27.03.16 ПриостановкаОбслуж  
3|04.04.16 ВозобновлениеОбслуж 4 дняП (тк с 01.04)
4|07.04.16 ПриостановкаОбслуж  3 дняВ
5|10.04.16 ВозобновлениеОбслуж 3 дняП
6|13.04.16 ПриостановкаОбслуж  3 дняВ
7|20.04.16 ВозобновлениеОбслуж 7 днейП
8|29.04.16 ПриостановкаОбслуж  9 днейВ
9|05.05.16 ОтключениеОбслуж    1 деньП (тк по 30.04)

Дней обслуживания 3+3+9   = 15
Дней приостановки 4+3+7+1 = 15

Собственно есть РазностьДат (Д1,Д2,День). Вопрос в том как вычислять Д1 и Д2 из строк регистра и учитывать ситуацию с началом и окончанием периода.
1 hhhh
 
10.05.16
11:46
сгруппируй строки
2 Antoshik86
 
10.05.16
12:47
Группировать пробую, в примере я сам посчитал кол-во дней на само дели ничего не записано. Т.е. исходные данные
1|21.03.16 ПостановкаНаОсблуж
2|27.03.16 ПриостановкаОбслуж  
3|04.04.16 ВозобновлениеОбслуж
4|07.04.16 ПриостановкаОбслуж  
5|10.04.16 ВозобновлениеОбслуж
6|13.04.16 ПриостановкаОбслуж  
7|20.04.16 ВозобновлениеОбслуж
8|29.04.16 ПриостановкаОбслуж  
9|05.05.16 ОтключениеОбслуж

подглядел такой способ на скльформуме правда для акцесса

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

СГРУППИРОВАТЬ ПО
    УчетЗаявок1.ДатаЗаявки
    РАЗНОСТЬДАТ(УчетЗаявок1.ДатаЗаявки, УчетЗаявок2.ДатаЗаявки, ДЕНЬ)

УПОРЯДОЧИТЬ ПО
    Дата1
3 Antoshik86
 
11.05.16
05:11
Только за счет Групировки некорректный результат получается!
4 Лефмихалыч
 
11.05.16
08:26
(0) как ты в третьей строчке получил 4 дня?
5 Лефмихалыч
 
11.05.16
08:27
и в девятой тоже не понятно, из каких херов это получено.
Пока в таблице не будут все даты, запросом вряд ли что получится.
6 Мимохожий Однако
 
11.05.16
08:30
Логичнее добавить РН Оборотный "Обслуживание клиентов" с ресурсом КоличествоДней.
7 Лефмихалыч
 
11.05.16
08:31
(6) это не избавит от такого РС, т.к. думаю там одна из бизнес-потребностей - получать детализацию с этими началами и возобновлениями. А их из РС легче получать, чем из РН, тупо нагляднее будет.
8 Лефмихалыч
 
11.05.16
08:33
Надо обеспечить, чтобы в таблицу были включены и неявные записи (01.04 и 30.04) - без них ни РН, ни РС не помогут и придется все делать тупым перебором с огромным рогатым ЕстиТогдаИначеЕслиТогда
9 Лефмихалыч
 
11.05.16
08:47
Это вот, если в таблице есть все записи и она начинается с возобновления

ВЫБРАТЬ
    ВТ.Событие,
    ВТ.Дата
ПОМЕСТИТЬ События
ИЗ
    &ВТ КАК ВТ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    События.СОбытие,
    События.Дата,
    МИНИМУМ(События1.Дата) КАК Дата1
ПОМЕСТИТЬ Интервалы    
ИЗ
    События КАК События
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ События КАК События1
        ПО События.Дата < События1.Дата

СГРУППИРОВАТЬ ПО
    События.Дата,
    События.СОбытие
;
ВЫБРАТЬ * из Интервалы где событие = "Возобновление"
10 ЛучшийПрограммер1С
 
11.05.16
08:48
(6) Да, но в него тогда надо данные каждый день писать +1 по обслуживанию или +1 по простою, не думаю, что это решение нормальное. Да и кто регистратором будет в таком случае?
11 Ildarovich
 
11.05.16
08:50
Подход в (2) имеет определенные проблемы с производительностью на больших объемах данных из-за использования неравенства в условиях соединения.

В статье "Быстрое определение интервалов в запросе" http://catalog.mista.ru/public/402534/ приведен быстрый метод, свободный от этого недостатка. С линейной зависимостью трудоемкости от объема данных.

В целом нужно определить все интервалы и выбрать те, где событие В ("ПостановкаНаОбслуж", "ВозобновлениеОбслуж")
12 Лефмихалыч
 
11.05.16
08:52
(10) не обязательно каждый день, можно с  той же частотой, что и сейчас. Просто использование РН перенесет момент решения задачи с формирования отчетности на момент записи данных в базу.
13 Лефмихалыч
 
11.05.16
08:53
(11) спасибо
14 ЛучшийПрограммер1С
 
11.05.16
08:55
(12) понял, спасибо
15 ЛучшийПрограммер1С
 
11.05.16
08:57
(11) Что-то тут не так в последней строчке:

Дата      НачалоИнтервала КонецИнтервала
     ------>
t1           t1     t2
t2           t2     t3
t3          t3     t4
...           ...     ...
tn           tn-1     tn

Надо:
...           ...     ...
tn-1           tn-1     tn
tn
16 Лефмихалыч
 
11.05.16
09:01
(11) что означает вот это троеточие? Объединение 32х таблиц?
http://s018.radikal.ru/i524/1605/f9/6a4dd737c108.png
17 Лефмихалыч
 
11.05.16
09:02
(15) все норм - для tn нет интервала, там null'ы
18 Лефмихалыч
 
11.05.16
09:03
+(17) ну, или есть только начало интервала, но суть не меняется
19 ЛучшийПрограммер1С
 
11.05.16
09:04
(17) И я о том же, вообще строчки нет, а не нулы
20 Лефмихалыч
 
11.05.16
09:05
(19) нет, строчка есть. Значение tn есть, значит и строчка есть.
21 ЛучшийПрограммер1С
 
11.05.16
09:07
(16) Нет, там 30 таблиц временных определяются походу
22 ЛучшийПрограммер1С
 
11.05.16
09:08
(20) Нет, там суть в том, что из вектора надо получить матрицу с размерностью на 1 строчку меньше
23 Лефмихалыч
 
11.05.16
09:08
(21) вот я чо и спрашиваю... в 30 временных я не верю просто
24 ЛучшийПрограммер1С
 
11.05.16
09:09
(23) Там как-то одна через другую вычисляются
25 ЛучшийПрограммер1С
 
11.05.16
09:12
(23) Я тоже ничего не понял в этой статье )
26 Ildarovich
 
11.05.16
10:05
(16) троеточие означает повторение запросов в этом месте. Всего 32 тура и 32 временный таблицы. Но каждая - в два раза меньше предыдущей, поэтому их общий объем не больше исходной! Действительно, каждая вычисляется из предыдущей. Потом еще все объединяются.

32 тура нужно для секунд. Если у вас дни, то для трех лет хватит 10-ти туров.
27 Лефмихалыч
 
11.05.16
10:08
(26) если ты слышишь треск, то это мои шаблоны :)
28 Лефмихалыч
 
11.05.16
10:09
какие, однако, кровавые иеромантические ритуалы и скатоложеские оргии приходится учинять в погоне за производительностью...
Ошибка? Это не ошибка, это системная функция.