Даты по календарю. Возвращает даты, которые отличаются от указанной даты ДатаОт на количество дней,
// Возвращает даты, которые отличаются от указанной даты ДатаОт на количество дней,
// входящих в указанный график ГрафикРаботы.
//
// Параметры:
// ГрафикРаботы - СправочникСсылка.Календари, СправочникСсылка.ПроизводственныеКалендари - график или
// производственный календарь, который необходимо использовать для расчета дат.
// ДатаОт - Дата - дата, от которой нужно рассчитать количество дней.
// МассивДней - Массив - количество дней (Число), на которые нужно увеличить дату начала.
// РассчитыватьСледующуюДатуОтПредыдущей - Булево - нужно ли рассчитывать следующую дату от предыдущей или
// все даты рассчитываются от переданной даты.
// ВызыватьИсключение - Булево - если Истина, вызвать исключение в случае незаполненного графика.
//
// Возвращаемое значение:
// Неопределено, Массив - массив дат, увеличенных на количество дней, входящих в график,
// Если график ГрафикРаботы не заполнен, и ВызыватьИсключение = Ложь, возвращается Неопределено.
//
Функция ДатыПоКалендарю(Знач ГрафикРаботы, Знач ДатаОт, Знач МассивДней, Знач РассчитыватьСледующуюДатуОтПредыдущей = Ложь, ВызыватьИсключение = Истина) Экспорт
Если Не ЗначениеЗаполнено(ГрафикРаботы) Тогда
Если ВызыватьИсключение Тогда
ВызватьИсключение НСтр("ru = 'Не указан график работы или производственный календарь.'");
КонецЕсли;
Возврат Неопределено;
КонецЕсли;
Если ТипЗнч(ГрафикРаботы) <> Тип("СправочникСсылка.ПроизводственныеКалендари") Тогда
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрафикиРаботы") Тогда
МодульГрафикиРаботы = ОбщегоНазначения.ОбщийМодуль("ГрафикиРаботы");
Возврат МодульГрафикиРаботы.ДатыПоГрафику(
ГрафикРаботы, ДатаОт, МассивДней, РассчитыватьСледующуюДатуОтПредыдущей, ВызыватьИсключение);
КонецЕсли;
КонецЕсли;
МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
СоздатьВТПриращениеДней(МенеджерВременныхТаблиц, МассивДней, РассчитыватьСледующуюДатуОтПредыдущей);
// Алгоритм работает следующим образом:
// Получаем все дни календаря, следующие после даты отсчета.
// Для каждого из таких дней рассчитываем количество дней, включенных в график с даты отсчета.
// Отбираем рассчитанное таким образом количество по таблице приращения дней.
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
// По производственному календарю.
Запрос.Текст =
"ВЫБРАТЬ
| КалендарныеГрафики.Дата КАК ДатаГрафика
|ПОМЕСТИТЬ ВТПоследующиеДатыГрафика
|ИЗ
| РегистрСведений.ДанныеПроизводственногоКалендаря КАК КалендарныеГрафики
|ГДЕ
| КалендарныеГрафики.Дата >= &ДатаОт
| И КалендарныеГрафики.ПроизводственныйКалендарь = &ГрафикРаботы
| И КалендарныеГрафики.ВидДня В (ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий), ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный))
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ПоследующиеДатыГрафика.ДатаГрафика,
| КОЛИЧЕСТВО(КалендарныеГрафики.ДатаГрафика) - 1 КАК КоличествоДнейВключенныхВГрафик
|ПОМЕСТИТЬ ВТПоследующиеДатыГрафикаСКоличествомДней
|ИЗ
| ВТПоследующиеДатыГрафика КАК ПоследующиеДатыГрафика
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТПоследующиеДатыГрафика КАК КалендарныеГрафики
| ПО (КалендарныеГрафики.ДатаГрафика <= ПоследующиеДатыГрафика.ДатаГрафика)
|
|СГРУППИРОВАТЬ ПО
| ПоследующиеДатыГрафика.ДатаГрафика
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ПриращениеДней.ИндексСтроки,
| ЕСТЬNULL(ПоследующиеДни.ДатаГрафика, НЕОПРЕДЕЛЕНО) КАК ДатаПоКалендарю
|ИЗ
| ВТПриращениеДней КАК ПриращениеДней
| ЛЕВОЕ СОЕДИНЕНИЕ ВТПоследующиеДатыГрафикаСКоличествомДней КАК ПоследующиеДни
| ПО ПриращениеДней.КоличествоДней = ПоследующиеДни.КоличествоДнейВключенныхВГрафик
|
|УПОРЯДОЧИТЬ ПО
| ПриращениеДней.ИндексСтроки";
Запрос.УстановитьПараметр("ДатаОт", НачалоДня(ДатаОт));
Запрос.УстановитьПараметр("ГрафикРаботы", ГрафикРаботы);
Выборка = Запрос.Выполнить().Выбрать();
МассивДат = Новый Массив;
Пока Выборка.Следующий() Цикл
Если Выборка.ДатаПоКалендарю = Неопределено Тогда
СообщениеОбОшибке = НСтр("ru = 'Производственный календарь «%1» не заполнен с даты %2 на указанное количество рабочих дней.'");
Если ВызыватьИсключение Тогда
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СообщениеОбОшибке, ГрафикРаботы, Формат(ДатаОт, "ДЛФ=D"));
Иначе
Возврат Неопределено;
КонецЕсли;
КонецЕсли;
МассивДат.Добавить(Выборка.ДатаПоКалендарю);
КонецЦикла;
Возврат МассивДат;
КонецФункции
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
Прибавить рабочие дни к дате (Запрос)
ПриОбновленииПроизводственныхКалендарей (БСП)
ОсновнойПроизводственныйКалендарь (БСП)
РаспространитьИзмененияДанныхПроизводственныхКалендарей (БСП)
Канал FastCode 1C в Телеграм! Шаблоны кода, статьи, полезные советы, курсы по 1С (8К участников)