Формирование списка дат в заданном диапазоне в тексте запроса

26.10.11

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

Позволяет в тексте запроса получить последовательность дат за указанный период времени от даты 1 до даты 2

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

Недостаток: Даты выдаются только с 2008 по 2019 годы, но на практике обычно этого достаточно. Если что, можно поправить текст запроса.

Вот работающий текст запроса:

 

ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), ГОД, ТГоды.Год - 1), МЕСЯЦ, ТМесяцы.Месяц - 1), ДЕНЬ, ТДни.День - 1) КАК ДАТА
ИЗ
    (ВЫБРАТЬ
        1 КАК День
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        2
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        3
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        4
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        5
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        6
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        7
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        8
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        9
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        10
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        11
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        12
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        13
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        14
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        15
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        16
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        17
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        18
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        19
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        20
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        21
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        22
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        23
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        24
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        25
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        26
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        27
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        28
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        29
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        30
    
    ОБЪЕДИНИТЬ
    
    ВЫБРАТЬ
        31) КАК ТДни
        ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            1 КАК Месяц
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            2
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            3
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            4
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            5
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            6
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            7
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            8
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            9
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            10
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            11
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            12) КАК ТМесяцы
        ПО (ИСТИНА)
        ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            2008 КАК Год
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            2009
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            2010
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            2011
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            2012
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            2013
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            2014
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            2015
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            2016
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            2017
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            2018
        
        ОБЪЕДИНИТЬ
        
        ВЫБРАТЬ
            2019) КАК ТГоды
        ПО (ИСТИНА)
ГДЕ
    ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), ГОД, ТГоды.Год - 1), МЕСЯЦ, ТМесяцы.Месяц - 1), ДЕНЬ, ТДни.День - 1) МЕЖДУ &Дата1 И &Дата2

УПОРЯДОЧИТЬ ПО
    ДАТА

См. также

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

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

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

13000 руб.

02.09.2020    119983    656    389    

701

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

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

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

13.02.2024    5622    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    6099    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    5287    user1923546    26    

43

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

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

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

11.10.2023    15964    skovpin_sa    14    

98
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. slawa 26 02.11.11 03:44 Сейчас в теме
Только нужно "ВЫБРАТЬ РАЗЛИЧНЫЕ ..."
иначе дублируются строки если в месяце меньше 31 дня
2. kgdrsu 02.11.11 15:51 Сейчас в теме
В типовой есть такой код:

		ТекстЗапросаДат = 
		"ВЫБРАТЬ
		|	ДАТАВРЕМЯ(" + Формат(Год(НачалоПериода), "ЧГ=4") + ", " + Месяц(НачалоПериода) + " , " + День(НачалоПериода) + ") КАК Дата,
		|	ДАТАВРЕМЯ(" + Формат(Год(НачалоПериода), "ЧГ=4") + ", " + Месяц(НачалоПериода) + " , 1) КАК Период
		|ПОМЕСТИТЬ ВТДаты 
		|	";           
		ДатаВОтчете = НачалоПериода + 86400;
		Пока ДатаВОтчете <= НачалоДня(КонецПериода) Цикл
			НомерДня    = День(ДатаВОтчете);
			НомерМесяца = Месяц(ДатаВОтчете);
			НомерГода   = Год(ДатаВОтчете);
			ТекстЗапросаДат = ТекстЗапросаДат + 
			"ОБЪЕДИНИТЬ ВСЕ
			|ВЫБРАТЬ
			|  ДАТАВРЕМЯ(" + Формат(НомерГода, "ЧГ=4")+ ", " + НомерМесяца + " ," + НомерДня + "),
			|  ДАТАВРЕМЯ(" + Формат(НомерГода, "ЧГ=4") + ", " + НомерМесяца + " , 1) КАК Период
			|	";
			ДатаВОтчете = ДатаВОтчете + 86400;
		КонецЦикла;
Показать


По-моему такой же код в результате получаем и есть переменные НачалоПериода и КонецПериода.
rucifer; nick_krsk; SirYozha; +3 Ответить
3. bulpi 215 03.11.11 11:56 Сейчас в теме
Уж если так сильно надо, можно подготовить таблицу значений с любой информацией, и получить из нее временную таблицу
4. 03.11.11 12:40 Сейчас в теме
(3) Да, но не везде можно использовать временные таблицы. Например, в построителе отчета нельзя.
(1) согласен.
(2) как вариант. Просто если диапазон дат большой, объем текста запроса получится слишком большим, мой метод гарантированно компактный.
5. ildarovich 7846 03.11.11 13:18 Сейчас в теме
Если кому-либо требуется более быстрое и компактное решение рассмотренной задачи, обратите внимание на статью Порождающий запрос. Начало пакетного запроса будет таким же как в статье, а окончание
ВЫБРАТЬ ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, Х) КАК Дата ИЗ Регистр16 ГДЕ Х < &Дней 

(3) В той же статье показано, что искусственную таблицу значений для передачи в запрос можно не готовить, гораздо проще и быстрее получить необходимую таблицу в самом запросе.
silberRus; sasha777666; alalsl; nick_krsk; zqzq; kgdrsu; +6 Ответить
7. Montirey 10.03.15 07:53 Сейчас в теме
(5) ildarovich,
использую статью Порождающий запрос получаем конечный результат в таком виде:

ВЫБРАТЬ
	0 КАК Х
ПОМЕСТИТЬ Регистр1

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	1
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Младшие.Х + 2 * Старшие.Х КАК Х
ПОМЕСТИТЬ Регистр2
ИЗ
	Регистр1 КАК Младшие,
	Регистр1 КАК Старшие
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Младшие.Х + 4 * Старшие.Х КАК Х
ПОМЕСТИТЬ Регистр4
ИЗ
	Регистр2 КАК Младшие,
	Регистр2 КАК Старшие
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Младшие.Х + 16 * Старшие.Х КАК Х
ПОМЕСТИТЬ Регистр8
ИЗ
	Регистр4 КАК Младшие,
	Регистр4 КАК Старшие
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Младшие.Х + 256 * Старшие.Х КАК Х
ПОМЕСТИТЬ Регистр16
ИЗ
	Регистр8 КАК Младшие,
	Регистр8 КАК Старшие
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода,  ДЕНЬ) + 1 КАК КоличествоДней
ПОМЕСТИТЬ ВТ_КоличествоДней
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ДОБАВИТЬКДАТЕ(&НачалоПериода,  ДЕНЬ, Регистр16.Х) КАК Дата
ИЗ
	Регистр16 КАК Регистр16,
	ВТ_КоличествоДней КАК ВТ_КоличествоДней
ГДЕ
	Регистр16.Х < ВТ_КоличествоДней.КоличествоДней

УПОРЯДОЧИТЬ ПО
	Дата
Показать
dabu-dabu; GutaGroup; stelsblg; awk; Student1C; alalsl; Spacer; +7 Ответить
6. 03.11.11 23:20 Сейчас в теме
Смотреть не хочу, надо тратить деньги.
Но по сути, если соединять таблицы друг с другом, то требуется несколько итераций, а это время.
т.е. несколько циклов пройдет, прежде чем получится нужная таблица. Думаю, это надуманное усложнение и потери времени для данной задачи.
8. makfromkz 35 03.09.23 09:14 Сейчас в теме
А я чуток подправил запрос, чтобы получить даты от года &Дата1, до года + 2
================
ВЫБРАТЬ
	ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), ГОД, ТГоды.Год - 1), МЕСЯЦ, ТМесяцы.Месяц - 1), ДЕНЬ, ТДни.День - 1) КАК ДАТА
ИЗ
	(ВЫБРАТЬ
		1 КАК День
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		2
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		3
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		4
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		5
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		6
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		7
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		8
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		9
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		10
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		11
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		12
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		13
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		14
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		15
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		16
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		17
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		18
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		19
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		20
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		21
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		22
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		23
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		24
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		25
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		26
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		27
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		28
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		29
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		30
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		31) КАК ТДни
		ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
			1 КАК Месяц
		
		ОБЪЕДИНИТЬ
		
		ВЫБРАТЬ
			2
		
		ОБЪЕДИНИТЬ
		
		ВЫБРАТЬ
			3
		
		ОБЪЕДИНИТЬ
		
		ВЫБРАТЬ
			4
		
		ОБЪЕДИНИТЬ
		
		ВЫБРАТЬ
			5
		
		ОБЪЕДИНИТЬ
		
		ВЫБРАТЬ
			6
		
		ОБЪЕДИНИТЬ
		
		ВЫБРАТЬ
			7
		
		ОБЪЕДИНИТЬ
		
		ВЫБРАТЬ
			8
		
		ОБЪЕДИНИТЬ
		
		ВЫБРАТЬ
			9
		
		ОБЪЕДИНИТЬ
		
		ВЫБРАТЬ
			10
		
		ОБЪЕДИНИТЬ
		
		ВЫБРАТЬ
			11
		
		ОБЪЕДИНИТЬ
		
		ВЫБРАТЬ
			12) КАК ТМесяцы
		ПО (ИСТИНА)
		ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
			ГОД(&Дата1) КАК Год
		
		ОБЪЕДИНИТЬ
		
		ВЫБРАТЬ
			ГОД(&Дата1)+1 КАК Год
		
		ОБЪЕДИНИТЬ
		
		ВЫБРАТЬ
			ГОД(&Дата1)+2 КАК Год
		
) КАК ТГоды
		ПО (ИСТИНА)
ГДЕ
	ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), ГОД, ТГоды.Год - 1), МЕСЯЦ, ТМесяцы.Месяц - 1), ДЕНЬ, ТДни.День - 1) МЕЖДУ &Дата1 И &Дата2

УПОРЯДОЧИТЬ ПО
	ДАТА
Показать
9. fixin 4252 03.09.23 13:19 Сейчас в теме
(8) на что ни пойдешь ради костылей в платформу.
Оставьте свое сообщение