Количество дней недели (понедельников/вторников/...) в заданном диапазоне одним запросом

03.03.16

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

При реализации периодического авто-заполнения маршрутных листов по графику (недельному) необходимо было просчитать стоимость всего периода, с условием выездов только по определенным дням. Заморачиваться с обходом результата не хотелось. Пришлось написать "Небольшой" запрос.

Скачать файл

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

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

С чего начнем. Наверное, с теории.

Первым делом у нас из входящих данных есть только НачалоПериода и КонецПериода. Соответственно нам нужно с чем-то соединять эти данные. В любой типовой конфигурации более рентабельно было бы использовать Регл.Календарь. Но не тут-то было. Конфа совсем не типовая... Поэтому запрос писался для "вакуума".


 * Благодаря товарищу ildarovich, нашлось более лаконичное решение, за что отдельное спасибо. С помощью разности дат с периодом "неделя":

ВЫБРАТЬ
    Дни.ДеньНедели,
    РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, -Дни.ДеньНедели), НЕДЕЛЯ)
, НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&КонецПериода, ДЕНЬ, 1 - Дни.ДеньНедели), НЕДЕЛЯ), ДЕНЬ) / 7 КАК КоличествоДней
ИЗ
    (ВЫБРАТЬ 1 КАК ДеньНедели ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5
    ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7) КАК Дни

В результате мы получили таблицу вида:
(параметры:
НачалоПериода = 01.03.2016; 
КонецПериода = 31.03.2016)

ДеньНедели КоличествоДней  
1 4
2 5
3 5
4 5
5 4
6 4
7 4


upd.  14.03.2016. Добавил обработку-пример

Количество дней недели понедельников вторников сред четвергов пятниц в заданном диапазоне одним запросом

См. также

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

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

15500 руб.

02.09.2020    185544    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    8301    XilDen    36    

90

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

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

20.08.2024    3252    PROSTO-1C    0    

23

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

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

16.08.2024    10879    user1840182    5    

29
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ildarovich 7959 03.03.16 20:43 Сейчас в теме
Тот же результат дает гораздо более простой запрос
ВЫБРАТЬ
	Дни.ДеньНедели,
	РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&НачалоПериода, НЕДЕЛЯ), НАЧАЛОПЕРИОДА(&КонецПериода, НЕДЕЛЯ), ДЕНЬ) / 7 + ВЫБОР
		КОГДА ДЕНЬНЕДЕЛИ(&НачалоПериода) <= Дни.ДеньНедели
			ТОГДА 1
		ИНАЧЕ 0
	КОНЕЦ + ВЫБОР
		КОГДА Дни.ДеньНедели <= ДЕНЬНЕДЕЛИ(&КонецПериода)
			ТОГДА 1
		ИНАЧЕ 0
	КОНЕЦ - 1 КАК КоличествоДней
ИЗ
	(ВЫБРАТЬ
		1 КАК ДеньНедели
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		2
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		3
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		4
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		5
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		6
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		7) КАК Дни
Показать

или еще короче
ВЫБРАТЬ
	Дни.ДеньНедели,
	РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, -Дни.ДеньНедели), НЕДЕЛЯ)
, НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&КонецПериода, ДЕНЬ, 1 - Дни.ДеньНедели), НЕДЕЛЯ), ДЕНЬ) / 7 КАК КоличествоДней
ИЗ
	(ВЫБРАТЬ 1 КАК ДеньНедели ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5
	ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7) КАК Дни
and03122008@gmail.com; pro96inf; sergey.novikov; user600603_v.soldatova; DoctorRoza; bforce; BigB; Alexander.Shvets; NeviD; ixijixi; qwed557; +11 Ответить
2. lrs 27 04.03.16 15:30 Сейчас в теме
В способностях ildarovich'а писать запросы мы не сомневаемся.
Но не стоило удалять первоначальный вариант, иначе теряется смысл твоих стараний. А так же нам теперь трудно оценить степень оптимизации, предложенную ildarovich'ем...
user600603_v.soldatova; igormiro; alest; dj_serega; +4 Ответить
3. Alexander.Shvets 223 04.03.16 15:41 Сейчас в теме
(2) lrs, Можете не сомневаться :Уровень оптимизации - бог =)

А старый запрос потерялся, я его засунул в спойлер, а инфостарт просто взбесился от конструкции div class="spoil". На предосмотре было все ок, а когда сохранил - он удалил все что было в спойлере + добавил пол страницы инфостарта в мою публикацию =))

Если в двух словах - мой метод - это левое соединение к таблицам дней периодов (две строки - Начало и конец) по условию >= <= и группировка результата, этот метод - расчета относительно дня недели. Изи. На многие вещи посмотрел по другому в принципе.
dj_serega; +1 Ответить
4. JohnGalt 58 21.11.16 16:16 Сейчас в теме
Можно также использовать РС "РегламентированныйПроизводственныйКалендарь"
5. densdons 94 12.12.19 19:36 Сейчас в теме
6. kvadrat2 38 13.01.23 14:34 Сейчас в теме
Поиск количества дней недели в заданном периоде, если надо найти только один день недели (например, &НомерИскомогоДня = 2 найдёт количество вторников):
Выбрать 
        ЦЕЛ(РАЗНОСТЬДАТ(&Нач, ДОБАВИТЬКДАТЕ(&Кон, ДЕНЬ, 1), ДЕНЬ) / 7) 
	+ Выбор Когда (ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&Нач, НЕДЕЛЯ), ДЕНЬ, &НомерИскомогоДня-1) МЕЖДУ &Нач И 
ДОБАВИТЬКДАТЕ(&Нач, ДЕНЬ, РАЗНОСТЬДАТ(&Нач, ДОБАВИТЬКДАТЕ(&Кон, ДЕНЬ, 1), ДЕНЬ) - ЦЕЛ(РАЗНОСТЬДАТ(&Нач, ДОБАВИТЬКДАТЕ(&Кон, ДЕНЬ, 1), ДЕНЬ) / 7) * 7 - 1)) Тогда 1 иначе 0 Конец КАК ИскомыхДней
7. kvadrat2 38 13.01.23 16:37 Сейчас в теме
(6) Вернее, так :)

 Выбрать
	ЦЕЛ(РАЗНОСТЬДАТ(&Нач, ДОБАВИТЬКДАТЕ(&Кон, ДЕНЬ, 1), ДЕНЬ) / 7) + ВЫБОР
		КОГДА   ДЕНЬНЕДЕЛИ(&Нач) <= ДЕНЬНЕДЕЛИ(ДОБАВИТЬКДАТЕ(&Нач, ДЕНЬ, РАЗНОСТЬДАТ(&Нач, ДОБАВИТЬКДАТЕ(&Кон, ДЕНЬ, 1), ДЕНЬ) - ЦЕЛ(РАЗНОСТЬДАТ(&Нач, ДОБАВИТЬКДАТЕ(&Кон, ДЕНЬ, 1), ДЕНЬ) / 7) * 7 - 1))
				И &НомерИскомогоДня >= ДЕНЬНЕДЕЛИ(&Нач)
				И &НомерИскомогоДня <= ДЕНЬНЕДЕЛИ(ДОБАВИТЬКДАТЕ(&Нач, ДЕНЬ, РАЗНОСТЬДАТ(&Нач, ДОБАВИТЬКДАТЕ(&Кон, ДЕНЬ, 1), ДЕНЬ) - ЦЕЛ(РАЗНОСТЬДАТ(&Нач, ДОБАВИТЬКДАТЕ(&Кон, ДЕНЬ, 1), ДЕНЬ) / 7) * 7 - 1))
				И РАЗНОСТЬДАТ(&Нач, ДОБАВИТЬКДАТЕ(&Кон, ДЕНЬ, 1), ДЕНЬ) - ЦЕЛ(РАЗНОСТЬДАТ(&Нач, ДОБАВИТЬКДАТЕ(&Кон, ДЕНЬ, 1), ДЕНЬ) / 7) * 7 - 1 > 0
				ИЛИ ДЕНЬНЕДЕЛИ(&Нач) > ДЕНЬНЕДЕЛИ(ДОБАВИТЬКДАТЕ(&Нач, ДЕНЬ, РАЗНОСТЬДАТ(&Нач, ДОБАВИТЬКДАТЕ(&Кон, ДЕНЬ, 1), ДЕНЬ) - ЦЕЛ(РАЗНОСТЬДАТ(&Нач, ДОБАВИТЬКДАТЕ(&Кон, ДЕНЬ, 1), ДЕНЬ) / 7) * 7 - 1))
				И 
				(&НомерИскомогоДня <= 7 И &НомерИскомогоДня >= ДЕНЬНЕДЕЛИ(&Нач)
				ИЛИ &НомерИскомогоДня >= 1 И &НомерИскомогоДня <= ДЕНЬНЕДЕЛИ(ДОБАВИТЬКДАТЕ(&Нач, ДЕНЬ, РАЗНОСТЬДАТ(&Нач, ДОБАВИТЬКДАТЕ(&Кон, ДЕНЬ, 1), ДЕНЬ) - ЦЕЛ(РАЗНОСТЬДАТ(&Нач, ДОБАВИТЬКДАТЕ(&Кон, ДЕНЬ, 1), ДЕНЬ) / 7) * 7 - 1)))
				И РАЗНОСТЬДАТ(&Нач, ДОБАВИТЬКДАТЕ(&Кон, ДЕНЬ, 1), ДЕНЬ) - ЦЕЛ(РАЗНОСТЬДАТ(&Нач, ДОБАВИТЬКДАТЕ(&Кон, ДЕНЬ, 1), ДЕНЬ) / 7) * 7 - 1 > 0
			ТОГДА 1
		ИНАЧЕ 0
	КОНЕЦ КАК ИскомыхДней
Показать
Оставьте свое сообщение