Как найти разницу между датами?

1. VID1234 130 19.09.23 16:10 Сейчас в теме
Здравствуйте. Подскажите пожалуйста как лучше сделать. Есть документ отсутствия, например сотрудник отсутствует с 1 августа по 30 августа, нужно (желательно запросом) найти разницу дней когда у сотрудника необоснованный прогул, т.е. допустим с 5 августа по 10 у него больничный, потом с 20 по 25 тоже больничный, нужно получить следующее с 1 по 4 разница 4 дня, с 11 по 19 разница 9, с 26 по 30 разница 5. Всегда будет использоваться документ отсутствия и больничный, если больничного нет, то прогул. это зуп/
Сделал так, но не совсем так:
Запрос = Новый Запрос;
			Запрос.Текст = 
			"ВЫБРАТЬ
			|	ПрогулНеявка.ДатаНачала КАК ДатаНачала,
			|	ПрогулНеявка.ДатаОкончания КАК ДатаОкончания
			|ИЗ
			|	Документ.ПрогулНеявка КАК ПрогулНеявка
			|ГДЕ
			|	ПрогулНеявка.Сотрудник = &Сотрудник
			|
			|УПОРЯДОЧИТЬ ПО
			|	ДатаНачала";
			
			Запрос.УстановитьПараметр("Сотрудник", СтрокаДанных.Сотрудник);
			
			РезультатЗапроса = Запрос.Выполнить();
			
			ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
			ТЗ = Новый ТаблицаЗначений;
			Тз.Колонки.Добавить("ДатаС", Новый ОписаниеТипов("Дата"));
			Тз.Колонки.Добавить("ДатаПо", Новый ОписаниеТипов("Дата"));

			Если ВыборкаДетальныеЗаписи.Количество() > 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.ДатаОкончания;
							КонецЕсли;
						КонецЕсли;
					КонецЦикла;					
					Тз.Сортировать("ДатаС УБЫВ",);
Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
7. Vinzor 95 19.09.23 22:19 Сейчас в теме
(1) Скажу как можно получить, но это не самый идеальный способ.
Документы, полагаю, проведены с режиме "Утверждено бухгалтером" ?
Тогда читайте виртуальную таблицу РегистрРасчета.Начисления.ФактическийПериодДействия.

Примерно так
ВЫБРАТЬ РАЗРЕШЕННЫЕ
	НачисленияФактическийПериодДействия.ПериодДействия КАК Период,
	НачисленияФактическийПериодДействия.ПериодРегистрации КАК ПериодРегистрации,
	НачисленияФактическийПериодДействия.ГоловнаяОрганизация КАК ГоловнаяОрганизация,
	НачисленияФактическийПериодДействия.Сотрудник КАК Сотрудник,
	НачисленияФактическийПериодДействия.ВидРасчета КАК ВидРасчета,
	НачисленияФактическийПериодДействия.Результат КАК Результат,
	НачисленияФактическийПериодДействия.ОтработаноЧасов КАК ОтработаноЧасов,
	РАЗНОСТЬДАТ(НачисленияФактическийПериодДействия.ПериодДействияНачало, НачисленияФактическийПериодДействия.ПериодДействияКонец, ДЕНЬ) + 1 КАК ДнейФПД,
	НачисленияФактическийПериодДействия.ПериодДействияНачало КАК ПериодДействияНачало,
	НачисленияФактическийПериодДействия.ПериодДействияКонец КАК ПериодДействияКонец
ПОМЕСТИТЬ ВТ_Данные
ИЗ
	РегистрРасчета.Начисления.ФактическийПериодДействия(Организация = &Организация
					И СторноТекущегоПериода = НЕОПРЕДЕЛЕНО) КАК НачисленияФактическийПериодДействия
ГДЕ
	НачисленияФактическийПериодДействия.Сотрудник = &Сотрудник
Показать


Здесь вам сразу и длительность каждого периода в днях по фактическому периоду действия

Если надо учитывать график сотрудника, тогда нужна таблица периодов (с шагом день), она накладывается на "график работы по видам времени" сотрудника, каждому дню периода присваивается "маркер" рабочего или нет, потом всё это соединяется в "Фактическим периодом действия" по условиям вхождения каждого дня в диапазон между датами начала и окончания таблицы ФПД. Ну, в общем, всё это не сложно, если есть понимание ЗУПовских регистров (интервальных), навыки и сноровка.
8. VID1234 130 20.09.23 04:07 Сейчас в теме
(7)
ВЫБРАТЬ РАЗРЕШЕННЫЕ
НачисленияФактическийПериодДействия.ПериодДействия КАК Период,
НачисленияФактическийПериодДействия.ПериодРегистрации КАК ПериодРегистрации,
НачисленияФактическийПериодДействия.ГоловнаяОрганизация КАК ГоловнаяОрганизация,
НачисленияФактическийПериодДействия.Сотрудник КАК Сотрудник,
НачисленияФактическийПериодДействия.ВидРасчета КАК ВидРасчета,
НачисленияФактическийПериодДействия.Результат КАК Результат,
НачисленияФактическийПериодДействия.ОтработаноЧасов КАК ОтработаноЧасов,
РАЗНОСТЬДАТ(НачисленияФактическийПериодДействия.ПериодДействияНачало, НачисленияФактическийПериодДействия.ПериодДействияКонец, ДЕНЬ) + 1 КАК ДнейФПД,
НачисленияФактическийПериодДействия.ПериодДействияНачало КАК ПериодДействияНачало,
НачисленияФактическийПериодДействия.ПериодДействияКонец КАК ПериодДействияКонец
ПОМЕСТИТЬ ВТ_Данные
ИЗ
РегистрРасчета.Начисления.ФактическийПериодДействия(Организация = &Организация
И СторноТекущегоПериода = НЕОПРЕДЕЛЕНО) КАК НачисленияФактическийПериодДействия
ГДЕ
НачисленияФактическийПериодДействия.Сотрудник = &Сотрудник
Показать
Здравствуйте. Ок, попробую спасибо.
9. Vinzor 95 20.09.23 08:58 Сейчас в теме
(8) В условие (Где) добавьте связь с параметрами "ДатаНачала" и "ДатаОкончания", можно подвязаться к чему хотите, к ПериодуДействия, и ПериодДействияНачало с ПериодДействияКонец. Сами решите как удобнее.
2. starik-2005 3046 19.09.23 16:19 Сейчас в теме
РАЗНОСТЬДАТ(ДатаРаз, ДатаДва, ДЕНЬ)
3. VID1234 130 19.09.23 16:22 Сейчас в теме
(2) Здравствуйте. Это я знаю, но как сделать вхождение дат в диапазон других дат и нахождение с, по и разницу между ними.
4. starik-2005 3046 19.09.23 16:24 Сейчас в теме
(3)В диапазон
ВЫБОР КОГДА ДатаРаз МЕЖДУ ДатаДва И ДатаТри ТОГДА
5. soft_wind 19.09.23 16:43 Сейчас в теме
с 1 по 30 августа...
а праздники с выходными кто будет учитывать?
и вообще производственных календарь и/или сменную работу
какой график работы у сотрудника? может 2 через 2?

и вообще переходите на РегистрыРасчетов!
6. VID1234 130 19.09.23 16:45 Сейчас в теме
(5) Здравствуйте. Пока нужно получить вышеописанное, без нюансов.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот