Вход | Регистрация
    1  2   
1С:Предприятие :: 1С:Предприятие 8 общая

Анализ пересечения периодов

Анализ пересечения периодов
Я
   AceVi
 
14.04.21 - 16:46
Собираюсь решить задачу, но ни разу с таким не сталкивался - может кто имеет опыт и поделиться?
Задача - необходимо проанализировать гарфик работника(по периодам в часах)(это план) и проходы его через электронную проходную(факт)
на основании анализа ввести документы отклонений(типа прогул)

Например
План
8-12
12-12:30 - обед
12:30-17

Факт
7:30-12
12-13
13-15
16-17

Результат :
8-12 и 7:30-12 - факт полностью закрывает план - все ок.
12-12:30 и 12-13 - факт обеда больше на 30 минут - нужно ввести прогул на 30 минут
12:30-17 и 13-15 - факт не закрывает план - но ничего не вводим - нужно посмотреть другие периоды, вдруг он дальше все закрыл
12:30-17 и 16-17 - опять не закрыл план. но нужно определить что 2 периода вместе входят в план и в совокупности теряеться только 1 час.

итого сотрудник отсутствовал всего 1:30 и нужно ввести документ отклонения от графика как прогул на 1:30.



Пересечение 2 конкретных периодов можно отловить и проаналзировать а вот как проанализировать пересечения групп периодов ?


Если кто сталкивался с такой задачей, буду рад любому совету.
   fisher
 
1 - 14.04.21 - 16:51
В чем проблема.
Добавь к периодам плана поле "ЧасовПоПлану" и вычитай из него часы тех периодов факта, которые в них попали.
   ZDenis
 
2 - 14.04.21 - 16:54
(0) А если он не хочет никуда выходить на обед?
Не проще считать время проведенное на территории и если оно меньше того, что он должен отработать, тогда уже прогул
   fisher
 
3 - 14.04.21 - 16:59
(2) Ты еще предложи не считать прогулы, если работник справляется со своими обязанностями. Не для того такие системы внедряются.
   AceVi
 
4 - 14.04.21 - 17:04
(1) Вы сводите все к рабочим часам в день, но это неверно.
т.к. тогде период 7:30-16:30(факт) по часам будет равен периоду 8-17(план), а это некорректно - человек должен четко закрыть план или мы должны определить все отклонения от плана.

(2)
проще - но у кадров свой однозначный запрос - зачем? - не могу знать!
есть трафарет(план) и факт должен с ним совпадать.
Насчет обедов - допускается присутствие сотрудников во время обеда на территории, но это время согласно плану не считается рабочим.
   mistеr
 
5 - 14.04.21 - 17:04
(0) Не понял, почему в обед нужно сразу писать прогул, а после обеда "нужно посмотреть другие периоды"?

Нужно уточнить постановку. Если общее время за день закрывает план, этого достаточно? А за месяц?
   acht
 
6 - 14.04.21 - 17:07
(4) Чем отличается:
> 12-12:30 и 12-13 - факт обеда больше на 30 минут - нужно ввести прогул на 30 минут
от
> 12:30-17 и 13-15 - факт не закрывает план - но ничего не вводим - нужно посмотреть другие периоды, вдруг он дальше все закрыл

Почему там нужно, а тут не нужно?
   AceVi
 
7 - 14.04.21 - 17:07
(5) Недостаточно - рабочим временем в итоге учитывается время которое строго вошло в рамки плана.

Кстати - факт и план я собрал, в том же виде как они приведены в примере(т.е. периодами)
но как их сравнить? не могу понять.
   ZDenis
 
8 - 14.04.21 - 17:10
(7) Суммируешь время проведенное на территории в 2 интервалах (до обеда и после обеда) - это есть факт
Время по плану и так известно и их сравниваешь.
   ZDenis
 
9 - 14.04.21 - 17:11
+8 в интервалах между 8.00 - 12.00  и 12.30 - 17.00
   AceVi
 
10 - 14.04.21 - 17:12
(6) скорректирую пример
Факт
7:30-12
//12-13

13-15
16-17

вот так лучше - 12-13 человек не был на территории.(вышел в 12 и вернулся только в 13) т.к. это время ближе всего к периоду плана "обед" то  и сравниваем с ним.
   mistеr
 
11 - 14.04.21 - 17:12
(7) То есть в зачет идет только время из интервалов в плане? Я правильно понял?
   AceVi
 
12 - 14.04.21 - 17:13
(9) см (4) - нельзя все сводить к часам в день
   ZDenis
 
13 - 14.04.21 - 17:13
И немного не понятно тут "факт не закрывает план - но ничего не вводим - нужно посмотреть другие периоды, вдруг он дальше все закрыл".
Как он в принципе может "закрыть" дальше, если вы не даете ему работать свыше плана
   AceVi
 
14 - 14.04.21 - 17:13
(11) да, кроме времени плана - "обед"
   ZDenis
 
15 - 14.04.21 - 17:14
(12) у меня не сводится к часам в день. У меня сводится к времени в "разрешенных" интервалах
   AceVi
 
16 - 14.04.21 - 17:15
(13) например факт может быть таким
7:30-12
//12-13


13-15
15:10-17

Тогда человек всего 10 минут не был на рабочем месте - предположим что он встречал курьера. в любом случаем до 15 минут отклонений за раз - мы ему простим итого план он выполнил.
   mistеr
 
17 - 14.04.21 - 17:17
(14) Тогда так.
1) Взять пересечения интервалов факта и плана (только рабочее время), Просуммировать.
2) Просуммировать план (только рабочее время).
3) Сравнить, разницу пишем в прогул.
   fisher
 
18 - 14.04.21 - 17:22
(4) Нет. Не свожу. Из остатка часов планового присутствия вычитаются только то количество часов, которое определяется пересечением фактического периода с плановыми. Мне казалось, это очевидно.
   fisher
 
19 - 14.04.21 - 17:42
Удобнее всего, как я и говорил, просто добавить в табличку периодов планового присутствия колонку, где на старте рассчитать количество плановых часов присутствия для каждого периода.
Потом при обходе фактических периодов пробегаешься по табличке плановых периодов и "примеряешь" каждый фактический период к каждому плановому. Если есть пересечение, то вычитаешь количество часов НА ПЕРЕСЕЧЕНИИ из количества часов планового присутствия для периода. Итог по колонке в конце даст общее количество часов прогула.
Можно и без колонки, тупо из общего количества часов планового присутствия вычитать. Но так не останется инфы, в какие конкретно периоды сотр не вписался, а это может быть полезным.
   fisher
 
20 - 14.04.21 - 17:46
Это как раз фигня задача. Я как увидел тему, подумал что речь про более интересную задачу - как получить эти самые периоды фактического присутствия из данных СКУД, где вход и выход отдельными событиями пишется. С учетом всевозможных отклонений. Двойных срабатываний, проходом без отметки и так далее.
   МихаилМ
 
21 - 14.04.21 - 17:47
мыслите множествами. тогда пересечение интервалов не важно. а важно только общая сумма отработанных часов.
   fisher
 
22 - 14.04.21 - 17:49
(21) Перед тем как начинать мыслить, полезно прочитать ТЗ.
   AceVi
 
23 - 15.04.21 - 09:47
(19) Сравнивать каждый с каждым хм... я такое предлагал кадрам но они почему то забраковали. сегодня добьюсь от них письменного ответа. спасибо.
(20) да случаи прохода бывают разные, "волшебные" - 2 входа подряд с разницей в 2 часа. пока принято решение что это был выход по "чужой карте" и наказывается не зачётом того периода где нет выхода.
   fisher
 
24 - 15.04.21 - 10:01
(23) Причем тут вообще "кадры"? Это детали внутренней реализации.
У тебя же небольшое количество периодов планового присутствия. В сабже - два. Дообеденный и послеобеденный. В чем проблема сравнивать их на пересечение с каждым фактическим?
   acht
 
25 - 15.04.21 - 10:12
(23) Вот интересно - а у программистов, разрабатывающих эту чудо-систему, есть план пристуствия на рабочем месте, который надо закрывать? Или это другое?
   AceVi
 
26 - 15.04.21 - 10:18
(24) в чем проблема - если у нас 1 вид документа отклонения(прогул) на любое отклонение от плана и мы можем все отклонения просто просуммировать между собой, если больше одного то получается что на каждое отклонение от плана необходимо вводить свой документ(со своим видом)(например прогул И отпуск без сохранения зп(уж не знаю чем это от прогула отличается, но вот такое бывает))
(25) план есть у любого сотрудника предприятия(даже у директора) - часть программистов не являются сотрудниками текущего предприятия и имеют право свободного входа\выхода. любопытный вы наш.
   AceVi
 
27 - 15.04.21 - 10:23
(19) так стоп
ну и как мы узнаем отклонение в часах при
План
12:30-17

Факт
13-15
16-17

Если последовательно сравнивать периоды - то 12:30-17 и 13-15 даст отклонение в 2,5 часа от плана
и 12:30-17 и 16-17 - 3,5 часа. после того как просуммируем будет отклонение 6 часов. что неверно - ведь реальное отклонение только 1,5 часа с 12:30-13 и с 15-16 - этого мы не сможем узнать просто последовательно сравнивая периоды. так что пока план нерабочий.
   Bigbro
 
28 - 15.04.21 - 10:25
внедряя подобные системы не нужно забывать о том что любое действие порождает противодействие.
чем жестче закручивают гайки контролируя каждый шаг сотрудников и карая за любое отклонение тем меньше сотрудник заинтересован в результатах своего труда, а лишь в соблюдении всего этого бреда за который могут наказать.
через некоторое время адекватные люди задаются вопросом а нахрена я вообще тут нахожусь если вместо работы голова забита только прогулами объяснительными как не опоздать как не выйти позже чем положено и т.д. и уходят туда где нет подобного бреда.
   AceVi
 
29 - 15.04.21 - 10:31
(28) это управленческие вопросы - не вижу смысла поднимать их в данной теме.
   mistеr
 
30 - 15.04.21 - 10:32
(27) Нужно суммировать пересечения. См. (17)
 
 Рекламное место пустует
   Bigbro
 
31 - 15.04.21 - 10:35
(29) а без этого тривиальная задача.
перебираем фактические периоды, вырезаем их из плановых. все что осталось - отсутствия. все что сверху вырезалось - переработки.
дальше поступаем с этими периодами согласно имеющемуся ТЗ. вводим документы например.
   Kassern
 
32 - 15.04.21 - 10:36
(29) Мне чет не совсем понятно, что это за отметки факта, у вас сотрудники по несколько раз на дню через проходную проходят? Если так, то если человек вышел через проходную не в обед, то все, прогул?
   Kassern
 
33 - 15.04.21 - 10:38
(32) у нас на предприятии проще, считаются только крайние отметки, чтобы зафиксировать когда пришел на работу и когда ушел домой. Обед вообще не привязан ко времени, есть час в течении дня, когда захотел, тогда и покушал. И нет никаких проблем
   Classic
 
34 - 15.04.21 - 10:43
ВЫБРАТЬ
   ВЫБОР
       КОГДА Факт.ВремяНачала < План.ВремяНачала
       ТОГДА План.ВремяНачала
       ИНАЧЕ Факт.ВремяНачала
   КОНЕЦ КАК ВремяНачала,
   ВЫБОР
       КОГДА Факт.ВремяОкончания > План.ВремяОкончания
       ТОГДА План.ВремяОкончания
       ИНАЧЕ Факт.ВремяОкончания
   КОНЕЦ КАК ВремяОкончания
ПОМЕСТИТЬ ОтработанныеПериоды
ИЗ План КАК План
   ЛЕВОЕ СОЕДИНЕНИЕ Факт КАК Факт
   ПО Факт.ВремяНачала <= План.ВремяОкончания И Факт.ВремяОкончания >= План.ВремяНачала
;
ВЫБРАТЬ
   ОтработанныеПериоды.ВремяОкончания КАК ВремяНачала,
   МИНИМУМ(ОтработанныеПериоды.ВремяНачала) КАК ВремяОкончания
ПОМЕСТИТЬ НеОтработанныеПериоды
ИЗ Отработанные Периоды КАК ОтработанныеПериоды
      ЛЕВОЕ СОЕДИНЕНИЕ ОтработанныеПериоды КАК ОтработанныеПериоды1
      ПО ОтработанныеПериоды.ВремяОкончания <= ОтработанныеПериоды1.ВремяНачала
СГРУППИРОВАТЬ ПО
      ОтработанныеПериоды.ВремяОкончания

ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
     "00:00:00",
     МИНИМУМ(ОтработанныеПериоды.ВремяНачала)
ИЗ ОтработанныеПериоды КАК ОтработанныеПериоды

ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
    МАКСИМУМ (ОтработанныеПериоды.ВремяОкончания),
    "23:59:59"
ИЗ ОтработанныеПериоды КАК ОтработанныеПериоды    
;
ВЫБРАТЬ
  ВЫБОР
       КОГДА НеотработанныеПериоды.ВремяНачала < План.ВремяНачала
       ТОГДА План.ВремяНачала
       ИНАЧЕ НеотработанныеПериоды.ВремяНачала
   КОНЕЦ КАК ВремяНачала,
   ВЫБОР
       КОГДА НеотработанныеПериоды.ВремяОкончания > План.ВремяОкончания
       ТОГДА План.ВремяОкончания
       ИНАЧЕ НеотработанныеПериоды.ВремяОкончания
   КОНЕЦ КАК ВремяОкончания
ПОМЕСТИТЬ ПериодыПрогулов
ИЗ НеотработанныеПериоды КАК НеотработанныеПериоды
   ВНУТРЕНННЕЕ СОЕДИНЕНИЕ План КАК План
   ПО НеотработанныеПериоды.ВремяНачала <= План.ВремяОкончания
      И НеотработанныеПериоды.ВремяОкончания <= План.ВремяНачала
   Classic
 
35 - 15.04.21 - 10:44
И НеотработанныеПериоды.Времяокончания >= План.ВремяНачала

Последнюю строку зафакапил
   fisher
 
36 - 15.04.21 - 10:49
(27) Не понял, как ты считаешь.
План 12:30 - 17:00 (начало периода включительно, конец - не включительно. Правильно? Т.е. 4.5 плановых часа)
Факт 13:00 - 15.00 (2 часа, они же результат пересечения с планом, вычитаем из плана остается остаток 2.5 плановых часа)
Факт 16:00 - 17:00 (1 час, он же результат пересечения с планом, вычитаем из остатка плановых часов, остается 1.5 плановых часа)
   AceVi
 
37 - 15.04.21 - 10:53
(32) все верно
проход через проходную может быть сколько угодно раз в день. отсутствие на предприятии больше 15 минут в рабочее(плановое) время - сразу прогул.
   fisher
 
38 - 15.04.21 - 10:53
(27) Ты, походу, не пересечение считал, а разность.
   fisher
 
39 - 15.04.21 - 10:55
(37) Т.е. если видишь что опаздываешь, то проще на работу вообще не ехать. Удобно.
   Kassern
 
40 - 15.04.21 - 10:56
(39) пишешь заявление о предоставлении отпуска на период опоздания в счет будущей переработки))
   AceVi
 
41 - 15.04.21 - 10:58
(36) (38) 
Ну смотри сравниваем последовательно периоды
план
12:30-17

1. 12:30-17 и 13-15 даст отклонение в 2,5 часа от плана - 12:30-13 - 30 минут и 15-17 2 часа. итого отклонения по текущему факту 2,5 часа
2. 12:30-17 и 16-17 - 3,5 часа. с 12:30 - 16 - 3,5 часа отклонения.

Итого 6 часов отклонения.
а ты как предлагаешь?
   pavlika
 
42 - 15.04.21 - 10:58
У вас графики работы с началом и окончанием рабочего времени? Время обеда прописано? Внутрисменные неявки с привязкой ко времени?
   fisher
 
43 - 15.04.21 - 11:00
(41) Я тебе уже на пальцах расписал. Не тупи. Пересечение множеств/промежутков - это их общая часть. А ты чего насчитал?
   AceVi
 
44 - 15.04.21 - 11:00
(42) да да и да
   AceVi
 
45 - 15.04.21 - 11:01
(43) можешь показать на пальцах алгоритм? что такое "общая часть", как ее определить?
   fisher
 
46 - 15.04.21 - 11:04
(45) Нарисуй на бумажке два отрезочка. Один под другим. Заштрихуй ту часть, где одновременно две линии придется. Это и будет общая часть. Пересечение.
   AceVi
 
47 - 15.04.21 - 11:07
(46) отлично - а алгоритм как выглядит? не могу сообразить.
   fisher
 
48 - 15.04.21 - 11:17
(47) Писал навскидку, поэтому лучше перепроверить:

Функция ПолучитьОбщиеВремяДвухПериодовСекунды(Нач1, Кон1, Нач2, Кон2)    
    Пересечение = Мин(Кон1, Кон2) - Макс(Нач1, Нач2);
    Возврат ?(Пересечение > 0, Пересечение, 0);    
КонецФункции
   AceVi
 
49 - 15.04.21 - 11:25
(48) Уважаемый у нас же не двух а 3 - как вы утверждаете
мое утверждение у нас 2 сравнения 3 периодов
1. 12:30-17 и 13-15 
2. 12:30-17 и 16-17
твое утверждение: у нас 1 сравнение 3 периодов(2 периода объединяються в "общую часть")
12:30-17 и "13-15 и затем 16-17" - вот она общая часть.

так вот мой вопрос - как т определяешь что эти 2 периода это некая общая часть?
   fisher
 
50 - 15.04.21 - 11:28
(49) Уважаемый писатель. Перечитайте еще раз мои посты. Особенное внимание посту (36) на вашем же примере. Нигде не было речи про ОДНОВРЕМЕННОЕ сравнение трех периодов. Речь о попарном сравнении всех плановых периодов с каждым фактическим.
   fisher
 
51 - 15.04.21 - 11:32
Там где про "общую" часть писалось - это про сравнение ДВУХ периодов. А не трех. Потому что ты не понимал что такое пересечение двух множеств и вместо этого считал их разность.
   AceVi
 
52 - 15.04.21 - 11:34
(50) можно алгоритм этого "попарного сравнения"?
я знаю только алгоритм сравнения 2 периодов между собой (именного его вы и привели).
еще раз в (48) вы указали сравнение 2 периодов между собой. а что за алгоритм "Речь о попарном сравнении всех плановых периодов с каждым фактическим". как вы выразились - можно его увидеть?
   fisher
 
53 - 15.04.21 - 11:36
(52) Про вложенные циклы что-то слышал?
   AceVi
 
54 - 15.04.21 - 11:40
(53) что то слышал.
   fisher
 
55 - 15.04.21 - 11:42
Напоминаю
ПлановыхСекунд = 0;
Для Каждого ПериодПлана Из ТаблицаПлана Цикл
    ПлановыхСекунд = ПлановыхСекунд + (ПериодПлана.Конец - ПериодПлана.Начало);
    Для Каждого ПериодФакта Из ТаблицаФакта Цикл
        ПлановыхСекунд = ПлановыхСекунд - ПолучитьОбщееВремяДвухПериодовСекунды(ПериодПлана.Начало, ПериодПлана.Конец, ПериодФакта.Начало, ПериодФакта.Конец);
    КонецЦикла;
КонецЦикла;
Сообщить(СтрШаблон("Ублюдок прогулял %1 сек!", ПлановыхСекунд));

   AceVi
 
56 - 15.04.21 - 11:54
(55) имея вот такие простые входные данные
План
12:30-17

Факт
13-15
16-17

общая Длина плановых  секунд 16200

пройдя следующие итерации
1. 12:30-17 и 13-15 - сравниваем и получаем 9000 сек отклонения от плана 
2. 12:30-17 и 16-17 - сравниваем и получаем 12600 сек отклонения от плана 

итого 16200-9000 -12600 = -5400 сек. что неверно.
верный ответ 5400 сек отклонения от плана.

Алгоритм неверный.
   AceVi
 
57 - 15.04.21 - 11:57
(55) а если мы возьмем более реальные входные данные
План
8-12
12-12:30 - обед
12:30-17

Факт
7:30-12
13-15
16-17

то ваш алгоритм и того ошибочней посчитает.
   fisher
 
58 - 15.04.21 - 11:58
Ок. Забудь обо всем, что я писал. Я совершил огромную ошибку и уже сделал из нее выводы.
   Bigbro
 
59 - 15.04.21 - 12:09
(37) вообще-то прогул по ТК это совсем другое.
и ваши истории с прогулом за 15 минутное опоздание продолжаются ровно до того момента пока не найдется принципиальный и грамотный сотрудник который натравит на вас трудинспекцию, которая вас там уже всех за такие прогулы поставит в коленно-локтевую позицию.
   AceVi
 
60 - 15.04.21 - 13:06
(59) попрошу не писать не по теме топика.
 
 Рекламное место пустует
   fisher
 
61 - 15.04.21 - 13:22
(60) А по теме до сих пор вопросы остались?

    ТаблицаПлана = Новый ТаблицаЗначений;
    ТаблицаПлана.Колонки.Добавить("Начало");
    ТаблицаПлана.Колонки.Добавить("Конец");
    ТаблицаФакта = ТаблицаПлана.Скопировать();
    
    ПериодПлана = ТаблицаПлана.Добавить();
    ПериодПлана.Начало = НачалоДня(ТекущаяДата()) + 12*60*60 + 30*60;
    ПериодПлана.Конец = НачалоДня(ТекущаяДата()) + 17*60*60;
    
    ПериодФакта = ТаблицаФакта.Добавить();
    ПериодФакта.Начало = НачалоДня(ТекущаяДата()) + 13*60*60;
    ПериодФакта.Конец = НачалоДня(ТекущаяДата()) + 15*60*60;
    ПериодФакта = ТаблицаФакта.Добавить();
    ПериодФакта.Начало = НачалоДня(ТекущаяДата()) + 16*60*60;
    ПериодФакта.Конец = НачалоДня(ТекущаяДата()) + 17*60*60;

Результат 5400. Без минуса.
   AceVi
 
62 - 15.04.21 - 13:29
(61) остались. я  привел пример расчета по вашему циклу в (56) - вы нет.
откуда вы взяли ваш результат мне решительно непонятно. прошу раскрыть вопрос.
   AceVi
 
63 - 15.04.21 - 13:30
(62) я не просто так прошу - я утверждаю - ваш алгоритм выдает совершенно неверный результат.
   fisher
 
64 - 15.04.21 - 13:31
(62) Подставил эти исходные данные в (55)
А вот проверка для (57):

    ПериодПлана = ТаблицаПлана.Добавить();
    ПериодПлана.Начало = НачалоДня(ТекущаяДата()) + 8*60*60;
    ПериодПлана.Конец = НачалоДня(ТекущаяДата()) + 12*60*60;
    ПериодПлана = ТаблицаПлана.Добавить();
    ПериодПлана.Начало = НачалоДня(ТекущаяДата()) + 12*60*60 + 30*60;
    ПериодПлана.Конец = НачалоДня(ТекущаяДата()) + 17*60*60;
    
    ПериодФакта = ТаблицаФакта.Добавить();
    ПериодФакта.Начало = НачалоДня(ТекущаяДата()) + 7*60*60 + 30*60;
    ПериодФакта.Конец = НачалоДня(ТекущаяДата()) + 12*60*60;
    ПериодФакта = ТаблицаФакта.Добавить();
    ПериодФакта.Начало = НачалоДня(ТекущаяДата()) + 13*60*60;
    ПериодФакта.Конец = НачалоДня(ТекущаяДата()) + 15*60*60;
    ПериодФакта = ТаблицаФакта.Добавить();
    ПериодФакта.Начало = НачалоДня(ТекущаяДата()) + 16*60*60;
    ПериодФакта.Конец = НачалоДня(ТекущаяДата()) + 17*60*60;

Тоже 5400 результат.
   fisher
 
65 - 15.04.21 - 13:32
(63) Ну, не знаю. Перезагрузи компьютер, чайку попей.
   AceVi
 
66 - 15.04.21 - 13:54
(65) Приношу свои искренние извинения за свой тупизм.

На тестовом примере алгоритм выдал верный результат.
ухожу в отладку и применение алгоритма к реальным данным.
Ближе к вечеру отпишу все ли нормально.

Спасибо за помощь.
еще раз. прошу меня простить, что я неверно прочитал алгоритм, а он работает так как задумано.
   fisher
 
67 - 15.04.21 - 14:06
(66) Я до последнего не был уверен, что ты не троллишь и успел и разозлиться и пожалеть, что ввязался.
Так что тоже извиняюсь, если был местами резок. Но мне казалось, что это довольно тривиальная задача и тема себя быстро исчерпает.
   AceVi
 
68 - 15.04.21 - 14:11
(67) ты еще погоди.
я же только на тестовом примере проверил.
надо
проверить на реальных данных, возможно там будет не так все радужно.

но  в любом случае , спасибо за помощь.
   fisher
 
69 - 15.04.21 - 14:15
На реальных данных конец фактического периода вероятно будет "включая", а не "исключая" последнюю секунду. Соответственно нужно будет и план привести к виду 8:00:00 - 11:59:59 и расчет на секунду поправить.
   fisher
 
70 - 15.04.21 - 14:20
А может и не будет. Зависит от того, как вы данные СКУДа били на периоды пребывания.
   AliceLight
 
71 - 15.04.21 - 15:11
(33) а если сотрудник вышел в обед и вернулся через 2 часа, то есть 1 час прогулял?
   AceVi
 
72 - 15.04.21 - 15:18
(71) да
(69) даже для формата
План
8-12
12-12:30 - обед
12:30-17:30

Факт
7:07-17:15

выдает корректный результат
Отсутствовал 15 минут (которые прощаются, но главное что мы их видим).

Еще раз спасибо. продолжаю тестирование.
   Bigbro
 
73 - 16.04.21 - 04:27
(60) а по теме все в 31 написано. если уж такую простейшую вещь не можете реализовать... то я не знаю.
   Гений 1С
 
74 - 16.04.21 - 08:11
(0) о, я с этой темой сталкивался очень подробно...
Реализовывал одну такую систему. Пиши в лычку, скину описалово.
для затравки:


Учет отметок о приходе
Время сотрудника первоначально делится на моменты его нахождения на работе и за ее пределами, например, так:
•    09.50-11.00 на работе
•    11.00-11.30 вне работы
•    11.30-15.00 на работе
•    15.00-17.00 вне работы
•    17.00-19.00 на работе

При этом первая и последняя запись всегда «на работе». На работе обозначает что сотрудник находился на рабочем месте, на территории предприятия


Ведение расписаний

Расписания вводятся в базе «1С: Биометрия».

Расписания заносятся в справочник «Расписания».




Учет отклонений рабочего времени
Когда задано расписание, то появляется возможность учитывать отклонения рабочего времени.

Виды рабочего времени бывают такими:
1.    Рабочее время (РВ) – сотрудник находится на рабочем месте.
2.    Опоздание (ОП) – сотрудник пришел на работу позже назначенного времени
3.    Преждевременный уход (ПУ) – сотрудник ушел с работы раньше назначенного времени
4.    Переработка (СР) – сотрудник работает сверх рабочего времени
5.    Перерыв (ПР) – сотрудник ушел с работы внутри интервала не рабочего времени.
6.    Прогул (НВ) – если сотрудник должен быть на рабочем месте, но отсутствовал, задается рамками начала и окончания рабочего дня.
7.    Отсутствие(ОТ) – сотрудник ушел с работы внутри интервала рабочего времени.
8.    Прогул (ПГ) – прогул.

Каждый интервал времени расписания помечается следующими полями:
1.    Рабочее время – флажок того, что время считается рабочим.  Если не установлен, то время не рабочее, например, перерыв – не рабочее время.
2.    Опоздание – фиксировать опоздание, если первая отметка рабочего времени позже интервала.
3.    Преждевременный уход – фиксировать преждевременный уход, если последняя отметка рабочего времени раньше интервала.
4.    Переработка – присутствие сотрудника в этом интервале времени считается переработкой.
5.    Перерыв – время относится к перерыву.

Для расписания в целом задаются следующие параметры:
1.    Норма перерывов – какое количество перерывов допустимо в течении рабочего дня. Время, превышающее норму перерывов относится в «Отсутствие».
2.    Максимальное опоздание – какое максимальное опоздание начисляется, в минутах. После этого время относится в «Отсутствие». Если не задано, то опоздание считается по факту.
3.    Допустимое опоздание – какое опоздание разрешается, в минутах.
4.    Вычитать допустимое опоздание – если флаг установлен, то из зафиксированного опоздания вычитается допустимое опоздание, иначе опоздание считается без вычетов.
5.    Максимальная переработка – какое максимальное время переработки учитывается. Если не задано, то переработка учитывается по факту.
6.    Максимальный преждевременный уход – какое максимальное время преждевременного ухода учитывать.
7.    Допустимый преждевременный уход – какой преждевременный уход разрешается, в минутах.
8.    Вычитать допустимый преждевременный уход – если флаг установлен, то из зафиксированного преждевременного ухода вычитается преждевременный уход, иначе преждевременный уход считается без вычетов.
9.    Минимальное рабочее время – если задано, то в случае, если рабочее время получилось меньше, рабочее время обнуляется и фиксируется прогул.

Итогом расчета рабочего времени является список интервалов, каждый из которых относится к определенному виду времени.

В итоге получается сумма по каждому из видов времени в минутах. Она сохраняется по каждому расчету в регистре «Начисленное время».
Пример: Рабочее время 420, Опоздание 10, Перерыв 60, Переработка 30.

Чтобы скорректировать рабочее время используется регистр «Корректировки времени», где для каждого сотрудника на определенную дату можно указать другое значение по виду времени. Значения из этого регистра имеют приоритет над расчетными. Каждую запись можно сопроводить комментарием.

Пример: Сотрудник ездил по делам в течении трех часов, в итоге у него Отсутствие 180. Нужно создать корректировочную запись Отсутствие 0, с комментарием «Отсутствие по делам, согласовано с руководством».

Пример: Сотрудник опоздал на час из-за сбоя в работе транспорта, в итоге у него Опоздание 60. Нужно создать корректировочную запись Опоздание 0, с комментарием «Опоздал из-за сбоя транспорта, объяснительная приложена и проверена Ивановым И.И.».




Назначение расписаний сотрудникам

В регистре «Назначения» назначается расписание сотрудникам. Одному сотруднику можно назначить на дату несколько расписаний, тогда по каждому из них ему будут посчитаны показатели рабочего времени.


Алгоритм расчета часов по расписаниям
Алгоритм позволяет определить прогулы сотрудников. Поэтому анализируются данные за выбранный в обработке период времени. Если период не выбран, то используется дата от начальной до минимальной.

Изначально таблица проходов рассчитывается в разрезе Person ID + Дата + Точка.

Затем за каждый анализируемый день по таблице назначения расписаний определяется, какие расписания действуют для сотрудников на этот день.

Формируется таблица расчета часов в разрезе: Физлицо + Дата + Точка + Расписание + Подразделение.


....
   Гений 1С
 
75 - 16.04.21 - 08:11
(73) ты не прав, это не простейшая вещь. там много нюансов, если копать
   МимохожийОднако
 
76 - 16.04.21 - 08:19
ОФФ: Всю сознательную жизнь избегал работы, где платят за часы, а не за фактическую работу.
   AceVi
 
77 - 16.04.21 - 08:39
(74) Спасибо. это мне очень пригодиться.
мне еще очень интересно как вы получаете "Итогом расчета рабочего времени является список интервалов".

На данный момент я могу - задать рассписание(например 8:30 -12 и  с 12:30-17:30) и проверить что заданный интервал входит в расписание и какое отклонение от расписания содержит(например реальное время сотрудника задано как 7:30-17, я могу определить что относительно плана мы имеем отклонение в 30 минут, а знаете ли вы как сделать что бы в итоге мы получили след интервалы

8:30-12 - раб время
12:30-17 раб время
17-17:30 - прогул.

на данный момент я могу только сделать такую картину
8:30-17 раб время
30 минут - прогул
   МимохожийОднако
 
78 - 16.04.21 - 09:10
Почитай про регистры расчета.
   Kekeke
 
79 - 16.04.21 - 09:19
Я не совсем в теме всего этого, чисто логически подхожу.
Если чувак вышел - включаем счетчик ИЛИ если наступило 8 часов и он не пробил пропуск.
Счетчик перевалил за 15 минут - смотрим время
Если это не 12-12:30 счетчик считает время прогула до следующего пробития пропуска или конца смены.

Как-то так, возможно я просто мешаю, т.к. немного не в теме языка 1с
   AceVi
 
80 - 16.04.21 - 09:29
(79) тут язык не при чем. вы просто не в теме.
   fisher
 
81 - 16.04.21 - 09:42
(77) Просто в том коде, что уже есть, где уже сравниваются плановые интервалы с фактическими, "выкусывай" из плановых интервалов куски фактических. Если появляется новый "огрызок" - добавляй его к списку плановых интервалов. Если факт полностью покрыл плановый "кусок" - удаляй такой плановый интервал. В итоге у тебя останутся только периоды прогулов.
Только код за тебя писать я уже не буду.
   Classic
 
82 - 16.04.21 - 10:01
(76)
Ближе к старости пожалеешь.
   Bigbro
 
83 - 16.04.21 - 10:14
(81) cм. (31)  ))
   AceVi
 
84 - 16.04.21 - 10:14
(81) Да понимаю что информацию в итоге можно выцепить и "построить" нужную последовательность периодов в рамках плана.
Просто  хотелось бы услышать и версию человека в посте (74).
чем больше опыта, тем лучше.
   fisher
 
85 - 16.04.21 - 12:18
Держи. Только протестить надо.
Процедура ВычестьПериоды(УменьшаемыеПериоды, ВычитаемыеПериоды)
    
    НулевыеУменьшаемыеПериоды = Новый Массив;
    
    Для Каждого ВычитаемыйПериод Из ВычитаемыеПериоды Цикл
        
        НулевыеУменьшаемыеПериоды.Очистить();
        
        КвоУменьшаемыхПериодов = УменьшаемыеПериоды.Количество();
        Для НомерУменьшаемогоПериода = 1 По КвоУменьшаемыхПериодов Цикл
            
            УменьшаемыйПериод = УменьшаемыеПериоды[НомерУменьшаемогоПериода - 1];
            
            // определим пересечение периодов

            НачалоПересечения = Макс(ВычитаемыйПериод.Начало, УменьшаемыйПериод.Начало);
            КонецПересечения = Мин(ВычитаемыйПериод.Конец, УменьшаемыйПериод.Конец);
            
            Если НачалоПересечения > КонецПересечения Тогда// пересечения нет

                Продолжить;
            КонецЕсли;
            
            // образование головного "огрызка"

            Если НачалоПересечения > УменьшаемыйПериод.Начало Тогда
                ГоловнойОгрызок = УменьшаемыеПериоды.Добавить();
                ГоловнойОгрызок.Начало = УменьшаемыйПериод.Начало;
                ГоловнойОгрызок.Конец = НачалоПересечения;
                УменьшаемыйПериод.Начало = НачалоПересечения;
            КонецЕсли;
            
            // образование хвостового "огрызка"

            Если КонецПересечения < УменьшаемыйПериод.Конец Тогда
                ХвостовойОгрызок = УменьшаемыеПериоды.Добавить();
                ХвостовойОгрызок.Начало = КонецПересечения;
                ХвостовойОгрызок.Конец = УменьшаемыйПериод.Конец;
                УменьшаемыйПериод.Конец = КонецПересечения;
            КонецЕсли;
            
            // уменьшаемый период уменьшился до нуля. Откладываем для удаления

            Если НачалоПересечения = УменьшаемыйПериод.Начало И КонецПересечения = УменьшаемыйПериод.Конец Тогда
                НулевыеУменьшаемыеПериоды.Добавить(УменьшаемыйПериод);
                Продолжить;
            КонецЕсли;
            
        КонецЦикла;
        
        // удаление нулевых периодов

        Для Каждого НулевойПериод Из НулевыеУменьшаемыеПериоды Цикл
            УменьшаемыеПериоды.Удалить(НулевойПериод);
        КонецЦикла;
        
    КонецЦикла;
    
КонецПроцедуры

   fisher
 
86 - 16.04.21 - 12:25
"Продолжить" в конце - атавизма.
   mistеr
 
87 - 16.04.21 - 14:41
(81) В одном запросе все можно сделать и не мучиться.
   Гений 1С
 
88 - 16.04.21 - 14:58
(85) я брезгую регистрами расчета
(77) ну например такой список:
10:00-11:00
12:00-12:45
13:15-14:20
   МимохожийОднако
 
89 - 16.04.21 - 14:59
(82) Обоснуй )
   fisher
 
90 - 16.04.21 - 15:14
(87) Можно. А в 1С зачастую и нужно. Но я предпочитаю не сбивать руку. Фигачить все запросами - это проф-деформация одинэсников.
   Kassern
 
91 - 16.04.21 - 15:15
(90) я думал это новый уровень одинэсников. Мол циклом каждый может, а вот написать грамотный запрос далеко не все могут.
   Гений 1С
 
92 - 16.04.21 - 15:22
(91) излишне фанатичная любовь к запросам вылазит в нечитаемый код, а потом икается
   fisher
 
93 - 16.04.21 - 15:24
(91) Без запросов вообще никуда. Поэтому хочешь - не хочешь, а рука набивается. Да и о каких грамотных запросах речь? СУБД все стерпит.
Много раз уже наблюдал ситуацию, когда человек более-менее овладел запросами - и все. Это теперь серебряная пуля.
Простейшая обработка на клиенте? Пффф. Выгрузим ТЗ на сервер, СУБД нам все посчитает. И что самое смешное - в 1С это зачастую эффективнее.
   Kassern
 
94 - 16.04.21 - 15:32
(93) грамотный запрос, это оптимальный в моем понимании. Можно же по документам собрать данные с начала эпохи в запросе, а можно к регистру обратиться с нужными отборами и получить нужные данные, можно в цикле запрос гонять, т.к. не умеешь объединять таблицы, а можно выполнить 1 раз и работать в цикле с результирующей таблицей. В общем я про это...
   Kassern
 
95 - 16.04.21 - 15:34
(93) видел я 1 запрос при загрузке с сайта в цикле, где для каждого товара делался запрос в базу, в итоге при загрузке файлика в 30мб, грузился он пол часа и сервак чуть ли не загибался. После правки запроса, чтобы он вызывался 1 раз, загрузка этого файла заняла пару минут, может даже меньше.
   fisher
 
96 - 16.04.21 - 15:43
(94) Ну а я про то, что часто предпочитают переусложненные запросы простейшей постобработке. Опыт работы с СКД на это форсит.
   Kassern
 
97 - 16.04.21 - 15:46
(96) видимо в своей практике я больше встречаю обратное, там где можно было сделать простым соединением 2х таблиц клепается куча циклов и условий...
   mistеr
 
98 - 16.04.21 - 15:50
(94) О мастерстве написания грамотных и оптимальных запросов можно говорить, когда тебе доступна вся мощь СУБД в виде ее родного диалекта SQL. А в случае 1С это смех один... Разве что мастерство эмуляции в уме транслятора в SQL.
   fisher
 
99 - 16.04.21 - 16:01
(97) Дык я про продвинутых одинэсников, а не падаванов. Падаваны еще и не то напишут. Но если они уже хоть как-то смогли решить задачу, то это правильные падаваны.
   Classic
 
100 - 16.04.21 - 18:02
(89)
Захочется сидеть, ничего не делать и получать денег.
А все работы заточены на сделку.
  1  2   

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.