Каталог решений - [v8] Несколько решений для работы с периодами и датами

[v8] Несколько решений для работы с периодами и датами

[v8] Несколько решений для работы с периодами и датами

В наличии

Несколько готовых решений нетривиальных задач.

Категория:

Описание

Отсчет количества рабочих дней от даты в запросе.
Появилась потребность вычислять плановую дату оплаты в запросе. Для этого необходимо к дате договора прибавить определенное количество рабочих (банковских) дней (отсрочку платежа). Перерыл весь интернет, решения не нашел. Потратив некоторое количество времени на написание своих запросов, решил выложить сюда, может это кому-то сэкономит немного времени.
В запрос передается дата и количество дней отсрочки. Возвращается конечная дата (дата +- количество дней отсрочки). Если дата выпадает на не рабочий день, берется следующий рабочий.

Назад

ВЫБРАТЬ
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) КАК Отсрочка,
    МИНИМУМ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) КАК Дата
ПОМЕСТИТЬ втДаты
ИЗ
    РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь1
        ПО РегламентированныйПроизводственныйКалендарь.ДатаКалендаря >= РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря
ГДЕ
    (РегламентированныйПроизводственныйКалендарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный)
            ИЛИ РегламентированныйПроизводственныйКалендарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий))
    И РегламентированныйПроизводственныйКалендарь.ДатаКалендаря < &Дата
    И ДОБАВИТЬКДАТЕ(&Дата, ДЕНЬ, -&Отсрочка - 50) < РегламентированныйПроизводственныйКалендарь.ДатаКалендаря

СГРУППИРОВАТЬ ПО
    РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря

ИМЕЮЩИЕ
    МИНИМУМ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) = РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    втДаты.Дата
ИЗ
    втДаты КАК втДаты
ГДЕ
    втДаты.Отсрочка = &Отсрочка

Вперед

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

СГРУППИРОВАТЬ ПО
    РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря

ИМЕЮЩИЕ
    МАКСИМУМ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) = РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    втДаты.Дата
ИЗ
    втДаты КАК втДаты
ГДЕ
    втДаты.Отсрочка = &Отсрочка

Разбиение произвольного периода на равные подпериоды (не в запросе).
Для тяжелых алгоритмов иногда требуется разбивать произвольный период на n-ное количество равных подпериодов, чтобы обрабатывать их асинхронно. Вот пример небольшой функции, которая этим занимается. Результат работы представлен на скриншоте.

КоличествоПодпериодов = 10;

Подпериоды = Новый ТаблицаЗначений;
Подпериоды.Колонки.Добавить("НачалоПериода");
Подпериоды.Колонки.Добавить("КонецПериода");

Шаг  = Цел((КонецПериода - НачалоПериода)/КоличествоПодпериодов);
День = НачалоПериода;
Пока День < КонецДня(КонецПериода) Цикл
	мНачалоПериода = ?(День = НачалоПериода, День, День + 1);
		
	День = КонецДня(День + Шаг);
		
	НоваяСтрока = Подпериоды.Добавить();
	НоваяСтрока.НачалоПериода = мНачалоПериода; 
	НоваяСтрока.КонецПериода  = ?(День >= КонецДня(КонецПериода), КонецДня(КонецПериода), День);  
КонецЦикла;
has been added to your cart:
Оформление заказа