|
Расчет количества календарных дней, между двух дат | ☑ | ||
---|---|---|---|---|
0
NIGHTHUNTER
23.08.22
✎
12:39
|
Есть две даты, дата начала, дата окончания. И поле, календарных дней. Как его рассчитать, подскажите пожалуйста?
|
|||
1
Волшебник
23.08.22
✎
12:41
|
(Д2-Д1)/86400
|
|||
2
Krendel
23.08.22
✎
12:44
|
а если високосный?
|
|||
3
Kassern
23.08.22
✎
12:44
|
(0) Выбрать РазностьДат(&ДатаНб,&ДатаК,День) КАК РазностьДат
|
|||
4
NIGHTHUNTER
23.08.22
✎
12:45
|
(3) Запрос что ли?
|
|||
5
NIGHTHUNTER
23.08.22
✎
12:46
|
(3) и (2) учитывает?
|
|||
6
PR
23.08.22
✎
12:58
|
(2) И что?
|
|||
7
6awkup_true
23.08.22
✎
13:00
|
(1) Окр((Д2-Д1)/86400,0,РежимОкругления.Окр15как20)
|
|||
8
NIGHTHUNTER
23.08.22
✎
13:05
|
(3) Так, то есть нужно делать? какие недостатки?
// 8. Если ЗначениеЗаполнено(ОбъектПечати.ДатаНачала) и ЗначениеЗаполнено(ОбъектПечати.ДатаОкончания) Тогда КоличествоДней = 0; Запрос = Новый Запрос; Запрос.Текст = " |ВЫБРАТЬ | РАЗНОСТЬДАТ(&ДатаН, &ДатаК, ДЕНЬ) КАК РазностьДат"; Запрос.УстановитьПараметр("ДатаН", НачалоДня(ОбъектПечати.ДатаНачала)); Запрос.УстановитьПараметр("ДатаК", КонецДня(ОбъектПечати.ДатаОкончания)); Рез = Запрос.Выполнить(); Если Не Рез.Пустой() Тогда Выборка = Рез.Выбрать(); Выборка.Следующий(); КоличествоДней = Выборка.РазностьДат; КонецЕсли; КонецЕсли; // |
|||
9
Kassern
23.08.22
✎
13:07
|
(8) "какие недостатки" - нет Иначе, либо определение переменной КоличествоДней.
|
|||
10
NIGHTHUNTER
23.08.22
✎
13:08
|
(9) как определение?
|
|||
11
6awkup_true
23.08.22
✎
13:09
|
(8) в запросе режим округления всегда в меньшую сторону. может быть нужно получить с округлением в большую и тогда нужно в запросе вторую дату преобразовывать
|
|||
12
Kassern
23.08.22
✎
13:09
|
(10) например КоличествоДней=0. Тем самым вы объявили переменную и задали ей значение. В противном случае, если дальше будете в коде использовать КоличествоДней, а условие будет ложным (не выполнится запрос), то словите ошибку, мол переменная не определена
|
|||
13
Kassern
23.08.22
✎
13:11
|
(8) Скажите мне, зачем эта строчка?
Если Не Рез.Пустой() Тогда ? Хоть 1 пример назовите, когда данный запрос будет пустым?) |
|||
14
6awkup_true
23.08.22
✎
13:12
|
(13) когда ДатаН - ссылка, а ДатаК - неопределено. запрос просто не выполнится)
|
|||
15
6awkup_true
23.08.22
✎
13:16
|
(8) если расчет количества дней ведется на клиенте, то недостаток в использовании запроса. сервер же целый день воздух гоняет. если уж через запрос, то выполнять нужно функцию расчета с директивой &НаСервереБезКонтекста
|
|||
16
Злопчинский
23.08.22
✎
13:34
|
переходи на клюшки.
КолвоДней = ДатаК-ДатаН |
|||
17
Конструктор1С
23.08.22
✎
13:47
|
(8) в коде это ввчимляется простой формулой, и не нужно дёргать БД
|
|||
18
Kassern
23.08.22
✎
13:52
|
(17) Можете эту формулу написать сходу? Еще не понятно в каком контексте это выполняется. В том плане, а не запросят ли завтра разницу рабочих дней)
|
|||
19
pavlika
23.08.22
✎
13:56
|
Я бы еще уточнил - для чего мы считаем разницу. Вопрос с подковыркой - какой стаж будет у сотрудника при приеме 28.02.22 и увольнении 01.03.22?
|
|||
20
6awkup_true
23.08.22
✎
13:58
|
(19) 2
|
|||
21
pavlika
23.08.22
✎
14:00
|
(20) Нет, 4 дня
|
|||
22
6awkup_true
23.08.22
✎
14:01
|
(21) зато страховой будет 0
|
|||
23
1Сергей
23.08.22
✎
14:26
|
(21) чойта 4?
|
|||
24
pavlika
23.08.22
✎
14:38
|
(23) Открываем - "Правила заполнения формы "Сведения о трудовом стаже застрахованного лица за период до регистрации в системе обязательного пенсионного страхования" (СЗВ-К)" (по состоянию на 23.06.2004):
.. Подсчет продолжительности общего трудового стажа осуществляется путем суммирования отдельно дат конца и дат начала указанных периодов. Разница этих сумм составляет продолжительность общего трудового стажа. Поскольку днем увольнения считается последний день работы, необходимо к продолжительности общего трудового стажа по каждому случаю увольнения добавить один день. Один день по случаю увольнения добавляется только к периодам, относящимся к трудовой деятельности застрахованного лица, к иным периодам это правило не применяется. Ниже пример из Консультанта - в (1) даты окончания, в (2) даты начала, всего 4 увольнения: 1) 12.07.1998 + 14.07.1996 + 31.12.1989 + 21.05.1987 + 09.06.1969 + 23.05.1967 = 110.42.11906; 2) 15.07.1996 + 04.09.1991 + 01.01.1989 + 15.09.1970 + 27.05.1967 + 15.03.1966 = 77.34.11879; 3) 110.42.11909 - 77.34.11879 = 27.08.33, или 27 лет 2 месяца 03 дня + 4 дня = 27 лет 2 месяца 07 дней. Окончательный результат 27 лет 2 месяца 7 дней указывается в реквизите "Общий трудовой стаж". Если на моем примере, то: 01.03.22 - 28.02.22 = 31.02.22 - 28.02.22 = 3.0.0 + прибавляем день увольнения, итого = 4 дня. P.S. При расчете всех видов стажа необходимо использовать пункт 33 Правил заполнения формы СЗВ-К и пункт 21 Правил подсчета страхового стажа. Пункт 21 Правил подсчета страхового стажа: Исчисление периодов работы (службы, деятельности) производится в календарном порядке из расчета полных месяцев (30 дней) и полного года (12 месяцев). При этом каждые 30 дней указанных периодов переводятся в полные месяцы, а каждые 12 месяцев этих периодов переводятся в полные годы. Пункт 33 Правил заполнения формы СЗВ-К: Поскольку днем увольнения считается последний день работы, необходимо к продолжительности общего трудового стажа по каждому случаю увольнения добавить один день. Один день по случаю увольнения добавляется только к периодам, относящимся к трудовой деятельности застрахованного лица, к иным периодам это правило не применяется. |
|||
25
6awkup_true
23.08.22
✎
14:46
|
(24) очень интересно получается 31 день в феврале
|
|||
26
Kassern
23.08.22
✎
14:48
|
(24) "31.02.22" - веселая дата)
|
|||
27
pavlika
23.08.22
✎
14:49
|
(25) Дык правила. Один работает с 31 по 09, а другой с 01 по 10. Казалось бы стаж будет одинаковый - 10 дней, но нет. У первого будет 9 дней.
(26) Правила расчета стажа прочитайте |
|||
28
pavlika
23.08.22
✎
14:49
|
Исчисление периодов работы (службы, деятельности) производится в календарном порядке из расчета полных месяцев (30 дней)
|
|||
29
pasha_d
23.08.22
✎
15:25
|
(0) Обратиться к РС "РегламентированныйПроизводственныйКалендарь"
|
|||
30
Конструктор1С
23.08.22
✎
15:30
|
(18) примерно так:
ВремяВСекундах = НачалоДня(ДатаКон) - НачалоДня(ДатаНач); КоличествоДней = ВремяВСекундах / 86400; >>В том плане, а не запросят ли завтра разницу рабочих дней) Когда запросят, тогда и сделает. Пока не запросили: https://ru.wikipedia.org/wiki/YAGNI |
|||
31
Конструктор1С
23.08.22
✎
15:32
|
А вообще, в БСП есть подсистема производственных календарей, там должны быть готовые функции
|
|||
32
Масянька
23.08.22
✎
15:45
|
(24) Меня кадровики в столбик научили :)
|
|||
33
Kassern
23.08.22
✎
15:46
|
(31) Так они это и делают, дергают сервер и запрашивают данные из регистра)
|
|||
34
Kassern
23.08.22
✎
15:48
|
(30) Прежде чем что-то делать, надо провести оценку, если речь идет о расчете дней в разрезе оплаты труда, то задать вопрос про рабочие дни/праздники является имхо обязательным и уже потом прилить разницу дней, а не наоборот.
|
|||
35
Logovazz
23.08.22
✎
15:48
|
(24) писал в свое время на Шарпе калькулятор периодов для кадровиков - выслугу считали по такому же алгоритму. Чудно, конечно, но никуда не денешься. Правила - есть правила)
|
|||
36
Конструктор1С
23.08.22
✎
16:26
|
(33) я в курсе
(34) ложка хороша к обеду. Когда возникнет явная необходимость вычислять количество рабочих дней, тогда и нужно этим заниматься. Иначе можно попасть на мартышкин труд - потратить время и силы на создание функционала, который не потребуется никогда. Так и будет он лежать мусорным комом, только загромождая кодовую базу лишней сложностью |
|||
37
Kassern
23.08.22
✎
16:31
|
(36) вы меня видимо не поняли. Я имею в виду, что прежде чем сесть писать код, нужно провести хотя бы минимальный анализ и задать несколько наводящих вопросов, чтобы потом 10раз не переделывать, потому что клиент имел в виду одно, а вы ему пишите другое. Подход делать все не задавая вопросов, может привести еще к большему мартышкиному труду и выброшенному на помойку коду, еще и негатив будет с клиентом, так как заплатить надо за работу, которая нафиг не нужна.
|
|||
38
Конструктор1С
23.08.22
✎
16:44
|
(37) а что, разве я где-то призывал "делать не задавая вопросов"? Это уже другая сторона крайности
|
|||
39
СеменовСемен
23.08.22
✎
17:04
|
Так ответят же: нет-нет никаких рабочих дат.
А как только запустишь - а вот тут бы рабочих дат |
|||
40
СеменовСемен
23.08.22
✎
17:05
|
Но видеть эти ближайшие пути развития - это целое искусство
|
|||
41
Kassern
23.08.22
✎
17:06
|
(40) это все набивается с опытом)
|
|||
42
Kassern
23.08.22
✎
17:09
|
(39) "Так ответят же: нет-нет никаких рабочих дат" - обычно это не так. Если правильно вопрос задашь и обрисуешь многие подводные камни данного решения, то потом будет к тебе минимум вопросов, либо на берегу будет пересмотрена задача. Проблема в том, что из-за отсутствия опыта в можно не знать о возможных подводных камнях и тогда вопрос не получится грамотно задать, что может привести в будущем к переделке проекта.
|
|||
43
Garykom
гуру
23.08.22
✎
17:21
|
Циклом.
ТекущаяДата = НачальнаяДата Затем в цикле прибавляешь кол-во секунд и условием проверяешь пока ТекущаяДата=КонечнаяДата Счетчик не забыть, в котром и будет кол-во дней... |
|||
44
Garykom
гуру
23.08.22
✎
17:22
|
(43)+ И легко переделывается на "Рабочие дни" еще одним условием ))
|
|||
45
Kassern
23.08.22
✎
17:22
|
(43) вы микросервисы подобным образом пишите на го?
|
|||
46
Garykom
гуру
23.08.22
✎
17:23
|
(45) Если надо то да. Но там обычно уже есть готовые функции для этого.
Внутри которых кстати примерно такое и есть, только оно быстро работает )) |
|||
47
Garykom
гуру
23.08.22
✎
17:24
|
(45) И чем тебе не нравится мой алгоритм?
Он надежный и очень гибкий в плане допилки. Да работает не очень шустро но блин это же 1С! Подождут... |
|||
48
Garykom
гуру
23.08.22
✎
17:24
|
(47) *Он простой, надежный и очень гибкий в плане допилки.
|
|||
49
bolobol
23.08.22
✎
17:55
|
(48) Именно так работает ZX Spectrum... Привет 80-ые))
|
|||
50
Garykom
гуру
24.08.22
✎
13:06
|
(27) Нет ты ошибаешься.
Это если пересчитывать на годы и месяцы используется 12 месяцев в году и 30 дней в месяце В днях же считается по календарным. Т.е. если приняли на работу 28.02 а уволили 1.03 то стаж буде 2 дня |
|||
51
Garykom
гуру
24.08.22
✎
13:06
|
(50) Точнее стад будет "0 лет 0 месяцев 2 дня"
|
|||
52
Garykom
гуру
24.08.22
✎
13:07
|
(51) *стаж
|
|||
53
Garykom
гуру
24.08.22
✎
13:08
|
(50)+ А если приняли на работу 01.01 а уволили 28.02 то стаж будет "0 лет 1 месяц 29 дней"
|
|||
54
Krendel
24.08.22
✎
13:08
|
(6) 86400- это количество секунд в дне, понял
|
|||
55
bolobol
24.08.22
✎
13:10
|
(50) Предложите, тогда, вариант вычитания из 1.03 даты 28.02, если по правилам высчитывать разницу дней нужно отдельно
|
|||
56
Garykom
гуру
24.08.22
✎
13:11
|
(54) Про округление надо не забыть еще
|
|||
57
Garykom
гуру
24.08.22
✎
13:12
|
(55) Вычитанием дат конца и начала получают количество дней
Далее делением на 30 получают количество полных месяцев Делением на месяцев на 12 получают количество полных лет |
|||
58
bolobol
24.08.22
✎
13:19
|
(57) Ок. 1-28 = -27 дней, 03-02 = 01 месяц. Итого: 01 месяц и минус 27 дней = 3 дня, т.к. дней в полном месяце 30. +1 увольнение = 4.
|
|||
59
Garykom
гуру
24.08.22
✎
13:25
|
(58) Какую то хрень пишешь.
Ты понимаешь что секунды, минуты, часы, сутки(дни), недели это связанные напрямую единицы? А месяц и год это условные единицы. Для целей стажа принято что в 1 месяце - 30 дней, в 1 году - 12 месяцев Т.е. можно отработать с первого января по первое января следуюшего года и реальный фактический стаж будет всего 11 месяцев и сколько то дней? |
|||
60
Serg_1960
24.08.22
✎
13:25
|
(0) Классика жанра: РазницаВДнях = (НачалоДня(ДатаОкончания) - НачалоДня(ДатаНачала)) / (60 * 60 * 24);
|
|||
61
bolobol
24.08.22
✎
13:27
|
(59) Поспорьте с правилами расчёта с ПФР, не со мной
|
|||
62
Garykom
гуру
24.08.22
✎
13:34
|
(61) Пенсионный, страховой, трудовой и прочие виды стажа могут считаться по разному и это нормально.
Например можно отработать 365 дней и не получить премию потому что год выпал високосный а по правилам конторы годовая премия начисляется только за календарный год и в этом надо было отработать 366 дней. |
|||
63
Serg_1960
24.08.22
✎
13:39
|
Вам интересно поспорить или может быть калькулятором воспользуетесь? :)
https://normativ.kontur.ru/calculators/stazh |
|||
64
bolobol
24.08.22
✎
14:12
|
(63) Интересно разобраться с формулировкой правил расчёта. По ссылке - нет расшифровки расчёта, просто цифра
|
|||
65
Ryzeman
24.08.22
✎
14:18
|
(64) Выражаясь по-нашенски:
Цел((НачалоДня(ДатаОкончания) - НачалоДня(ДатаНачала)) / (60 * 60 * 24)) + 1 |
|||
66
Ryzeman
24.08.22
✎
14:21
|
(65) по сути спор был о том считать ли случай "с 24.08 по 24.08" - один день или 0 дней. Если бы речь было о ком угодно кроме ТС, то смысла разводить демагогию не было бы, любой и так поймёт что надо добавить как округлить и т.п.
|
|||
67
pavlika
24.08.22
✎
14:24
|
(63) Вот калькулятор, который дает другой результат - https://ppt.ru/calc/experience
|
|||
68
pavlika
24.08.22
✎
14:30
|
(50) Не ошибаюсь, мне с этим вопросом в сове время мозг вынесли. Нормативку я привел.
|
|||
69
Said_We
24.08.22
✎
14:42
|
||||
70
pavlika
24.08.22
✎
14:43
|
Если совсем кому интересно вот еще пример - https://www.kdelo.ru/art/384568-staj-raboty-18-m8
|
|||
71
Гость из Мариуполя
гуру
24.08.22
✎
15:10
|
(19) та какая там подковырка, не сказал, какой именно стаж.
(67) угу. другой. результат. Вот только один калькулятор считает страховой стаж, другой калькулятор - трудовой стаж. |
|||
72
Гость из Мариуполя
гуру
24.08.22
✎
15:22
|
(24) какой нахрен 2004 год? какой пункт 21 и пункт 33?
ткни меня вот сюда носом в пункт 21 и в пункт 33 https://base.garant.ru/70756488/ |
|||
73
Гость из Мариуполя
гуру
24.08.22
✎
15:23
|
пункт 47.
|
|||
74
Гость из Мариуполя
гуру
24.08.22
✎
15:23
|
а то приводит в пример правила для СЗВ-К в редакции 2004 года. хм.. а чЁ не времен царя Гороха?
|
|||
75
Garykom
гуру
24.08.22
✎
15:50
|
(66) >"с 24.08 по 24.08" - один день или 0 дней
разница дат дает 0 дней но +1 "Подсчет продолжительности каждого периода, включаемого (засчитываемого) в страховой стаж, производится путем вычитания из даты окончания соответствующего периода даты начала этого периода с прибавлением одного дня." А теперь посчитайте какой стаж если с 24.08.2021 по 24.08.2022? "47. Исчисление продолжительности периодов работы, в том числе на основании свидетельских показаний, и (или) иной деятельности и иных периодов производится в календарном порядке из расчета полного года (12 месяцев). При этом каждые 30 дней периодов работы и (или) иной деятельности и иных периодов переводятся в месяцы, а каждые 12 месяцев этих периодов переводятся в полные годы. Подсчет продолжительности каждого периода, включаемого (засчитываемого) в страховой стаж, производится путем вычитания из даты окончания соответствующего периода даты начала этого периода с прибавлением одного дня. Периоды работы и (или) иной деятельности и иные периоды включаются (засчитываются) в страховой стаж по день, предшествующий дню обращения за установлением страховой пенсии, а в случаях, предусмотренных частями 5 и 6 статьи 22 Федерального закона "О страховых пенсиях", - по день, предшествующий дню назначения страховой пенсии." |
|||
76
Garykom
гуру
24.08.22
✎
15:53
|
(75)+ И заодно сравните со стажем с 24.08.2019 по 24.08.2020 :)
|
|||
77
Serg_1960
25.08.22
✎
08:57
|
(67) "Вот калькулятор, который..." - у которого 4 дня в периоде с 28.02 по 01.03 неважно какого года? Спасибо, такой калькулятор даже даром не нужен.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |