|   |   | 
| 
 | Как найти разницу между датами? | ☑ | ||
|---|---|---|---|---|
| 0
    
        VID1234 19.09.23✎ 16:12 | 
        Здравствуйте. Подскажите пожалуйста как лучше сделать. Есть документ отсутствия, например сотрудник отсутствует с 1 августа по 30 августа, нужно (желательно запросом) найти разницу дней когда у сотрудника необоснованный прогул, т.е. допустим с 5 августа по 10 у него больничный, потом с 20 по 25 тоже больничный, нужно получить следующее с 1 по 4 разница 4 дня, с 11 по 19 разница 9, с 26 по 30 разница 5. Всегда будет использоваться документ отсутствия и больничный, если больничного нет, то прогул. это зуп     | |||
| 1
    
        VID1234 19.09.23✎ 16:19 | 
        Запрос = Новый Запрос;
 Запрос.Текст = "ВЫБРАТЬ | ПрогулНеявка.ДатаНачала КАК ДатаНачала, | ПрогулНеявка.ДатаОкончания КАК ДатаОкончания |ИЗ | Документ.ПрогулНеявка КАК ПрогулНеявка |ГДЕ | ПрогулНеявка.Сотрудник = &Сотрудник | |УПОРЯДОЧИТЬ ПО | ДатаНачала"; Запрос.УстановитьПараметр("Сотрудник", СтрокаДанных.Сотрудник); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); ТЗ = Новый ТаблицаЗначений; Тз.Колонки.Добавить("ДатаС", Новый ОписаниеТипов("Дата")); Тз.Колонки.Добавить("ДатаПо", Новый ОписаниеТипов("Дата")); Если ВыборкаДетальныеЗаписи.Количество() > 0 Тогда Запрос2 = Новый Запрос; Запрос2.Текст = "ВЫБРАТЬ | БольничныйЛист.ДатаНачала КАК ДатаНачала, | БольничныйЛист.ДатаОкончания КАК ДатаОкончания |ИЗ | Документ.БольничныйЛист КАК БольничныйЛист |ГДЕ | БольничныйЛист.Сотрудник = &Сотрудник | И ВЫБОР | КОГДА БольничныйЛист.ДатаНачала < &ДатаНачала | ТОГДА БольничныйЛист.ДатаОкончания | ИНАЧЕ ВЫБОР | КОГДА БольничныйЛист.ДатаНачала >= &ДатаНачала | ТОГДА БольничныйЛист.ДатаОкончания <= &ДатаОкончания | КОНЕЦ | КОНЕЦ | |УПОРЯДОЧИТЬ ПО | ДатаНачала"; Запрос2.УстановитьПараметр("Сотрудник", СтрокаДанных.Сотрудник); СтруктураДанных.Вставить("Прогулы", Новый Массив); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Тз.Очистить(); Запрос2.УстановитьПараметр("ДатаОкончания", ВыборкаДетальныеЗаписи.ДатаОкончания); Запрос2.УстановитьПараметр("ДатаНачала", ВыборкаДетальныеЗаписи.ДатаНачала); РезультатЗапроса2 = Запрос2.Выполнить(); ВыборкаДетальныеЗаписи22 = РезультатЗапроса2.Выгрузить(); ПервыйРаз = Истина; ВтораяДата = Дата("00010101"); Сч = 1; Для Каждого ВыборкаДетальныеЗаписи2 ИЗ ВыборкаДетальныеЗаписи22 Цикл Если ВыборкаДетальныеЗаписи.ДатаНачала = ВыборкаДетальныеЗаписи2.ДатаНачала И ВыборкаДетальныеЗаписи2.ДатаОкончания = ВыборкаДетальныеЗаписи.ДатаОкончания Тогда Продолжить; КонецЕсли; Если ПервыйРаз Тогда ТЗСтр = ТЗ.Добавить(); ТЗСтр.ДатаС = ВыборкаДетальныеЗаписи2.ДатаОкончания; ВтораяДата = ВыборкаДетальныеЗаписи2.ДатаОкончания; Если ВыборкаДетальныеЗаписи22.Количество() = 1 Тогда ТЗСтр.ДатаПо = ВыборкаДетальныеЗаписи.ДатаОкончания; КонецЕсли; ПервыйРаз = Ложь; Иначе ТЗСтр = ТЗ.Добавить(); ТЗСтр.ДатаС = ВыборкаДетальныеЗаписи2.ДатаОкончания; Отбор = Новый Структура; Отбор.Вставить("ДатаС",ВтораяДата); Резолт = ТЗ.НайтиСтроки(Отбор); Резолт[0].ДатаПо = ВыборкаДетальныеЗаписи2.ДатаНачала; Если Сч = ВыборкаДетальныеЗаписи22.Количество() Тогда ТЗСтр.ДатаПо = ВыборкаДетальныеЗаписи.ДатаОкончания; Иначе ВтораяДата = ВыборкаДетальныеЗаписи2.ДатаОкончания; КонецЕсли; КонецЕсли; КонецЦикла; Тз.Сортировать("ДатаС УБЫВ",); | |||
| 2
    
        gul_Sayan 19.09.23✎ 16:20 | 
        В запросе  РАЗНОСТЬДАТ(<Дата1>, <Дата2>, <Тип>) где тип День.     | |||
| 3
    
        VID1234 19.09.23✎ 16:20 | 
        сделал так, но не совсем то.     | |||
| 4
    
        VID1234 19.09.23✎ 16:23 | 
        (2) Здравствуйте. Это я знаю, но как сделать вхождение дат в диапазон других дат и нахождение с, по и разницу между ними.     | |||
| 5
    
        lEvGl 19.09.23✎ 16:37 | 
        выбрать из рег календаря каждый день, определить каждый из дней как больничный или еще что то,  | |||
| 6
    
        gul_Sayan 19.09.23✎ 16:24 | 
        И не используй документы запросы лучше по регистрам. В данном случае смотри РС СостоянияСотрудников     | |||
| 7
    
        Гена 19.09.23✎ 17:08 | 
        Господа, вы и выходные такими алгоритмами запрогулите работнику.     | |||
| 8
    
        lEvGl 19.09.23✎ 18:53 | 
        (7) да, все это нужно само собой учесть - праздники федеральные, региональные, выходные, все это есть в рег календаре. остальное типа больничных, отгулов, отпусков - в данных ЗУПа, все это нужно подружить, а в конце из "астрономической" последовательности дат исключить все указанное. ну я концепцию объяснял в (5). в таких задач всегда нужна абсолютная шкала времени в днях, в минутах или часах - точность от задачи зависит. и все телодвижения производить опираясь на нее. потому что только на данных больничного ничего не построить, основа нужна     | |||
| 9
    
        Гена 19.09.23✎ 19:36 | 
        (8) Как здравомыслящий форумчанин Вы несомненно должны знать, что автоматическое опрогуливание НН полный бред. Прогул - это всегда ворох бумажных документов: докладных, объяснительных и т.п. 
 Потому что прогул влечёт за собой уменьшение будущих средних заработков, пенсионного стажа и т.д. для избежания трудовых споров. На вершине этой кипы бумаг бумажный приказ руководителя, в котором и указаны ТОЧНЫЕ даты прогулов. Данный приказ попадает к кадровикам и они уже в РУЧНОМ порядке вводят документ Прогула. Только так. Нельзя же бездумно автоматизировать всякие глупые хотелки, иначе как по их ПИСЬМЕННОМУ техзаданию. Иначе программист станет крайним в обязательных будущих разборках. | |||
| 10
    
        lEvGl 19.09.23✎ 20:20 | 
        (9) очевидно этот запрос/отчет/документ призван дать начало таким разбирательствам. в целом мысли не понял.. ааа что автоматом поставить НН? нет, вряд ли, но информацию собрать для размышлений вполне можно     | |||
| 11
    
        SleepyHead 20.09.23✎ 08:43 | 
        (0) Смотрите регистры "Данные состояний сотрудников" и "Состояния сотрудников". Из них вы поймете, что происходило с сотрудником и в какие периоды. 
 Построив таблицу состояний, вы уже по ней посчитаете количество дней в нужных вам периодах. | |||
| 12
    
        SleepyHead 20.09.23✎ 08:44 | 
        (10) " очевидно этот запрос/отчет/документ призван дать начало таким разбирательствам. в целом мысли не понял.. ааа что автоматом поставить НН? нет, вряд ли, но информацию собрать для размышлений вполне можно"
 Похожу задачу я решал в прошлом году, мне нужно было найти периоды болезни и прочих отсутствий по болезни, которые не подтверждены больничными. В регистре состояний может стоять тип невыхода "Болезнь", но зарегистрирована она документом "Прогул, неявка", а больничного нет - вот повод для разбирательства. | |||
| 13
    
        Мимохожий Однако 20.09.23✎ 09:07 | 
        (10) Ты ,видимо, не хочешь понять, что здравый смысл противоречит сбору "информации для размышления"     | |||
| 14
    
        Web00001 20.09.23✎ 09:38 | 
        (5)А потом окажется, что сотрудник работает два через два)     | |||
| 15
    
        lEvGl 20.09.23✎ 09:48 | 
        (13) виноват, исправлюсь))
 (14) да не может быть.. может он и на 0.25 ставки работает, по 2 часа в день должен быть, тогда то и расчет по другом вести надо (9)(14) прекращайте. подумайте лучше как можно решить вопрос | |||
| 16
    
        Гена 20.09.23✎ 10:12 | 
        (15) подумайте лучше как можно решить вопрос
 Какой вопрос? Если найти незакрытые периоды НН, так это запросом в десяток строк к РС Состояния сотрудников. А если ещё и автоматически их опрогулить - то это вне здравого смысла ) | |||
| 17
    
        Web00001 20.09.23✎ 10:29 | 
        (14)Почему сотрудник не может работать два через два? Немного не понял. Он как угодно может работать. Это нормальная вполне тема, для всяких там кассиров, официантов да и многих работяг на заводах. Я к тому, что рабочие дни надо выяснять не из календаря а из графика сотрудника. Я решал подобную задачу. И норма сотрудника тут не нужна. Запросом интервалы между больничными и не подтвержденными отсутствиями не осилил. Но гуглеж показал, что это +- сложная задача. Выгружал в таблицу и формировал периоды отсутствий в цикле. Потом загружал обратно в ВТ и в отчете уже юзал эти данные. Потом этот отчет переписали и сравнивали у регистра расчетов фактический период действия и плановый. Но что с чем, как и почему, не могу точно сказать, не помню уже.     | |||
| 18
    
        lEvGl 20.09.23✎ 10:38 | 
        (17) кто сказал что не может 2/2? может, и не только так может, могут быть еще 2 десятка особенностей графика. тем не менее вся эта информация есть в зупе, разбирать ее, чтобы было универсально, или сделать один вариант расчета, как нужно в (0), это дело заказчика/разработчика.
 >>не осилил печально >>это +- сложная задача на первый раз непростая, потом проще. в целом да, задачи из разряда подумать и покрутить. Поэтому я и написал "принципиальную схему" решения таких задач. Это кейс. Возможно сделать все запросом, без циклов. А как будете считать, насколько глубоко детализировать, учитывать график работы или нет, это уже ваше дело, я не в курсе тонкостей вашей ситуации, как и вы не в курсе ситуации (0), есть там2/2 или нет, этого не обозначено. | |||
| 19
    
        Web00001 20.09.23✎ 12:11 | 
        (8)мне кажется это нерешаемо запроом. Может специалисты по запросам напишут километровый запрос разбирающий каждый день и сравнивающий интервалы. Я решал именно такую задачу) возможно было можно да получить дни в одном интервале, получить дни во втором и потом их соединить да. Действительно. Может даже и подошло бы такое решение. Календарь не нужен. В ЗУП есть представление, которое вернет таблицу с заполненными датами. Можно прям его и взять. Да. Рабочая тема. Действительно.     | |||
| 20
    
        Web00001 20.09.23✎ 12:12 | 
        (19) к (18)     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |