Как найти ближайший к дате рабочий день по производственному календарю. УНФ 3.0
Используем основной производственный календарь, у него код РФ (а предопределенного элемента нет):
Поискал по конфигурации, готовых функций не нашел.
Написал свою:
Функция ПроизводственныйКалендарьОсновной() Экспорт Возврат Справочники.ПроизводственныеКалендари.НайтиПоКоду("РФ"); КонецФункции Функция БлижайшийРабочийДеньПоДате(Дата, Знач ПроизводственныйКалендарь = Неопределено) Экспорт //Включая дату Дата, т.е. если Дата - рабочая дата, будет возвращена она //Дата можно передавать со временем, время отбрасывается //Возвращаются рабочие и предпразничные даты //Если ПроизводственныйКалендарь не заполнен, берется календарь с кодом РФ Если ПроизводственныйКалендарь = Неопределено Тогда ПроизводственныйКалендарь = ПроизводственныйКалендарьОсновной(); КонецЕсли; Запрос = Новый Запрос(); Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 | ДанныеПроизводственногоКалендаря.Дата КАК Дата, | ДанныеПроизводственногоКалендаря.ВидДня КАК ВидДня |ИЗ | РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря |ГДЕ | ДанныеПроизводственногоКалендаря.Дата >= &Дата | И (ДанныеПроизводственногоКалендаря.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий) | ИЛИ ДанныеПроизводственногоКалендаря.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный)) | И ДанныеПроизводственногоКалендаря.ПроизводственныйКалендарь = &ПроизводственныйКалендарь | |УПОРЯДОЧИТЬ ПО | ДанныеПроизводственногоКалендаря.Дата"; Запрос.УстановитьПараметр("Дата", НачалоДня(Дата)); Запрос.УстановитьПараметр("ПроизводственныйКалендарь", ПроизводственныйКалендарь); Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда Возврат Выборка.Дата; КонецЕсли; КонецФункции
Проверка для вторника 5.12.2023 и субботы 9.12.2023 проходит корректно:
Среда: УНФ 3.0.5.211 Объем: 0.5 час
Ближайший день может быть не больше, а меньше выбранной даты
функция рассчитывает ближайший вперед.