Имя: Пароль:
1C
1С v8
Вывод отчета с периодичностью
0 chingiz
 
28.09.11
12:41
Данные беру из периодических(в пределах секунды) РегистровСведений. Нужно выводить дату-время с периодичностью 5 минут. Т.е. допустим у нас есть время 14:12:30,14:11:40,14:04:39,14:06:07 и нужно, чтобы в отчете это выглядело:

14:00 - сюда попадает время 14:04
14:05 - сюда 14:06:07
14:10 - сюда 14:12, 14:11
14:15 и т.д.
И ресурсы, которые попали в один промежуток нужно сложить.

Возможно ли вообще такое?
1 Inform
 
28.09.11
12:43
(0) сделай поле, в котором будет начало пятиминутки и по нему группировку
2 chingiz
 
28.09.11
13:00
(1) как? Регистр то не виртуальный, периодичность мышкой не задать.
3 Defender aka LINN
 
28.09.11
13:05
(2) Вы знаете, иногда таки приходится брать в руки клавиатуру и писать этот ваш код.
4 chingiz
 
28.09.11
13:07
Ну я же не прошу писать мне код...подскажите какой функцией это можно сделать, дальше уж разберусь. Думал мб поможет
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(нашПериод, ЧАС), МИНУТА, 5), но не то...
5 IronDemon
 
28.09.11
13:08
(4) Почему не то?
6 IronDemon
 
28.09.11
13:11
(0) Нужно сделать таблицу с нужной периодичностью и с ней соединять.
7 Ненавижу 1С
 
гуру
28.09.11
13:20
вот это НАЧАЛОПЕРИОДА(Период,Минута) даст начало минуты
вот это НАЧАЛОПЕРИОДА(Период,Час) даст начало часа
вот это РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(Период,Минута),НАЧАЛОПЕРИОДА(Период,Час),Минута) даст минут с начала часа
ВЫРАЗИТЬ((РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(Период,Минута),НАЧАЛОПЕРИОДА(Период,Час),Минута)/5-0.5) КАК ЧИСЛО (2,0)) даст число полных пятиминуток
наконец ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(Период,Час),Минута,ВЫРАЗИТЬ((РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(Период,Минута),НАЧАЛОПЕРИОДА(Период,Час),Минута)/5-0.5) КАК ЧИСЛО (2,0))*5) даст начало каждой пятиминутки
вот по последнему и надо группировать
8 FIXXXL
 
28.09.11
13:24
Минута (Minute)
Синтаксис:

Минута(<Дата>)
Параметры:

<Дата> (обязательный)

Тип: Дата. Исходная дата.
Возвращаемое значение:

Тип: Число. Минута в часе указанной даты.
Описание:

Определяет минуту в часе указанной даты.

Доступность:

Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.
Пример:

Сообщить(Минута(ТекущаяДата()));


и в ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(нашПериод, ЧАС), МИНУТА, 5)
вместо "5" выбор когда тогда
9 IronDemon
 
28.09.11
13:25
или так (7)
10 Inform
 
28.09.11
13:33
(0) Держи:

ВЫБОР
   КОГДА МИНУТА(&Период) / 5 > (ВЫРАЗИТЬ(МИНУТА(&Период) / 5 КАК ЧИСЛО(2, 0)))
       ТОГДА ВЫРАЗИТЬ(МИНУТА(&Период) / 5 КАК ЧИСЛО(2, 0))
   ИНАЧЕ (ВЫРАЗИТЬ(МИНУТА(&Период) / 5 КАК ЧИСЛО(2, 0))) - 1
КОНЕЦ * 5
11 Inform
 
28.09.11
13:37
+ (10) вернее вот так будет целиком получение даты:

ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&Период, ЧАС), МИНУТА, ВЫБОР
       КОГДА МИНУТА(&Период) / 5 >= (ВЫРАЗИТЬ(МИНУТА(&Период) / 5 КАК ЧИСЛО(2, 0)))
           ТОГДА ВЫРАЗИТЬ(МИНУТА(&Период) / 5 КАК ЧИСЛО(2, 0))
       ИНАЧЕ (ВЫРАЗИТЬ(МИНУТА(&Период) / 5 КАК ЧИСЛО(2, 0))) - 1
   КОНЕЦ * 5)
12 chingiz
 
28.09.11
13:50
Респект, пока обедал уже выдали решение на готово :) Всем спасибо!
13 chingiz
 
29.09.11
11:25
Возник еще один вопрос. Каким образом можно вывести вообще весь день с заданной периодичностью? Если данные на период отсутствуют, то нужно получить последнее состояние ресурса.

Например:  

00:05 есть данные, что объект на месте
00:10 нет никаких данных, но нужно получить последние с 00:05
14 chingiz
 
29.09.11
12:55
МассивДат = Новый Массив;
   ТекДата = НачалоПериода;
   ДатаК = КонецПериода;
   
   Пока ТекДата < ДатаК Цикл
       
       МассивДат.Добавить(ТекДата);
       ТекДата = ТекДата +60*5
       
   КонецЦикла;

Получаем массив пятиминуток в требуемом периоде. Как теперь это совместить с моим запросом?
15 Ненавижу 1С
 
гуру
29.09.11
13:13
(14) получи ТЗ, отправь на сервер в виде временной таблицы
16 chingiz
 
03.10.11
10:37
Все-таки через ТЗ не получится. Знакомый подсказал:
в СКД нужно получить колонку дат, а не массив дат программно

выбор датавремя(данныедаты1) как Период
объединить
выбрать датавремя(данные2)
объединить ....

Но скилл маловат, чтобы самому осмыслить это :\
17 chingiz
 
03.10.11
14:23
Все еще актуально.
18 chingiz
 
03.10.11
14:24
Чтобы не читать с начала - задание в (13)
19 chingiz
 
04.10.11
12:13
В скд создал второй набор и после создания текста, заменяю запрос.

Текст = "
   |ВЫБРАТЬ
   |ДАТАВРЕМЯ("+Формат(ДатаНач,"ДФ=""гггг""")+","+Месяц(ДатаНач)+","+День(ДатаНач)+","+Час(ДатаНач)+","+Минута(ДатаНач)+","+Секунда(ДатаНач)+")
   |КАК Период";
   
   Пока ДатаМасс <= ДатаКон Цикл
       
       ДатаМасс = ДатаМасс + 60*5;
       
       Текст = Текст + Символы.ПС + "ОБЪЕДИНИТЬ" + Символы.ПС +"ВЫБРАТЬ
       |ДАТАВРЕМЯ("+Формат(ДатаМасс,"ДФ=""гггг""")+","+Месяц(ДатаМасс)+","+День(ДатаМасс)+","+Час(ДатаМасс)+","+Минута(ДатаМасс)+","+Секунда(ДатаМасс)+")
       |";
       
   КонецЦикла;

Теперь выводит все даты, но нужно чтобы при отсутствии движений он брал последнее значение ресурса. Как  это организовать?
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан