Алгоритмы расчёта сроков¶
Алгоритм расчета Срока — даты, отстоящей на расчетное время от точки отсчета¶
При расчете срока выполнения задач, срока обработки подписи и других аналогичных задач используются функции добавления рабочих дней/часов/минут. Такие функции доступны при редактировании смарт-выражений (ДобавитьРабочихДней, ДобавитьРабочихЧасов, ДобавитьРабочихМинут) и при разработке хранимых процедур (tc_AddWorkingDays, tc_AddWorkingHours, tc_AddWorkingMinutes).
При расчете сроков используются точка отсчета (например, момент запроса подписи) и интервал времени (например, время, выделенное на обработку подписи), а также учитываются системные параметры из Общих настроек приложения: Рабочее время (с... по...) и Рабочих минут в дне, и системный Производственный календарь (для определения рабочих и выходных/праздничных дней).
Алгоритм расчета срока основан на следующих правилах:
№
Правило
Пример
Пояснения
1
Если точка отсчета приходится на нерабочее время (до начала рабочего дня, после окончания рабочего дня или на выходной день), то она сдвигается на начало ближайшего рабочего дня. Подпись запрошена в 08:00,\ точка отсчета переносится на 10:00.
Подпись запрошена в 20:00,\ точка отсчета переносится на 10:00 следующего рабочего дня.
Подпись запрошена в 15:00 в субботу,\ точка отсчета переносится на 10:00 понедельника.
2
Обычно время от начала до конца рабочего дня больше чем продолжительность рабочего дня, т.е. в середине дня предусмотрен перерыв (например, рабочий день с 10:00 до 19:00, а продолжительность рабочего дня 8 часов -- в середине дня есть 1 час перерыва). Но поскольку конкретные часы перерыва неизвестны, считается, что сотрудник может взять перерыв в любое время, даже в самом начале дня. Поэтому если срок переходит на другой рабочий день, время начала рабочего дня сдвигается на время перерыва (например, вместо 10:00 отсчитывается от 11:00).
2.1
Если точка отсчета и срок приходятся на один и тот же день и интервал времени меньше продолжительности рабочего дня, время на перерыв не учитывается. Точка отсчета -- 12:00,\ интервал времени -- 4 часа,\ расчетный срок -- 16:00.
2.2
Если точка отсчета и срок приходятся на разные дни, то при переходе на следующий день к началу рабочего дня прибавляется время перерыва. Точка отсчета -- 16:00,\ интервал времени -- 4 часа,\ расчетный срок -- 12:00 следующего рабочего дня.
С 16:00 до 19:00 -- 3 часа,\ затем к началу следующего рабочего дня прибавляется 1 час перерыва -- 11:00,\ с 11:00 до 12:00 — оставшийся 1 час
3
Если интервал времени больше продолжительности рабочего дня, то есть содержит один или несколько рабочих дней, то вместо продолжительности каждого рабочего дня при расчете откладываются сутки.
3.1
Интервал времени равен продолжительности рабочего дня. Точка отсчета -- 14:00 1 октября 2018,\ интервал времени -- 8 часов,\ расчетный срок -- 14:00 2 октября 2018.
3.2
Интервал времени больше одного рабочего дня, но остаток не переходит на следующий рабочий день. Точка отсчета -- 14:00 1 октября 2018,\ интервал времени -- 12 часов,\ расчетный срок -- 18:00 2 октября 2018.
12 часов = 8 часов (продолжительность рабочего дня) + 4 часа.
К 14:00 прибавляются сутки -- 14:00 следующего рабочего дня,\ затем к этому времени прибавляются оставшиеся 4 часа -- 18:00.
3.3
Интервал времени больше нескольких рабочих дней, но остаток не переходит на следующий рабочий день. Точка отсчета -- 14:00 1 октября 2018,\ интервал времени -- 18 часов,\ расчетный срок -- 16:00 3 октября 2018.
18 часов = 16 часов (продолжительность двух рабочих дней) + 2 часа.
К 14:00 1 октября прибавляются двое суток -- 14:00 3 октября,\ затем к этому времени прибавляются оставшиеся 2 часа -- 16:00.
3.4
Интервал времени больше рабочего дня, и остаток переходит на следующий день. Точка отсчета -- 18:00 1 октября 2018,\ интервал времени -- 12 часов,\ расчетный срок -- 14:00 3 октября 2018.
12 часов = 8 часов (продолжительность рабочего дня) + 4 часа.
К 18:00 1 октября прибавляются сутки -- 18:00 2 октября,\ затем к этому времени прибавляется 1 час, оставшийся до конца данного рабочего дня -- 19:00 2 октября,\ при переходе на следующий день к началу рабочего дня прибавляется 1 час перерыва -- 11:00 3 октября,\ затем прибавляются оставшиеся 3 часа -- с 11:00 до 14:00.
Алгоритм расчета рабочего времени между датами¶
Расчет рабочего времени ведется между двумя датами -- Точкой Отсчета и Сроком.
ℹ️ Изображения блок-схем временно недоступны. Алгоритм описан в таблице ниже.
Алгоритм в виде блок-схемы:
Подготовительные расчеты¶
1. Если время какой-либо из дат раньше, чем начало рабочего дня, то сдвинем эту дату вперед, на начало рабочего дня.
2. Если время какой-либо из дат позже, чем окончание рабочего дня, то сдвинем эту дату назад, на конец рабочего дня.
3. Если какая-то из дат попадает на выходной день, то перенесем ее на первый следующий рабочий день, на то же время.
4. Если Точка Отсчета и Срок попадают на один и тот же рабочий день, то вычислим разницу времени между двумя этими датами. Если получившаяся разница больше длины рабочего дня, то примем ее равной длине рабочего дня. На этом завершим расчет.
Пример:
Начало рабочего дня: 9:00
Конец рабочего дня: 21:00
Длина рабочего дня: 8 часов
Точка Отсчета: 10 августа 2015 10:00
Срок: 10 августа 2015 16:00
Оставшееся время = 6 часов
5. Время, оставшееся в день начала расчета между Точкой Отсчета и концом рабочего дня, назовем Остаток дня отсчета.
6. Время, оставшееся в день срока между началом рабочего дня и Сроком, назовем Остаток дня срока.
7. Вычислим количество полных рабочих дней, расположенных между Точкой Отсчета и Сроком (то есть количество полных суток, за исключением выходных и праздничных дней).
Пример:
8. Если между Точкой Отсчета и Сроком нет полных рабочих дней
8.1. Если между Точкой Отсчета и Сроком больше суток.
В этом случае в расчете заменяем промежуток времени в 24 часа (сутки) на длину рабочего дня и прибавляем к нему остаток.
Пример:
Начало рабочего дня: 9:00
Конец рабочего дня: 21:00
Длина рабочего дня: 8 часов
Точка Отсчета: 10 августа 2015 10:00
Срок: 11 августа 2015 16:00
Оставшееся время = 8 часов длина рабочего дня + 6 часов остаток = 14 часов
8.2. Если между Точкой Отсчета и Сроком меньше суток, а сумма остатков дней отсчета и срока больше длины рабочего дня.
В этом случае время, оставшееся между Точкой Отсчета и Сроком, принимаем равным длине рабочего дня.
Пример:
Начало рабочего дня: 9:00
Конец рабочего дня: 21:00
Длина рабочего дня: 8 часов
Точка Отсчета: 10 августа 2015 12:00
Срок: 11 августа 2015 11:00
Остаток дня отсчета = 9 часов
Остаток дня срока = 2 часа
(9 часов + 2 часа) > 8 часов
Оставшееся время = 8 часов длина рабочего дня
8.3. Если между Точкой Отсчета и Сроком меньше суток, а сумма остатков дней отсчета и срока меньше длины рабочего дня.
В этом случае время, оставшееся между Точкой Отсчета и Сроком, принимаем равным сумме двух остатков.
Пример:
Начало рабочего дня: 9:00
Конец рабочего дня: 21:00
Длина рабочего дня: 8 часов
Точка Отсчета: 10 августа 2015 17:00
Срок: 11 августа 2015 11:00
Остаток дня отсчета = 4 часа
Остаток дня срока = 2 часа
(4 часа + 2 часа) \< 8 часов
Оставшееся время = (4 часа + 2 часа) = 6 часов
9. Если между Точкой Отсчета и Сроком есть один или несколько полных рабочих дней
9.1. Если сумма остатков дней отсчета и срока больше суток.
В этом случае расчет выполняется как в пункте 8.1, но к этому времени прибавляется количество полных рабочих дней между Точкой Отсчета и Сроком (подсчитанное в пункте 7), умноженное на длину рабочего дня.
Пример:
Начало рабочего дня: 9:00
Конец рабочего дня: 21:00
Длина рабочего дня: 8 часов
Точка Отсчета: 12 августа 2015 11:00
Срок: 18 августа 2015 17:00
Количество полных рабочих дней: 3
Оставшееся время = 8 часов длина рабочего дня + 6 часов остаток + (3 * 8 часов длина рабочего дня) = 38 часов
9.2. Если сумма остатков дней отсчета и срока меньше суток, но больше длины рабочего дня.
В этом случае расчет выполняется как в пункте 8.2, но к этому времени прибавляется количество полных рабочих дней между Точкой Отсчета и Сроком (подсчитанное в пункте 7), умноженное на длину рабочего дня.
Пример:
Начало рабочего дня: 9:00
Конец рабочего дня: 21:00
Длина рабочего дня: 8 часов
Точка Отсчета: 12 августа 2015 13:00
Срок: 19 августа 2015 12:00
Количество полных рабочих дней: 4
Остаток дня отсчета = 8 часов
Остаток дня срока = 3 часа
(8 часов + 3 часа) > 8 часов
Оставшееся время = 8 часов длина рабочего дня + (4 * 8 часов длина рабочего дня) = 40 часов
9.3. Если сумма остатков дней отсчета и срока меньше длины рабочего дня.
В этом случае расчет выполняется как в пункте 8.3, но к этому времени прибавляется количество полных рабочих дней между Точкой Отсчета и Сроком (подсчитанное в пункте 7), умноженное на длину рабочего дня.
Пример:
Начало рабочего дня: 9:00
Конец рабочего дня: 21:00
Длина рабочего дня: 8 часов
Точка Отсчета: 13 августа 2015 17:00
Срок: 17 августа 2015 11:00
Количество полных рабочих дней: 1
Остаток дня отсчета = 4 часа
Остаток дня срока = 2 часа
(4 часов + 2 часа) \< 8 часов
Оставшееся время = (4 часа + 2 часа) + (1 * 8 часов длина рабочего дня) = 6 часов + 8 часов = 14 часов
Алгоритм расчёта фактических трудозатрат по календарным событиям¶
1. Если для события включён признак "Целый день", то объём фактических трудозатрат каждого участника считается равным количеству рабочих минут в дне (задается в Общих настройках приложения, обычно это 8 часов).
2. Если для события признак "Целый день" НЕ включён, то считается разница между концом и началом встречи, при этом учитывается только рабочее время. Дополнительно учитываются следующие условия:
Если начало календарного события раньше начала или позже окончания рабочего дня, то к полученному количеству прибавляется 1 час;
Если прибавления часов не было, но конец календарного события раньше начала или позже окончания рабочего дня, то к полученному количеству прибавляется 1 час.
3. Если итог получился более 8 часов часов в день, то объем фактических трудозатрат за день считается равным количеству рабочих часов в дне, остальное отбрасывается.
Пример¶
Встреча началась в 6 часов утра и закончилась на следующий день в 23 часа.
1. По алгоритму расчета получается 16 часов.
2. Т.к. встреча в первый и во второй день начинается раньше начала рабочего дня, к полученному количеству дважды добавляется по 1 часу. Итого 18 часов.
3. Т.к. встреча занимает 2 календарных дня, то результат считается равным 16 часам (2*8 часов), остальное отбрасывается.