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

03.03.16

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

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

Скачать файлы

Наименование Файл Версия Размер
Количество дней недели в заданном диапазоне
.epf 7,81Kb
2
.epf 7,81Kb 2 Скачать

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

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


 * Благодаря товарищу 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. Добавил обработку-пример

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

См. также

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

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

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

13000 руб.

02.09.2020    119927    656    389    

701

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

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

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

13.02.2024    5620    KawaNoNeko    23    

23

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

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

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

1 стартмани

31.01.2024    1964    2    Yashazz    0    

29

Запрос 1С copilot

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

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

5 стартмани

15.01.2024    6091    29    mkalimulin    23    

48

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

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

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

14.12.2023    1714    vandalsvq    7    

28

Объектная модель запроса "Схема запроса" 2

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

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

06.12.2023    5285    user1923546    26    

43

Начните уже использовать хранилище запросов

HighLoad оптимизация Запросы

Очень немногие из тех, кто занимается поддержкой MS SQL, работают с хранилищем запросов. А ведь хранилище запросов – это очень удобный, мощный и, главное, бесплатный инструмент, позволяющий быстро найти и локализовать проблему производительности и потребления ресурсов запросами. В статье расскажем о том, как использовать хранилище запросов в MS SQL и какие плюсы и минусы у него есть.

11.10.2023    15958    skovpin_sa    14    

98
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. ildarovich 7846 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) КАК Дни
pavelpribytkin96; sergey.novikov; user600603_v.soldatova; DoctorRoza; bforce; BigB; Alexander.Shvets; NeviD; ixijixi; qwed557; +10 Ответить
2. lrs 27 04.03.16 15:30 Сейчас в теме
В способностях ildarovich'а писать запросы мы не сомневаемся.
Но не стоило удалять первоначальный вариант, иначе теряется смысл твоих стараний. А так же нам теперь трудно оценить степень оптимизации, предложенную ildarovich'ем...
user600603_v.soldatova; igormiro; alest; dj_serega; +4 Ответить
3. Alexander.Shvets 221 04.03.16 15:41 Сейчас в теме
(2) lrs, Можете не сомневаться :Уровень оптимизации - бог =)

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

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