Запрос определения даты наступления события в рабочих днях

13.01.20

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

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

Введение:

 Некоторые говорят о том чего не знают, другие знают, но не могут об этом сказать.

 Итак, имеется на моем балансе самопальная конфигурация со всякими отчетами и обработками, в которых, в зависимости от области ее действия необходимо рассчитать срок наступления определенного события в рабочих днях, такого как:

- Ожидаемый срок поставки товара по заказу, в зависимости от количества дней поставки

- Срок оплаты покупателем, в зависимости от отсрочки платежа

- Срок оплаты поставщику за товары, в зависимости от его отсрочки нам

Сделано там "красиво", после выполнения запроса идет перебор результата в цикле и там ижи с ними расчет от производственного календаря.

Решил сделать все в запросе в целях оптимизации.

Выкладываю для варианта Оплата поступления по отсрочке в рабочих днях.

Параметр Организация думаю понятен

На выходе таблица с поступлениями и датами их оплаты

Работает хорошо, быстро.

ВЫБРАТЬ
	ДоговорыКонтрагентов.Ссылка КАК Договор,
	Контрагенты.Ссылка КАК Контрагент,
	ДоговорыКонтрагентов.ДопустимоеЧислоДнейЗадолженности
ПОМЕСТИТЬ ВТ_Договора
ИЗ
	Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
		ПО ДоговорыКонтрагентов.Владелец = Контрагенты.Ссылка
ГДЕ
	ДоговорыКонтрагентов.ВидДоговора = ЗНАЧЕНИЕ(Перечисление.ВидыДоговоровКонтрагентов.СПоставщиком)
	И ДоговорыКонтрагентов.КонтролироватьЧислоДнейЗадолженности

ИНДЕКСИРОВАТЬ ПО
	Договор
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ПоступлениеТоваровУслуг.Контрагент.ГоловнойКонтрагент КАК ЮрЛицо,
	ПоступлениеТоваровУслуг.Контрагент КАК Контрагент,
	ПоступлениеТоваровУслуг.Ссылка КАК Поступление,
	ПоступлениеТоваровУслуг.СуммаДокумента КАК Сумма,
	НАЧАЛОПЕРИОДА(ПоступлениеТоваровУслуг.Дата, ДЕНЬ) КАК ДатаПоступления,
	ВТ_Договора.ДопустимоеЧислоДнейЗадолженности
ПОМЕСТИТЬ ВТ_Поступления
ИЗ
	Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Договора КАК ВТ_Договора
		ПО ПоступлениеТоваровУслуг.ДоговорКонтрагента = ВТ_Договора.Договор
ГДЕ
	ПоступлениеТоваровУслуг.Проведен
	И ПоступлениеТоваровУслуг.Организация = &Организация
	И ПоступлениеТоваровУслуг.СчетУчетаРасчетовСКонтрагентом В (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСПоставщиками), ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыПоАвансамВыданным))

ИНДЕКСИРОВАТЬ ПО
	ДатаПоступления
;

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

ИНДЕКСИРОВАТЬ ПО
	ДатаКалендаря
;

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

СГРУППИРОВАТЬ ПО
	ВТ_Календарь.ДатаКалендаря

ИНДЕКСИРОВАТЬ ПО
	ДатаКалендаря
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ВТ_Поступления.Контрагент,
	ВТ_Поступления.Поступление,
	ВТ_Поступления.Сумма,
	ВТ_Поступления.ДатаПоступления,
	ВТ_Поступления.ДопустимоеЧислоДнейЗадолженности,
	ВТ_КалендарьПоПорядку.ЧислоДаты КАК ЧислоДаты,
	ВТ_КалендарьПоПорядку.ДатаКалендаря,
	ВТ_КалендарьПоПорядку.ЧислоДаты + ЕСТЬNULL(ВТ_Поступления.ДопустимоеЧислоДнейЗадолженности, 0) КАК ЧислоДатыПлюс
ПОМЕСТИТЬ Вт_ПромИтог
ИЗ
	ВТ_Поступления КАК ВТ_Поступления
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_КалендарьПоПорядку КАК ВТ_КалендарьПоПорядку
		ПО ВТ_Поступления.ДатаПоступления = ВТ_КалендарьПоПорядку.ДатаКалендаря
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	Вт_ПромИтог.Контрагент,
	Вт_ПромИтог.Поступление,
	Вт_ПромИтог.Сумма,
	Вт_ПромИтог.ДатаПоступления КАК ДатаПоступления,
	Вт_ПромИтог.ДопустимоеЧислоДнейЗадолженности,
	ВТ_КалендарьПоПорядку.ДатаКалендаря КАК ДатаОплаты
ИЗ
	Вт_ПромИтог КАК Вт_ПромИтог
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_КалендарьПоПорядку КАК ВТ_КалендарьПоПорядку
		ПО Вт_ПромИтог.ЧислоДатыПлюс = ВТ_КалендарьПоПорядку.ЧислоДаты

УПОРЯДОЧИТЬ ПО
	ДатаПоступления

UPD

Столкнулся с моментом когда Поступление выпадает на выходной день оно не попадает в оплату. Для решения этой ситуации нужно перед таблицей т_Поступления разместить такую конструкцию:

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

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ВТ_Календарь.ДатаКалендаря,
	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВТ_КалендарьВесь.ДатаКалендаря) КАК ДатаКалендаря1
ПОМЕСТИТЬ КалендарьСЧисломВыходногоДня
ИЗ
	ВТ_КалендарьВесь КАК ВТ_Календарь
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Календарь КАК ВТ_КалендарьВесь
		ПО ВТ_Календарь.ДатаКалендаря >= ВТ_КалендарьВесь.ДатаКалендаря

СГРУППИРОВАТЬ ПО
	ВТ_Календарь.ДатаКалендаря
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ВТ_Календарь.ДатаКалендаря,
	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВТ_Календарь1.ДатаКалендаря) КАК ДатаКалендаря1
ПОМЕСТИТЬ ДатыПономеруДняКалендаря
ИЗ
	ВТ_Календарь КАК ВТ_Календарь
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Календарь КАК ВТ_Календарь1
		ПО ВТ_Календарь.ДатаКалендаря >= ВТ_Календарь1.ДатаКалендаря

СГРУППИРОВАТЬ ПО
	ВТ_Календарь.ДатаКалендаря
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ДатыПономеруДняКалендаря.ДатаКалендаря ДатаприходаРабочая,
	КалендарьСЧисломВыходногоДня.ДатаКалендаря КАК датаПриходаПолная
ИЗ
	КалендарьСЧисломВыходногоДня КАК КалендарьСЧисломВыходногоДня
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ДатыПономеруДняКалендаря КАК ДатыПономеруДняКалендаря
		ПО КалендарьСЧисломВыходногоДня.ДатаКалендаря1 = ДатыПономеруДняКалендаря.ДатаКалендаря1

данная конструкция определяет какая дата для выходного дня является рабочей, в данном случае это предыдущий рабочий день.

Далее с помощью соединения с таблицей ВТ_Поступления заменяем дату поступления на рабочую дату.

 

См. также

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

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

15500 руб.

02.09.2020    185530    1034    403    

970

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

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

2 стартмани

06.02.2025    2237    17    XilDen    26    

36

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

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

03.12.2024    5815    artemusII    11    

23

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

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

18.10.2024    13232    sergey279    18    

66

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

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

11.10.2024    8299    XilDen    36    

90

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

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

20.08.2024    3251    PROSTO-1C    0    

23

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

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

16.08.2024    10877    user1840182    5    

29
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Romanovna_999 16.12.19 17:59 Сейчас в теме
Пробовала как у вас написать, не работает( Не подскажите в чем ошибка?
Запрос = Новый Запрос();
   Запрос.УстановитьПараметр("МассивОбъектов", Документы.ЗаказПокупателя);
  Запрос.Текст =  "ВЫБРАТЬ
                  |	ЗаказПокупателя.Ссылка КАК Договор,
                  |	ЗаказПокупателя.КоличествоДнейВыполнения КАК КоличествоДней,
                  |	НАЧАЛОПЕРИОДА(ЗаказПокупателя.Старт, ДЕНЬ) КАК ДатаПоступления
                  |ПОМЕСТИТЬ ВТ_Договора
                  |ИЗ
                  |	Документ.ЗаказПокупателя КАК ЗаказПокупателя
                  |ГДЕ
                  |	ЗаказПокупателя.Ссылка В(&МассивОбъектов)
                  |
                  |ИНДЕКСИРОВАТЬ ПО
                  |	Договор,
                  |	ДатаПоступления
                  |;
                  |
                  |////////////////////////////////////////////////////////////­////////////////////
                  |ВЫБРАТЬ РАЗЛИЧНЫЕ
                  |	ДанныеПроизводственногоКалендаря.Дата КАК Дата
                  |ПОМЕСТИТЬ ВТ_Календарь
                  |ИЗ
                  |	РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря
                  |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Договора КАК ВТ_Договора
                  |		ПО ДанныеПроизводственногоКалендаря.Дата >= ВТ_Договора.ДатаПоступления
                  |ГДЕ
                  |	ДанныеПроизводственногоКалендаря.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
                  |
                  |ИНДЕКСИРОВАТЬ ПО
                  |	Дата
                  |;
                  |
                  |////////////////////////////////////////////////////////////­////////////////////
                  |ВЫБРАТЬ
                  |	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВТ_КалендарьПредыдущий.Дата) КАК ЧислоДаты,
                  |	ВТ_Календарь.Дата КАК Дата
                  |ПОМЕСТИТЬ ВТ_КалендарьПоПорядку
                  |ИЗ
                  |	ВТ_Календарь КАК ВТ_Календарь
                  |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Календарь КАК ВТ_КалендарьПредыдущий
                  |		ПО ВТ_Календарь.Дата > ВТ_КалендарьПредыдущий.Дата
                  |
                  |СГРУППИРОВАТЬ ПО
                  |	ВТ_Календарь.Дата
                  |
                  |ИНДЕКСИРОВАТЬ ПО
                  |	Дата
                  |;
                  |
                  |////////////////////////////////////////////////////////////­////////////////////
                  |ВЫБРАТЬ
                  |	ВТ_Договора.Договор КАК Договор,
                  |	ВТ_Договора.КоличествоДней КАК КоличествоДней,
                  |	ВТ_Договора.ДатаПоступления КАК ДатаПоступления,
                  |	ВТ_КалендарьПоПорядку.ЧислоДаты КАК ЧислоДаты,
                  |	ВТ_КалендарьПоПорядку.Дата КАК Дата,
                  |	ВТ_КалендарьПоПорядку.ЧислоДаты + ЕСТЬNULL(ВТ_Договора.КоличествоДней, 0) КАК ЧислоДатыПлюс
                  |ПОМЕСТИТЬ Вт_ПромИтог
                  |ИЗ
                  |	ВТ_Договора КАК ВТ_Договора
                  |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_КалендарьПоПорядку КАК ВТ_КалендарьПоПорядку
                  |		ПО ВТ_Договора.ДатаПоступления = ВТ_КалендарьПоПорядку.Дата
                  |;
                  |
                  |////////////////////////////////////////////////////////////­////////////////////
                  |ВЫБРАТЬ
                  |	Вт_ПромИтог.ДатаПоступления КАК Старт,
                  |	Вт_ПромИтог.КоличествоДней КАК КоличествоДней,
                  |	ВТ_КалендарьПоПорядку.Дата КАК Финиш
                  |ИЗ
                  |	Вт_ПромИтог КАК Вт_ПромИтог
                  |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_КалендарьПоПорядку КАК ВТ_КалендарьПоПорядку
                  |		ПО Вт_ПромИтог.ЧислоДатыПлюс = ВТ_КалендарьПоПорядку.ЧислоДаты
                  |
                  |УПОРЯДОЧИТЬ ПО
                  |	Вт_ПромИтог.ДатаПоступления";
Показать
2. maxvcb 68 17.12.19 13:48 Сейчас в теме
|ПОМЕСТИТЬ ВТ_КалендарьПоПорядку

>=
3. Romanovna_999 17.12.19 18:51 Сейчас в теме
Не помогло. Может ошиблась в другом месте?

.... 
   Выборка = Запрос.Выполнить().Выбрать();     

   Пока Выборка.Следующий() Цикл
	   Объект.Старт = Выборка.Старт;	 
		 Объект.КоличествоДнейВыполнения = Выборка.КоличествоДней;
		 Объект.Финиш = Выборка.Финиш; 
   КонецЦикла;
4. maxvcb 68 18.12.19 10:28 Сейчас в теме
возможно календарь не заполнен на следующий год
возможно параметры не верные в запрос передаются

запрос работает

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

ВЫБРАТЬ
	ЗаказПокупателя.Ссылка КАК Договор,
	ЗаказПокупателя.ДоговорКонтрагента.ДопустимоеЧислоДнейЗадолженности КАК КоличествоДней,
	НАЧАЛОПЕРИОДА(ЗаказПокупателя.Дата, ДЕНЬ) КАК ДатаПоступления
ПОМЕСТИТЬ ВТ_Договора
ИЗ
	Документ.ЗаказПокупателя КАК ЗаказПокупателя
ГДЕ
	ЗаказПокупателя.Ссылка В(&МассивОбъектов)

ИНДЕКСИРОВАТЬ ПО
	Договор,
	ДатаПоступления
;

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

ИНДЕКСИРОВАТЬ ПО
	Дата
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВТ_КалендарьПредыдущий.Дата) КАК ЧислоДаты,
	ВТ_Календарь.Дата КАК Дата
ПОМЕСТИТЬ ВТ_КалендарьПоПорядку
ИЗ
	ВТ_Календарь КАК ВТ_Календарь
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Календарь КАК ВТ_КалендарьПредыдущий
		ПО ВТ_Календарь.Дата >= ВТ_КалендарьПредыдущий.Дата

СГРУППИРОВАТЬ ПО
	ВТ_Календарь.Дата

ИНДЕКСИРОВАТЬ ПО
	Дата
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_Договора.Договор КАК Договор,
	ВТ_Договора.КоличествоДней КАК КоличествоДней,
	ВТ_Договора.ДатаПоступления КАК ДатаПоступления,
	ВТ_КалендарьПоПорядку.ЧислоДаты КАК ЧислоДаты,
	ВТ_КалендарьПоПорядку.Дата КАК Дата,
	ВТ_КалендарьПоПорядку.ЧислоДаты + ЕСТЬNULL(ВТ_Договора.КоличествоДней, 0) КАК ЧислоДатыПлюс
ПОМЕСТИТЬ Вт_ПромИтог
ИЗ
	ВТ_Договора КАК ВТ_Договора
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_КалендарьПоПорядку КАК ВТ_КалендарьПоПорядку
		ПО ВТ_Договора.ДатаПоступления = ВТ_КалендарьПоПорядку.Дата
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Вт_ПромИтог.ДатаПоступления КАК Старт,
	Вт_ПромИтог.КоличествоДней КАК КоличествоДней,
	ВТ_КалендарьПоПорядку.Дата КАК Финиш
ИЗ
	Вт_ПромИтог КАК Вт_ПромИтог
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_КалендарьПоПорядку КАК ВТ_КалендарьПоПорядку
		ПО Вт_ПромИтог.ЧислоДатыПлюс = ВТ_КалендарьПоПорядку.ЧислоДаты

УПОРЯДОЧИТЬ ПО
	Вт_ПромИтог.ДатаПоступления
Показать

(3)
Прикрепленные файлы:
5. egor_marshev 21.03.22 08:10 Сейчас в теме
Не совсем понятно каким будет результат елси
ВТ_КалендарьПоПорядку.ЧислоДаты + ЕСТЬNULL(ВТ_Поступления.ДопустимоеЧислоДнейЗадолженности, 0) КАК ЧислоДатыПлюс

ЧсилоДатыПлюс выпадет на выходной день, значит в следующей таблице соединение не произойдет вовсе.
6. maxvcb 68 21.03.22 12:07 Сейчас в теме
(5) там по запросом UPD написан, вы его не читали или я там что то не правильно написал?
7. egor_marshev 21.03.22 13:20 Сейчас в теме
(6)На сколько я понял это определение первой рабочей даты после праздника? т.е. начало отсчета? и если прибавить к это рабочей дате "ДопустимоеЧислоДнейЗадолженности" то может выпать на выходной/праздник, или я что то не так понял?
Оставьте свое сообщение