|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||
|
|
[CODE] Прибавить рабочие часы к дате с использованием производственного календаря и графика работы
Процедура для расчета дедлайна или иной даты на основе настроек производственного календаря и графика работы, для типовых конфигураций 1С
&НаСервере Функция ПрибавитьТолькоРабочиеЧасыКДатеПоКалендарю(ДатаНач, Часов) СекундДоДедлайна = Часов * 60 * 60; НомерТекущегоДняНедели = ДеньНедели(ДатаНач); Календарь = Константы.пмГрафикРаботы.Получить(); Для каждого стр из Календарь.РасписаниеРаботы Цикл Если стр.НомерДня = НомерТекущегоДняНедели Тогда КонецДня = НачалоДня(ДатаНач) + Час(стр.ВремяОкончания)*60*60+Минута(стр.ВремяОкончания)*60 ; ОстатокВТекущемДнеВСекундах = КонецДня - ДатаНач ; Если ОстатокВТекущемДнеВСекундах >= СекундДоДедлайна Тогда Возврат ДатаНач + СекундДоДедлайна; КонецЕсли; КонецЕсли; КонецЦикла; //Без текущего дня СекундДоДедлайна = СекундДоДедлайна - ОстатокВТекущемДнеВСекундах ; Запрос = Новый Запрос; //Установка значений параметров Запрос.УстановитьПараметр("ПроизводственныйКалендарь", Календарь.ПроизводственныйКалендарь);//Российская Федерация (Справочник.ПроизводственныеКалендари) Запрос.УстановитьПараметр("ДатаНач", НачалоДня(ДатаНач)+1*86400); //Со след раб дня Запрос.УстановитьПараметр("ВидДня", Перечисления.ВидыДнейПроизводственногоКалендаря.Рабочий); Запрос.Текст = "ВЫБРАТЬ | ДанныеПроизводственногоКалендаря.ПроизводственныйКалендарь КАК ПроизводственныйКалендарь, | ДанныеПроизводственногоКалендаря.Дата КАК Дата, | ДанныеПроизводственногоКалендаря.Год КАК Год, | ДанныеПроизводственногоКалендаря.ВидДня КАК ВидДня |ИЗ | РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря |ГДЕ | ДанныеПроизводственногоКалендаря.ПроизводственныйКалендарь = &ПроизводственныйКалендарь | И ДанныеПроизводственногоКалендаря.Дата >= &ДатаНач | И ДанныеПроизводственногоКалендаря.ВидДня = &ВидДня | |УПОРЯДОЧИТЬ ПО | Дата"; Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл НомерТекущегоДняНедели = ДеньНедели(Выборка.Дата); Для каждого стр из Календарь.РасписаниеРаботы Цикл Если стр.НомерДня = НомерТекущегоДняНедели Тогда НачалоДня = НачалоДня(Выборка.Дата) + Час(стр.ВремяНачала)*60*60+Минута(стр.ВремяНачала)*60 ; КонецДня = НачалоДня(Выборка.Дата) + Час(стр.ВремяОкончания)*60*60+Минута(стр.ВремяОкончания)*60 ; ВДнеРабочихСекунд = КонецДня - НачалоДня ; Если ВДнеРабочихСекунд >= СекундДоДедлайна Тогда Возврат НачалоДня + СекундДоДедлайна; КонецЕсли; СекундДоДедлайна = СекундДоДедлайна - ВДнеРабочихСекунд ; КонецЕсли; КонецЦикла; КонецЦикла; Возврат ""; КонецФункции Количество показов: 577 Дата изменения: 20.12.2023 06:22:57
|
||||||||||||||||||||||||||||||||||
Модули Статьи Отзывы Кабинет Поддержка | ||||||||||||||||||||||||||||||||||||
@ !pride, 1module. Все права защищены. 2003 -
2024
|