Определить по дате выходной или рабочий день

1. n_spb 15.03.19 14:17 Сейчас в теме
ЗУП 3.1.8 Как программно для нужной даты определить это рабочий день, выходной или праздничный?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Xershi 1500 15.03.19 14:20 Сейчас в теме
(1) УТ есть производственный календарь, где определяется выходной это или праздничный день. Думаю там тоже самое.
3. VZyryanov 15.03.19 14:26 Сейчас в теме
В общем серверном модуле:

Функция ЭтоРабочийДень(ГрафикРаботы,ТекДата) Экспорт
	Если ГрафикРаботы=Неопределено Тогда
		СведенияНаДень=РегистрыСведений.ДанныеПроизводственногоКалендаря.Получить(Новый Структура("Дата",ТекДата));
		Возврат СведенияНаДень.ВидДня=Перечисления.ВидыДнейПроизводственногоКалендаря.Рабочий 
			ИЛИ СведенияНаДень.ВидДня=Перечисления.ВидыДнейПроизводственногоКалендаря.Предпраздничный;		
	Иначе
		Запрос=Новый Запрос;
		Запрос.Текст=
			"ВЫБРАТЬ
			|	ГрафикиРаботыПоВидамВремени.ОсновноеЗначение КАК ОсновноеЗначение
			|ИЗ
			|	РегистрСведений.ГрафикиРаботыПоВидамВремени КАК ГрафикиРаботыПоВидамВремени
			|ГДЕ
			|	ГрафикиРаботыПоВидамВремени.ГрафикРаботы = &ГрафикРаботы
			|	И ГрафикиРаботыПоВидамВремени.ВидУчетаВремени = &ВидУчетаВремени
			|	И ГрафикиРаботыПоВидамВремени.Дата = &Дата";
		Запрос.УстановитьПараметр("ГрафикРаботы",ГрафикРаботы);
		Запрос.УстановитьПараметр("ВидУчетаВремени",Справочники.ВидыИспользованияРабочегоВремени.Явка);
		Запрос.УстановитьПараметр("Дата",ТекДата);
		Результат=Запрос.Выполнить();
		Возврат Не Результат.Пустой();
	КонецЕсли;	
КонецФункции
Показать
Diamante; Lexx100; +2 Ответить
4. denium 117 25.07.19 10:24 Сейчас в теме
Общий модуль КалендарныеГрафики



// Определяет для каждой даты дату ближайшего к ней рабочего дня.
//
//	Параметры:
//	  График	- СправочникСсылка.Календари, СправочникСсылка.ПроизводственныеКалендари - график или 
//                    производственный календарь, который необходимо использовать для расчета.
//	  НачальныеДаты 				- Массив - массив дат (Дата).
//	  ПолучатьПредшествующие		- Булево - способ получения ближайшей даты:
//										если Истина - определяются рабочие даты, предшествующие переданным в параметре НачальныеДаты, 
//										если Ложь - получаются даты не ранее начальной даты.
//	  ВызыватьИсключение - Булево - если Истина, вызвать исключение в случае незаполненного графика.
//	  ИгнорироватьНезаполненностьГрафика - Булево - если Истина, то в любом случае будет возвращено соответствие. 
//										Начальные даты, для которых не будет значений из-за незаполненности графика, включены не будут.
//
//	Возвращаемое значение:
//	  Соответствие, Неопределено - соответствие, где ключ - дата из переданного массива, 
//									значение - ближайшая к ней рабочая дата (если передана рабочая дата, то она же и возвращается).
//									Если выбранный график не заполнен, и ВызыватьИсключение = Ложь, возвращается Неопределено.
//
Функция ДатыБлижайшихРабочихДней(График, НачальныеДаты, ПолучатьПредшествующие = Ложь, ВызыватьИсключение = Истина, 
	ИгнорироватьНезаполненностьГрафика = Ложь) Экспорт
	
	Если Не ЗначениеЗаполнено(График) Тогда
		Если ВызыватьИсключение Тогда
			ВызватьИсключение НСтр("ru = 'Не указан график работы или производственный календарь.'");
		КонецЕсли;
		Возврат Неопределено;
	КонецЕсли;
	
	ТекстЗапросаВТ = "";
	ПерваяЧасть = Истина;
	Для Каждого НачальнаяДата Из НачальныеДаты Цикл
		Если Не ЗначениеЗаполнено(НачальнаяДата) Тогда
			Продолжить;
		КонецЕсли;
		Если Не ПерваяЧасть Тогда
			ТекстЗапросаВТ = ТекстЗапросаВТ + "
			|ОБЪЕДИНИТЬ ВСЕ
			|";
		КонецЕсли;
		ТекстЗапросаВТ = ТекстЗапросаВТ + "
		|ВЫБРАТЬ
		|	ДАТАВРЕМЯ(" + Формат(НачальнаяДата, "ДФ=гггг,ММ,дд") + ")";
		Если ПерваяЧасть Тогда
			ТекстЗапросаВТ = ТекстЗапросаВТ + " КАК Дата 
			|ПОМЕСТИТЬ НачальныеДаты
			|";
		КонецЕсли;
		ПерваяЧасть = Ложь;
	КонецЦикла;

	Если ПустаяСтрока(ТекстЗапросаВТ) Тогда
		Возврат Новый Соответствие;
	КонецЕсли;
	
	Запрос = Новый Запрос(ТекстЗапросаВТ);
	Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
	Запрос.Выполнить();
	
	Если ТипЗнч(График) = Тип("СправочникСсылка.ПроизводственныеКалендари") Тогда
		ТекстЗапроса = 
		"ВЫБРАТЬ
		|	НачальныеДаты.Дата,
		|	%Функция%(ДатыКалендаря.Дата) КАК БлижайшаяДата
		|ИЗ
		|	НачальныеДаты КАК НачальныеДаты
		|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДатыКалендаря
		|		ПО (ДатыКалендаря.Дата %ЗнакУсловия% НачальныеДаты.Дата)
		|			И (ДатыКалендаря.ПроизводственныйКалендарь = &График)
		|			И (ДатыКалендаря.ВидДня В (
		|			ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий), 
		|			ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный)
		|			))
		|
		|СГРУППИРОВАТЬ ПО
		|	НачальныеДаты.Дата";
	Иначе
		// По графику работы
		Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрафикиРаботы") Тогда
			МодульГрафикиРаботы = ОбщегоНазначения.ОбщийМодуль("ГрафикиРаботы");
			ТекстЗапроса = МодульГрафикиРаботы.ШаблонТекстаЗапросаОпределенияБлижайшихДатПоГрафикуРаботы();
		КонецЕсли;
	КонецЕсли;
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "%Функция%", 				?(ПолучатьПредшествующие, "МАКСИМУМ", "МИНИМУМ"));
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "%ЗнакУсловия%", 			?(ПолучатьПредшествующие, "<=", ">="));
	
	Запрос.Текст = ТекстЗапроса;
	Запрос.УстановитьПараметр("График", График);
	
	Выборка = Запрос.Выполнить().Выбрать();
	
	ДатыРабочихДней = Новый Соответствие;
	Пока Выборка.Следующий() Цикл
		Если ЗначениеЗаполнено(Выборка.БлижайшаяДата) Тогда
			ДатыРабочихДней.Вставить(Выборка.Дата, Выборка.БлижайшаяДата);
		Иначе 
			Если ИгнорироватьНезаполненностьГрафика Тогда
				Продолжить;
			КонецЕсли;
			Если ВызыватьИсключение Тогда
				ТекстСообщения = НСтр("ru = 'Невозможно определить ближайшую рабочую дату для даты %1, возможно, график работы не заполнен.'");
				ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, Формат(Выборка.Дата, "ДЛФ=D"));
			Иначе
				Возврат Неопределено;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	Возврат ДатыРабочихДней;
	
КонецФункции


Показать
user1619761; romulanin; user1367144; Jeka44; unknow_user; +5 Ответить
5. unknow_user 10.01.20 06:06 Сейчас в теме
(4) Спасибо. Не знал о регистре "ДанныеПроизводственногоКалендаря "
Оставьте свое сообщение

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