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

20.05.15

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

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

Скачать исходный код

Наименование Файл Версия Размер
ПрибавлениеБанковскихДней.epf
.epf 9,58Kb
0
.epf 9,58Kb Скачать

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

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

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

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

 

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

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

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

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

 

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

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

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

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

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

 

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

См. также

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

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

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

10000 руб.

02.09.2020    132015    721    390    

763

Как посмотреть итоговый запрос в отчете СКД

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

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

15.05.2024    3928    implecs_team    6    

38

Пропорциональное распределение в запросе с использованием АвтоНомерЗаписи()

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

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

11.04.2024    2693    andrey_sag    10    

32

Для чего используют конструкцию запроса "ГДЕ ЛОЖЬ" в СКД на примере конфигурации 1С:ERP

Запросы СКД Программист Стажер Платформа 1С v8.3 Запросы Система компоновки данных 1С:ERP Управление предприятием 2 Бесплатно (free)

В типовых конфигурациях разработчики компании 1С иногда используют в отчетах, построенных на СКД, такую конструкцию, как "ГДЕ ЛОЖЬ". Такая конструкция говорит о том, что данные в запросе не будут получены совсем. Для чего же нужен тогда запрос?

13.02.2024    6390    KawaNoNeko    23    

26

Набор-объект для СКД по тексту или запросу

Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2352    2    Yashazz    0    

32

Запрос 1С copilot

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

Пишем на человеческом языке, что нам надо, и получаем текст запроса на языке 1С. Используются большие языковые модели (LLM GPT) от OpenAI или Яндекс на выбор.

15.01.2024    7341    51    mkalimulin    32    

54

PrintWizard: поддержка представлений ЗУП в конструкторе

Инструментарий разработчика Запросы Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Одной из интересных задач, стоящих в процессе разработки, была поддержка механизма представлений в ЗУП. Но не просто возможность исполнения запросов с ними. Основная проблема была в том, чтобы с ними было удобно работать, а именно: создавать, модифицировать и отлаживать. Кратко о том, что в итоге получилось...

14.12.2023    2085    vandalsvq    7    

29

Консоль запросов УФ 8.3.2.24.12 (мод от Dr.Zombi)

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

Работа с запросом и СКД, Полная поддержка пакетных запросов, временных таблиц. Главное скорость отладки запроса и данных, а красота вторична.

1 стартмани

07.12.2023    3554    52    DrZombi    54    

21
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. dgolovanov 20.05.15 11:29 Сейчас в теме
Будет полезно сдающим экзамен Специалист по БП. Это задание попалось на сдаче. Я сделал, радостный, для обычных дней, а преподаватель обратил внимание, что речь идет о рабочих. Переделал с привязкой к календарю.
2. theshadowco 242 20.05.15 11:46 Сейчас в теме
(0) Я так понимаю вопрос оптимальности данного запроса не поднимался, т.е. главное результат?
3. ui69 41 20.05.15 15:58 Сейчас в теме
(2) theshadowco, давайте оптимизируем! ваши замечания?
4. CheBurator 3123 21.05.15 01:09 Сейчас в теме
блин... как-то на клюшках это все проще (и есть подозрение что быстрее.. на каких объемах?)
5. ildarovich 7885 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/ Расчет банковских (рабочих) дней (Оригинальный способ)
Еще насчет производительности нужно подумать.
Оставьте свое сообщение