Добавление к датам рабочих дней в запросе

31.07.15

Разработка - Запросы

Нужно было написать запрос, добавляющий к датам рабочие дни.
Не нашёл оптимального решения, делюсь своим.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Демо обработка
.epf 7,35Kb
6
6 Скачать (1 SM) Купить за 1 850 руб.

Задача

Дана таблица "Исходные даты" с колонками:

"Дата отсчета";

"Прибавить рабочих дней".

Нужно получить таблицу "Результат" с колонками:

"Дата отсчета";

"Прибавить рабочих дней";

"Дата добавлены рабочие дни".

 

Запрос

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

 

Нужно пояснить применение конструкции:

"ДОБАВИТЬКДАТЕ(ИсходныеДаты.ДатаОтсчета, ДЕНЬ, ИсходныеДаты.ПрибавитьРабочихДней * 2 + 10)"

Назовём её "Глубина поиска".

Это конец периода, в котором мы ищем дату "Дата добавлены рабочие дни".

Поясню на примере:

"Дата отсчета" = 01.07.2015.

"Прибавить рабочих дней" = 5.

Искомая дата ("Дата добавлены рабочие дни") = 08.07.2015;

Глубина поиска в таком случае равна 21.07.2015.

Тоесть мы ищем дату 08.07.2015 и интервале между 01.07.2015 и 21.07.2015. И находим.

Теперь почему +10 и умножаем на 2 ?

Потому что максимальное количество выходных подряд в году равно примерно 10 и соотношение рабочих и выходных дней примерно 2 к 1.

Таким образом должно работать для всех случаев.


П.С.

Есть аналогичная публикация:

//infostart.ru/public/166349/

 

Отличие моей:

1) Сделано для БП 3.0;

2) Сделано для нескольких дат (задаётся в таблице, а не параметром);

3) Значительно более эффективный запрос.


рабочие дни производственный календарь

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

15500 руб.

02.09.2020    184776    1029    403    

968

Обновление 1С Запросы Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 Абонемент ($m)

Данный инструмент помогает анализировать доработанную конфигурацию после обновления на новый релиз и находить «битые» тексты запросов, в которых участвуют несуществующие в новом релизе метаданные.

2 стартмани

06.02.2025    2205    17    XilDen    26    

36

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

В статье приведена удобная возможность отладки исполняемого запроса динамического списка.

03.12.2024    5735    artemusII    11    

23

Запросы Программист Бесплатно (free)

Увидел cheatsheet по SQL и захотелось нарисовать подобное, но про запросы.

18.10.2024    13147    sergey279    18    

66

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    8222    XilDen    36    

90

СКД Механизмы типовых конфигураций Запросы Программист Платформа 1С v8.3 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    3194    PROSTO-1C    0    

23

Запросы Программист Запросы Бесплатно (free)

Отлаживая взаимодействие с базой данных, мы регулярно сталкиваемся с зависающими или подозрительно долго выполняющимися обращениями, негативно влияющими на производительность. О том, как в PostgreSQL выявить подозрительные запросы, основываясь на доступной о них информации, расскажем в статье.

16.08.2024    10806    user1840182    5    

29
Оставьте свое сообщение