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

20.05.15

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

Обработка показывает, каким образом в запросе возможно реализовать прибавление банковских (рабочих) дней к дате, на основе данных календаря. Обработку запускать в конфигурации Бухгалтерия предприятия ред. 3.0, так как в запросе участвует регистр сведений ДанныеПроизводственногоКалендаря.

Скачать файл

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

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

Для примера в обработке выбираются документы РеализацияТоваровУслуг за указанный период, которые не помечены на удаление. Документы помещаем во временную таблицу ВТ_Документы:

|ВЫБРАТЬ
|	РеализацияТоваровУслуг.Ссылка,
|	РеализацияТоваровУслуг.Дата
|ПОМЕСТИТЬ ВТ_Документы
|ИЗ
|	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
|	РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоПериода И &ОкончаниеПериода
|	И НЕ РеализацияТоваровУслуг.ПометкаУдаления
|;

Производственный календарь так же помещаем во временную таблицу ВТ_ПроизводственныйКалендарь:

|ВЫБРАТЬ
|	НАЧАЛОПЕРИОДА(ДанныеПроизводственногоКалендаря.Дата, ДЕНЬ) КАК Дата_ПроизводственныйКалендарь,
|	ДанныеПроизводственногоКалендаря.ВидДня КАК ВидДня_ПроизводственныйКалендарь
|ПОМЕСТИТЬ ВТ_ПроизводственныйКалендарь
|ИЗ
|	РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря
|;

 

Далее во вложенном запросе ВЗ_ДатыБольшие мы соединением таблиц документов и календаря получаем таблицу с датами, которые больше даты документа:

|ВЫБРАТЬ
|	ВТ_ПроизводственныйКалендарь.Дата_ПроизводственныйКалендарь КАК ДатаРасчета,
|	НАЧАЛОПЕРИОДА(ВТ_Документы.Дата, ДЕНЬ) КАК ДатаДокумента,
|	ВТ_ПроизводственныйКалендарь.ВидДня_ПроизводственныйКалендарь КАК ВидДняРасчета,
|	ВТ_Документы.Ссылка КАК Документ
|ИЗ
|	ВТ_Документы КАК ВТ_Документы
|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ |ВТ_ПроизводственныйКалендарь КАК ВТ_ПроизводственныйКалендарь
|		ПО ВТ_Документы.Дата < ВТ_ПроизводственныйКалендарь.Дата_ПроизводственныйКалендарь

Затем этот вложенный запрос опять соединяем с календарем, чтобы получить все промежуточные даты между датой документа и датой расчета, тем самым мы узнаем и вид каждого дня в интервале дат. А КоличествоДней нам показывает 1, если день рабочий, и 0, если день не рабочий. Группируем. Получаем втоженный запрос ВЗ_КоличествоДней:

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

 

Промежуточный результат выглядит примерно так:

Колонки таблицы:

  • ДатаДокумента, Дата_РасчетПо - это период от даты документа, до каждой даты следующей за датой документа;
  • КоличествоДней - это количество рабочих дней в интервале.

Последний этап - это соединение таблиц ВЗ_Количество дней и ВТ_Документы при условии, что заданный параметр Отсрочка равен количеству рабочих дней, а если он равен, то и ДатаРасчета получается нужной нам датой срока:

Запрос.Текст=
"ВЫБРАТЬ
|	НАЧАЛОПЕРИОДА(ДанныеПроизводственногоКалендаря.Дата, ДЕНЬ) КАК Дата_ПроизводственныйКалендарь,
|	ДанныеПроизводственногоКалендаря.ВидДня КАК ВидДня_ПроизводственныйКалендарь
|ПОМЕСТИТЬ ВТ_ПроизводственныйКалендарь
|ИЗ
|	РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|	РеализацияТоваровУслуг.Ссылка,
|	РеализацияТоваровУслуг.Дата
|ПОМЕСТИТЬ ВТ_Документы
|ИЗ
|	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
|	РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоПериода И &ОкончаниеПериода
|	И НЕ РеализацияТоваровУслуг.ПометкаУдаления
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|	ВЗ_КоличествоДней.Документ КАК Документ,
|	МИНИМУМ(ВЗ_КоличествоДней.ДатаРасчета) КАК ДатаСрока
|ИЗ
|	ВТ_Документы КАК ВТ_Документы
|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
|			СУММА(ВЫБОР
|					КОГДА ВТ_ПроизводственныйКалендарь.ВидДня_ПроизводственныйКалендарь = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
|						ТОГДА 1
|					ИНАЧЕ ВЫБОР
|							КОГДА ВТ_ПроизводственныйКалендарь.ВидДня_ПроизводственныйКалендарь = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный)
|								ТОГДА 1
|							ИНАЧЕ 0
|						КОНЕЦ
|				КОНЕЦ) КАК КоличествоДней,
|			ВЗ_ДатыБольшие.ДатаРасчета КАК ДатаРасчета,
|			ВЗ_ДатыБольшие.ДатаДокумента КАК ДатаДокумента,
|			ВЗ_ДатыБольшие.ВидДняРасчета КАК ВидДняРасчета,
|			ВЗ_ДатыБольшие.Документ КАК Документ
|		ИЗ
|			ВТ_ПроизводственныйКалендарь КАК ВТ_ПроизводственныйКалендарь
|				ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
|					ВТ_ПроизводственныйКалендарь.Дата_ПроизводственныйКалендарь КАК ДатаРасчета,
|					НАЧАЛОПЕРИОДА(ВТ_Документы.Дата, ДЕНЬ) КАК ДатаДокумента,
|					ВТ_ПроизводственныйКалендарь.ВидДня_ПроизводственныйКалендарь КАК ВидДняРасчета,
|					ВТ_Документы.Ссылка КАК Документ
|				ИЗ
|					ВТ_Документы КАК ВТ_Документы
|						ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ПроизводственныйКалендарь КАК ВТ_ПроизводственныйКалендарь
|						ПО ВТ_Документы.Дата < ВТ_ПроизводственныйКалендарь.Дата_ПроизводственныйКалендарь) КАК ВЗ_ДатыБольшие
|				ПО ВТ_ПроизводственныйКалендарь.Дата_ПроизводственныйКалендарь > ВЗ_ДатыБольшие.ДатаДокумента
|					И ВТ_ПроизводственныйКалендарь.Дата_ПроизводственныйКалендарь <= ВЗ_ДатыБольшие.ДатаРасчета
|		
|		СГРУППИРОВАТЬ ПО
|			ВЗ_ДатыБольшие.ДатаДокумента,
|			ВЗ_ДатыБольшие.ВидДняРасчета,
|			ВЗ_ДатыБольшие.ДатаРасчета,
|			ВЗ_ДатыБольшие.Документ) КАК ВЗ_КоличествоДней
|		ПО ВТ_Документы.Ссылка = ВЗ_КоличествоДней.Документ
|ГДЕ
|	ВЗ_КоличествоДней.КоличествоДней = &Отсрочка
|
|СГРУППИРОВАТЬ ПО
|	ВЗ_КоличествоДней.Документ
|
|УПОРЯДОЧИТЬ ПО
|	Документ";

 

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

См. также

SALE! 15%

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

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    159690    876    399    

862

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

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

18.10.2024    9950    sergey279    18    

64

Запросы Программист Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

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

11.10.2024    5206    XilDen    36    

80

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

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

16.08.2024    7945    user1840182    5    

28

Математика и алгоритмы Запросы Программист Платформа 1С v8.3 Запросы Бесплатно (free)

Рассмотрим быстрый алгоритм поиска дублей с использованием hash функции по набору полей шапки и табличных частей.

08.07.2024    2406    ivanov660    9    

22

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    8730    implecs_team    6    

47

Запросы Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Часто поступают задачи по произвольному распределению общих сумм. После распределения иногда пропадают копейки. Суть решения добавить АвтоНомерЗаписи() в ВТ распределения, и далее используя функции МАКСИМУМ или МИНИМУМ можем положить разницу копеек в первую или последнюю строку знаменателя распределения.

11.04.2024    3396    andrey_sag    10    

36
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. dgolovanov 20.05.15 11:29 Сейчас в теме
Будет полезно сдающим экзамен Специалист по БП. Это задание попалось на сдаче. Я сделал, радостный, для обычных дней, а преподаватель обратил внимание, что речь идет о рабочих. Переделал с привязкой к календарю.
2. theshadowco 253 20.05.15 11:46 Сейчас в теме
(0) Я так понимаю вопрос оптимальности данного запроса не поднимался, т.е. главное результат?
3. ui69 41 20.05.15 15:58 Сейчас в теме
(2) theshadowco, давайте оптимизируем! ваши замечания?
4. CheBurator 2712 21.05.15 01:09 Сейчас в теме
блин... как-то на клюшках это все проще (и есть подозрение что быстрее.. на каких объемах?)
5. ildarovich 7930 21.05.15 16:52 Сейчас в теме
Для полноты картины не хватает других статей на ту же тему:
http://infostart.ru/public/99507/ Банковские дни запросом
http://infostart.ru/public/166349/ Добавить к дате рабочие дни в запросе
http://infostart.ru/public/320887/ Расчет рабочих дней в запросе
http://infostart.ru/public/338386/ Расчет банковских (рабочих) дней (Оригинальный способ)
Еще насчет производительности нужно подумать.
Оставьте свое сообщение