Имя: Пароль:
1C
1С v8
Как получить порядковый номер декады в году?
,
0 aptomilov
 
16.02.12
14:57
Есть интересный момент
если номер декады в месяцы последний (3) тогда работает такая формула:
номер месяца * на номер декады в месяце, например 3 декада*4(апрель)=14, действительно это 12 я декада в году.
Для 1 ой и 2 ой декады это не работает.
1 aptomilov
 
16.02.12
14:58
сорри там не 14 а 12 в итоге))
2 aptomilov
 
16.02.12
15:06
Функция ПолучитьДекадуИзДаты(ИсхДата)
   ДеньДаты=День(ИсхДата);
   МесяцДаты=Месяц(ИсхДата);
   
   Если ДеньДаты<11 Тогда
       НомерДекадыВмесяце=1;
   ИначеЕсли ДеньДаты>10 и ДеньДаты<21 Тогда    
       НомерДекадыВмесяце=2;
   Иначе    
       НомерДекадыВмесяце=3;
   КонецЕсли;    
   
   Если НомерДекадыВмесяце=1 Тогда
       Декада=(НомерДекадыВмесяце+2)*МесяцДаты-2;
   ИначеЕсли НомерДекадыВмесяце=2 Тогда
       Декада=(НомерДекадыВмесяце+1)*МесяцДаты-1;
   Иначе    
       Декада=НомерДекадыВмесяце*МесяцДаты;
   КонецЕсли;    
   
КонецФункции    

вот эта заветная функция))))))))))))
3 Один С
 
16.02.12
15:41
3-е апреля - это не 12 декада в году есличо..
4 Один С
 
16.02.12
15:48
>> номер месяца * на номер декады в месяце

2 февраля -
номер месяца - 2
номер декады - 1
2х1=2

чото не работает твоя формула..
5 jump if zero
 
16.02.12
15:55
ВЫБРАТЬ

Месяц(ДатаЧ )*
Выбор
КОГДА День(ДатаЧ) > 0 И День(ДатаЧ)  <=10 ТОГДА
 1
КОГДА День(ДатаЧ) > 10 И День(ДатаЧ)  <=20 ТОГДА
  2
ИНАЧЕ
3
КОНЕЦ КАК  Декада
 
ИЗ
 (
 ВЫБРАТЬ ДатаВремя(2012,12,11)  КАК ДатаЧ
) КАК Таблица
6 Reset
 
16.02.12
15:57
(0)
Что ты покурил, решив, что номер декады в году - это ее порядковый номер в месяце, умноженный на номер месяца?
1 декабря - 12 декада?

В школу, в первый класс, учиться умножению!
7 Один С
 
16.02.12
16:06
(6) зато 31 декабря - 36 декада. автор начитался занимательной арифметики..
8 Один С
 
16.02.12
16:10
функция кстате вполне себе рабочая, если учесть что автор выпилил "Возврат Декада"..
непонятно что его так развеселило..
9 НЕА123
 
16.02.12
16:12
(Месяц(ДД)-1)*4 + Мин(цел(День/10),3)
10 НЕА123
 
16.02.12
16:12
(Месяц(ДД)-1)*4 + Мин(цел(День(ДД)/10),3)
11 Reset
 
16.02.12
16:13
(8) функцию тоже дошкольник писал. Куча проверок вместо одной строки
12 НЕА123
 
16.02.12
16:13
неа, так
(Месяц(ДД)-1)*4 + Мин(цел(День/10)+1,3)
13 Один С
 
16.02.12
16:20
(12) 31 декабря - (12-1)*4+мин(цел(365/10)+1,3)=47  как-то так..
14 FarFar
 
16.02.12
16:20
ВЫБРАТЬ
   влож2.ДеньГода,
   влож2.ЦелаяЧасть,
   ВЫБОР
       КОГДА влож2.ДеньГода <= влож2.ЦелаяЧасть * 10
           ТОГДА влож2.ЦелаяЧасть
       ИНАЧЕ влож2.ЦелаяЧасть + 1
   КОНЕЦ КАК НомерДекады
ИЗ
   (ВЫБРАТЬ
       влож.ДеньГода КАК ДеньГода,
       ВЫРАЗИТЬ(влож.ДеньГода / 10 - 0.5 КАК ЧИСЛО(2, 0)) КАК ЦелаяЧасть
   ИЗ
       (ВЫБРАТЬ
           ДЕНЬГОДА(&ТекущаяДата) КАК ДеньГода) КАК влож) КАК влож2


вложенными запрос сделал для простоты понимания.
15 Asmody
 
16.02.12
16:20
Цел(ДеньГода(Дата)-ДеньГода(НачалоМесяца(Дата)))+1 — пойдёт?
16 Asmody
 
16.02.12
16:21
(15)+ тьфу, не то
17 НЕА123
 
16.02.12
16:22
(13) неа. не 365, а 31.
31 декабря - (12-1)*4+мин(цел(31/10)+1,3)=47  как-то так..
18 НЕА123
 
16.02.12
16:22
(17)
вроде правильно.
19 Asmody
 
16.02.12
16:22
а тупо Цел(ДеньГода(Дата)/10)+1
20 FarFar
 
16.02.12
16:24
(19) Что за Цел ?
21 FarFar
 
16.02.12
16:24
смотри (14) - работает точно.
Если день 49 в году, возвратит 5. Если 50 - тоже 5. Если 51 - 6.
22 Asmody
 
16.02.12
16:27
(19)+ точнее Цел((ДеньГода(Дата)+1)/10)+1
23 FarFar
 
16.02.12
16:29
(22) Да что за Цел такой в запросе?

(14) можно упростить:

ВЫБРАТЬ
   ВЫБОР
       КОГДА ДЕНЬГОДА(&ТекущаяДата) <= ВЫРАЗИТЬ(ДЕНЬГОДА(&ТекущаяДата) / 10 - 0.5 КАК ЧИСЛО(2, 0)) * 10
           ТОГДА ВЫРАЗИТЬ(ДЕНЬГОДА(&ТекущаяДата) / 10 - 0.5 КАК ЧИСЛО(2, 0))
       ИНАЧЕ ВЫРАЗИТЬ(ДЕНЬГОДА(&ТекущаяДата) / 10 - 0.5 КАК ЧИСЛО(2, 0)) + 1
   КОНЕЦ КАК НомерДекады
24 Asmody
 
16.02.12
16:33
(23) а где в (0) про запросы? в запросе цел() прекрасно заменяется конструкцией ВЫРАЗИТЬ
25 FarFar
 
16.02.12
16:36
(24) в ВЫРАЗИТЬ округление работает. 4.4 тебе округлит до 4, а 4.6 до 5. Верный пример использования "Выразить" для получения целого числа - в (14) и (23)
26 Asmody
 
16.02.12
16:38
(25) ты математику учил? как выразить Цел() через Окр() знаешь?
27 FarFar
 
16.02.12
16:40
(26) Учил в физмат лицее
28 FarFar
 
16.02.12
16:41
(24) Действительно, в (0) не сказано, что нужно делать запросом. Тогда в чемвообще  проблема у ТС, непонятно.
29 zak555
 
16.02.12
16:51
> Как получить порядковый номер декады в году?


в году ?
легко :


ДеньГода = ДеньГода(ИсхДата)
Десяток = Цел(ДеньГода / 10);
ПорядковыйНомерДекадыВГоду = Десяток + ?( ДеньГода % 10 = 0, 0, 1);
30 Asmody
 
16.02.12
16:53
(29) т.е. по твоему 1 января — это 0-я декада?
31 zak555
 
16.02.12
16:54
(30) а что будет 0 ? о_О
32 Asmody
 
16.02.12
16:56
(31) ах, нет, простите. но всё равно, (22) проще
33 zak555
 
16.02.12
17:02
(32) да
но как быть с 31.12 ??? =)
34 zak555
 
16.02.12
17:03
кстати, в (22) 10 января покажет 2ую декаду, а это ещё первая
35 hhhh
 
16.02.12
17:06
вообще-то в месяце четко 3 декады, поэтому (29) не сработает.
36 Asmody
 
16.02.12
17:17
(35) да ну?! а 31.01 — это какая декада?
37 Asmody
 
16.02.12
17:17
(34) там + на - надо поменять
38 zak555
 
16.02.12
17:19
39 zak555
 
16.02.12
17:19
(37) ты конечное напиши =)
40 Asmody
 
16.02.12
17:20
(39) Цел((ДеньГода(Дата)-1)/10)+1
41 zak555
 
16.02.12
17:22
осталось написать функцию по вычислению декад/дюжин и т.д. в месяцах/годах и т.д. =)
42 hhhh
 
16.02.12
17:24
(40)31-е января - это четко 3-я декада. Вы что на заводе не работали или там на фабрике? Госплан вам задачи не ставил?
43 FarFar
 
16.02.12
17:27
Альтернативный (39)-му незапросный вариант:

ОКР(ДеньГода(ТекДата)-6,-1)/10+1
44 FarFar
 
16.02.12
17:29
(43) Ах, только он для 01.01 не работает ((
45 Kashemir
 
16.02.12
17:29
ВЫБРАТЬ
   РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(НАЧАЛОПЕРИОДА(ВЫРАЗИТЬ(&Дата КАК ДАТА), ГОД), ДЕКАДА), НАЧАЛОПЕРИОДА(ВЫРАЗИТЬ(&Дата КАК ДАТА), ДЕКАДА), ДЕНЬ)/10+1  КАК НомерДекады
46 vmv
 
16.02.12
17:30
фигня какая-то в запросе

можно использовать НАЧАЛОПЕРИОДА, ДЕКАДА и РАЗНОСТЬДАТ

этих литералов достаточно для решения задачи в 0, че вы бред пишите с вложениеми какими-то
47 vmv
 
16.02.12
17:30
(45) телепатировал)
48 FarFar
 
16.02.12
17:35
(40) Я укоротил функцию на 2 символа! Кто лучше? :-)

Цел((ДеньГода(ТекДата)+9)/10)
49 Kashemir
 
16.02.12
17:36
(48) -6 символов ;-)
Цел((ДеньГода(Т)+9)/10)
50 FarFar
 
16.02.12
17:36
(49) Хитрый, да? Не канает!
51 Kashemir
 
16.02.12
17:38
(50) Ставь ТЗ корректно :)
52 hhhh
 
16.02.12
17:41
(42)+ из типовой БП ОСВ (разворачивать по дакадам)

Обороты за 01.01.12 - 10.01.12
Обороты за 11.01.12 - 20.01.12
Обороты за 21.01.12 - 31.01.12
Обороты за 01.02.12 - 10.02.12
Обороты за 11.02.12 - 20.02.12
53 FarFar
 
16.02.12
17:42
ТС уже уволился, осознав неразрешимость задачи. А холивар в ветке продолжается...
54 Asmody
 
16.02.12
18:03
(52) и правда. это сурово меняет дело...
55 Asmody
 
16.02.12
18:09
тогда так:
ВЫБРАТЬ (МЕСЯЦ(&Дата)-1)*3+ВЫРАЗИТЬ(ДЕНЬ(НАЧАЛОПЕРИОДА(&Дата,ДЕКАДА))/10 КАК ЧИСЛО(1))+1
56 Один С
 
16.02.12
18:10
в общем, приз за самый правильный ответ, получает автор за вариант из (2)..
57 Kashemir
 
16.02.12
18:10
(52) "Незамысловатый запрос" для всех декад года выбранной даты


ВЫБРАТЬ
   1 КАК Ц
ПОМЕСТИТЬ Цифры

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   0

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   3

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   4

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   5

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   6

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   7

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   8

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   9

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   0
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&Дата, ГОД), ДЕНЬ, Цифры.Ц + 10 * Цифры1.Ц + 100 * Цифры2.Ц), ДЕКАДА) КАК НачалоДекады
ПОМЕСТИТЬ ВсеДекадыГоды
ИЗ
   Цифры КАК Цифры,
   Цифры КАК Цифры1,
   Цифры КАК Цифры2
ГДЕ
   Цифры.Ц + 10 * Цифры1.Ц + 100 * Цифры2.Ц < ДЕНЬГОДА(КОНЕЦПЕРИОДА(&Дата, ГОД))

СГРУППИРОВАТЬ ПО
   НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&Дата, ГОД), ДЕНЬ, Цифры.Ц + 10 * Цифры1.Ц + 100 * Цифры2.Ц), ДЕКАДА)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ВсеДекадыГоды.НачалоДекады КАК НачалоДекады,
   КОЛИЧЕСТВО(ВсеДекадыГоды1.НачалоДекады) КАК НомерДекадыГода
ИЗ
   ВсеДекадыГоды КАК ВсеДекадыГоды
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВсеДекадыГоды КАК ВсеДекадыГоды1
       ПО ВсеДекадыГоды.НачалоДекады >= ВсеДекадыГоды1.НачалоДекады

СГРУППИРОВАТЬ ПО
   ВсеДекадыГоды.НачалоДекады

УПОРЯДОЧИТЬ ПО
   НачалоДекады
58 Reset
 
16.02.12
18:11
;)
По мотивам (12) и по указанным в (35) и (52) требованиям

(Месяц(Дата)-1)*3+Мин(Цел(День(Дата)-1)/10)+1,3)
59 aptomilov
 
17.02.12
05:50
то есть господа хотите сказать что моя функция не работает? я канечно не проверял по но поему она очень даже верно считает, (3)- читай внимательней формула работает только для 3 ей декады
60 aptomilov
 
17.02.12
05:55
(4) - вы чо все читай внимательно! формула работет только для третьей декады
61 aptomilov
 
17.02.12
06:14
(6) читай внимательнее!! (0), работает только для третьей декады
62 НЕА123
 
17.02.12
08:07
(Месяц(Дата)-1)*3+ //в каждом месяце 3 декады
Мин(Цел(День(Дата)/10)-?(Дата%10=0, 1, 0)+1, 3)  //-?(Дата%10=0,1,0) т.к. 10 это все-таки 1-я декада, 20 - вторая. Для 30,31 сработает МИН().
63 НЕА123
 
17.02.12
08:10
(62)+
пардон. это дописано с (58). единственная разница вместо 1 ставим ?(Дата%10=0,1,0)
ЗЫ.
что-то сложновато...
64 Asmody
 
17.02.12
08:20
(59) мы хотим сказать,  что это все пишется в одну строку без кучи если.
65 Песец
 
17.02.12
08:25
(0) Пятничная тема! Присоединяюсь:

Функция НомерДекады(Дата)
   Возврат  (Месяц(Дата)-1)*3  + Мин(Число(Лев(Формат(День(Дата),"ЧЦ=2; ЧВН="),1)),2) +1;    
КонецФункции
66 Ненавижу 1С
 
гуру
17.02.12
08:48
ДеньМесяца = День(Дата);
ДекадаМесяца = ?(ДеньМесяца>=30,3,(ДеньМесяца-ДеньМесяца%10)/10+1);
ДекадаГода = (Месяц(Дата)-1)*3+ДекадаМесяца;
67 НЕА123
 
17.02.12
09:07
(66)
10 число - это вторая декада?
68 Ненавижу 1С
 
гуру
17.02.12
09:11
(67)

ДеньМесяцаМинус1 = День(Дата)-1;
ДекадаМесяца = ?(ДеньМесяцаМинус1=30,3,(ДеньМесяцаМинус1-ДеньМесяцаМинус1%10)/10+1);
ДекадаГода = (Месяц(Дата)-1)*3+ДекадаМесяца;
69 НЕА123
 
17.02.12
09:19
(68)
О! оно.
но неужели нельзя проще?
70 zak555
 
17.02.12
10:02
(68) 01 января не подходит =)
71 НЕА123
 
17.02.12
10:23
(70)
почему? единицу даст.
72 zak555
 
17.02.12
10:25
(71) ДеньМесяцаМинус1 будет 0 => ДекадаГода = 0 + 0
73 Reset
 
17.02.12
11:24
(62) В (58) одна скобка пропущена после Цел
т.е. правильно

(Месяц(Дата)-1)*3+Мин(Цел((День(Дата)-1)/10)+1,3)

Даже проверил) все отрабатывает согласно (52). Усложнение с "?(Дата%10=0,1,0)" не нужно
74 Reset
 
17.02.12
11:27
(59) Функция работатет, но раздражает Это

   Если НомерДекадыВмесяце=1 Тогда
       Декада=(НомерДекадыВмесяце+2)*МесяцДаты-2;
   ИначеЕсли НомерДекадыВмесяце=2 Тогда
       Декада=(НомерДекадыВмесяце+1)*МесяцДаты-1;
   Иначе    
        Декада=НомерДекадыВмесяце*МесяцДаты;
   КонецЕсли;  

Почему нельзя было написать

Декада=НомерДекадыВмесяце+(МесяцДаты-1)*3;
75 vmv
 
17.02.12
11:32
это задача решается запросом без всяких извращений мозга, выше уже показали как.

без аппеляций, как дети прям шота складывают, сворачивают и прочий бред)
76 Reset
 
17.02.12
11:34
(75) Для сложения/умножения двух чисел выполнять запрос?
77 Песец
 
17.02.12
11:36
(75) Можно продолжить конкурс на самый быстрый способ :)
78 Баклажанов
 
17.02.12
11:37
порядок http://goo.gl/GiLcc
79 НЕА123
 
17.02.12
12:01
(72)
(ДеньМесяцаМинус1-ДеньМесяцаМинус1%10)/10+1 = (0 - 0%10)/10+1 = 1
не?

(73)
согласен. что-то я туплю... со вчера... сегодня полечусь - благо пятница.
80 vmv
 
17.02.12
12:02
(76) да - он очевиднее и без косяков, да и быстрее
81 zak555
 
17.02.12
12:04
(79) +1 не заметил =)
82 vmv
 
17.02.12
12:05
+(80) и не надо лукавить - это не сложение двух чисел, а задача вычисления периодического пераметра с нестандартным периодом, ога. использовать для этой задачи запрос вполне логично, все ваши остатки от делния, сложения и прочия - ересь пятиклассников)
83 zak555
 
17.02.12
12:05
(82) может ты просто не умеешь использовать остатки от деления ?
84 Ненавижу 1С
 
гуру
17.02.12
12:06
(82) арифметику поучи
85 vmv
 
17.02.12
12:09
(83) вам бы счеты и считали бы себе арифметоры - задачу вычисления периодических значений должен решать запрос, а не костящки.

все можете дальще искать блох в своих поделках с арифметикой)
86 Reset
 
17.02.12
12:09
(82) Да, да ) Сложения, вычитания, остатки - все ересь :)
87 Ненавижу 1С
 
гуру
17.02.12
12:10
(85) да ты чего такой буйный?
88 Kashemir
 
17.02.12
12:13
(85) на самом деле запрос из (45) некорректен, ибо основан на предпосылке что декада считается от начала года по 10 дней. Оказалось что считается от начала месяца + по 3 декады на каждый прошедший месяц, потому без арифметики даже в запросе не обойтись - либо решение получить на базе громоздкого запроса (57) без оной.
89 Kashemir
 
17.02.12
12:16
(88) То бишь хоть в запросе хоть без общая логика КоличествоПрошедшихПолнымМесяцев*3 + Декада от начала текущего