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

18.10.12

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

Для разворачивания остатков/приходов/расходов на каждую дату месяца, в запросе, требуется как минимум список дат месяца по которому будут развернуты данные

Для разворачивания остатков/приходов/расходов на каждую дату месяца в запросе требуется как минимум список дат месяца. Порывшись в интернете я нашел советы использовать для этого: а) РегистрСведений.КурсыВалют (не айс решение) б)РегистрСведений.РегламентированныйПроизводственный1Календарь (уже лучше, если он у Вас есть в конфигурации) в)заполнить список в цикле и подтянуть его в запрос (тривиально довольно) Мое решение самому создать список дат в запросе: 

ВЫБРАТЬ
таб.Даты
ИЗ
(ВЫБРАТЬ
НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ) КАК Даты
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 1)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 2)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 3)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 4)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 5)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 6)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 7)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 8)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 9)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 10)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 11)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 12)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 13)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 14)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 15)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 16)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 17)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 18)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 19)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 20)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 21)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 22)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 23)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 24)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 25)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 26)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 27)
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ВЫБОР
КОГДА ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 28) > КОНЕЦПЕРИОДА(&дат1, МЕСЯЦ)
ТОГДА ДАТАВРЕМЯ(1, 1, 1)
ИНАЧЕ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 28)
КОНЕЦ
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ВЫБОР
КОГДА ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 29) > КОНЕЦПЕРИОДА(&дат1, МЕСЯЦ)
ТОГДА ДАТАВРЕМЯ(1, 1, 1)
ИНАЧЕ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 29)
КОНЕЦ
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ВЫБОР
КОГДА ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 30) > КОНЕЦПЕРИОДА(&дат1, МЕСЯЦ)
ТОГДА ДАТАВРЕМЯ(1, 1, 1)
ИНАЧЕ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 30)
КОНЕЦ) КАК таб
ГДЕ
таб.Даты <> ДАТАВРЕМЯ(1, 1, 1)

Можно было бы и по короче (выкинув средину), но большинству будет удобней просто скопировать в КонсольЗапросов код запроса. От сюда не далеко до списка за интервал дат месяца, за несколько месяцев. Предлагаю обсудить возможность более компактного построения запроса и другие способы получения списка дат в запросе. 

Яремчук Константин

См. также

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

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

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

10000 руб.

02.09.2020    124618    681    389    

732

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

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

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

11.04.2024    2057    andrey_sag    9    

25

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

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

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

13.02.2024    5971    KawaNoNeko    23    

25

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

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

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

1 стартмани

31.01.2024    2139    2    Yashazz    0    

30

Запрос 1С copilot

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

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

5 стартмани

15.01.2024    6598    31    mkalimulin    27    

51

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

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

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

14.12.2023    1873    vandalsvq    7    

29

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

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

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

06.12.2023    5597    user1923546    26    

46

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

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

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

11.10.2023    16555    skovpin_sa    14    

101
Комментарии
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Serj1C 483 18.10.12 14:40 Сейчас в теме
Запрос в (0) совсем длинный...
надо как-то так
ВЫБРАТЬ	0 КАК А ПОМЕСТИТЬ Ц
ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3
ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, ц1.А * 6 + ц2.А) КАК ДниМесяца
ИЗ
	Ц КАК ц1,
	Ц КАК ц2
ГДЕ
	ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, ц1.А * 6 + ц2.А) < КОНЕЦПЕРИОДА(&дат1, МЕСЯЦ)
Показать
user712426; dobryak@bk.ru; +2 Ответить
4. andrewks 1370 18.10.12 16:22 Сейчас в теме
жесть какая-то. или порождающий запрос по типу (1), или соединение с произв.календарём, или СКД.
6. nucha 97 18.10.12 18:50 Сейчас в теме
(4) andrewks, пустые слова как у tango. Произвольный календарь в запросе? ну, ну...
9. andrewks 1370 19.10.12 08:07 Сейчас в теме
(6) nucha, не произвольный, а производственный. учите матчасть
20. rhtr 90 09.03.21 19:18 Сейчас в теме
2. wunderland 201 18.10.12 15:31 Сейчас в теме
Тоже вариант, я как-то с єтим парился, но остановился на "заполнить в цикле"
3. tango 540 18.10.12 15:49 Сейчас в теме
вредная публикация
изучайте СКД, глубоко не надо
5. nucha 97 18.10.12 18:46 Сейчас в теме
(3) tango, без примера это пустые слова. Типа: я знаю как, но вам не скажу. Даже для СКД нет примера. А просто в запросе слабо?
7. Serj1C 483 18.10.12 19:11 Сейчас в теме
поддерживаю мысль (3), что публикация вредная и вообще не публикация..
8. nucha 97 18.10.12 19:29 Сейчас в теме
1.Ваш код для любого полного месяца в 31 день будет точно таким же длинным т.к. в месяце более 6 дней.
2.В данном случае применение виртуальной таблицы только увеличило время выполнения кода с 0,005433 до 0,005635
и ни чего более.
Публикация создана как пример решения данной задачи, а пока один флуд..
10. andrewks 1370 19.10.12 08:12 Сейчас в теме
(8)
Ваш код для любого полного месяца в 31 день будет точно таким же длинным т.к. в месяце более 6 дней


бред.

В данном случае применение виртуальной таблицы только увеличило время выполнения кода с 0,005433 до 0,005635
и ни чего более


о да, две десятитысячных - это очень крутое достижение. особенно для 1С
11. andrewks 1370 19.10.12 08:15 Сейчас в теме
вот пример решения на основе порождающего запроса:

select
 0 as num
into digits
union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9

;

select
 dateadd(&LeftBound,day,digits1.num+10*digits2.num+100*digits3.num+1000*digits4.num) as Дата
from
 digits as digits1
,digits as digits2
,digits as digits3
,digits as digits4
where (dateadd(&LeftBound,day,digits1.num+10*digits2.num+100*digits3.num+1000*digits4.num)<=&RightBound)
order by Дата

Показать


в LeftBound и RightBound задаётся диапазон дат, в результате получаем все даты из заданного диапазона.
Kazaams; ip0593; jamirza; Захаров_Николай; veretennikoff; rhtr; mtv:); +7 Ответить
12. nucha 97 19.10.12 21:39 Сейчас в теме
(11) andrewks, тоже самое, что у меня, только другими словами и в худшем, чем у меня варианте.
Читайте внимательно: пример дан для случаев когда нет произв.календаря. В месяце больше 6 дней, что тут бредового и у кого бред? Суть не только в скорости работы запроса, а в неумелом применении виртуальной таблицы. Пример в (11) в файловом варианте бред.
14. andrewks 1370 22.10.12 08:17 Сейчас в теме
(12) nucha, в моём примере вообще нет виртуальных таблиц. и в файловом варианте всё замечательно работает. может, стоит теорию маленько подучить, да проверить на практике, прежде, чем вступать в дискуссии?

в худшем, чем у меня варианте

ну, это я вообще оставлю без комментариев. всяк кулик имеет право хвалить своё болото.
13. petrov_al 10 20.10.12 20:32 Сейчас в теме
Вот запрос, идея взята у Гилева:
ВЫБРАТЬ
1 КАК цифра
ПОМЕСТИТЬ вт

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
2

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
3

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
4

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
5

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
6

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
7

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
8
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
(вт.цифра - 1) * 8 * 8 * 8 + (вт1.цифра - 1) * 8 * 8 + (вт2.цифра - 1) * 8 + вт3.цифра КАК цифра,
ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(2010, 1, 1), ДЕНЬ, (вт.цифра - 1) * 8 * 8 * 8 + (вт1.цифра - 1) * 8 * 8 + (вт2.цифра - 1) * 8 + вт3.цифра - 1) КАК даты
ИЗ
вт КАК вт,
вт КАК вт1,
вт КАК вт2,
вт КАК вт3
ГДЕ
ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(2010, 1, 1), ДЕНЬ, (вт.цифра - 1) * 8 * 8 * 8 + (вт1.цифра - 1) * 8 * 8 + (вт2.цифра - 1) * 8 + вт3.цифра - 1) < ДАТАВРЕМЯ(2011, 1, 1)
15. andrewks 1370 22.10.12 08:18 Сейчас в теме
(13) petrov_al, восьмеричная система? прикольно
16. catena 110 24.10.12 08:55 Сейчас в теме
Как минимум можно заменить хвост запроса:
Код
   ВЫБРАТЬ
      ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 28)
   ОБЪЕДИНИТЬ
   ВЫБРАТЬ
      ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 29)
   ОБЪЕДИНИТЬ
   ВЫБРАТЬ
      ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&дат1, МЕСЯЦ), ДЕНЬ, 30)) КАК таб
ГДЕ
   таб.Даты между НачалоПериода(&дат1,Месяц) и КонецПериода(&дат1,Месяц)
Показать полностью


И короче и быстрее будет.
19. nucha 97 24.10.12 18:54 Сейчас в теме
(16) catena, так действительно красивее и короче и быстрее (пардон за рифму).
(17) тема не страшнее Вашего аватара и не хуже Ваших публикаций.
17. absolutblohin 24.10.12 17:24 Сейчас в теме
Самое ужасное что со мной произошло на этой неделе - то что я увидел эту публикацию. Даже вчерашнее посещение стоматолога прошло более приятно.
18. shuhorov 24.10.12 18:17 Сейчас в теме
(17) absolutblohin,
до конца недели еще оого сколько времени
Оставьте свое сообщение