Имя: Пароль:
1C
 
Расчет количества календарных дней, между двух дат
,
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 неважно какого года? Спасибо, такой калькулятор даже даром не нужен.