[v8] Разбиение произвольного периода на интервалы (в запросе)
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
Аналог типовой функции РазложитьНаПериоды(ДатаНачала = '00010101', ДатаОкончания = '00010101'), только релизовано на языке запросов. Не удалось найти готового решения, поэтому выкладываю запрос по разбиению периода на помесячные интервалы тут.
Обновление от 22/08/2012 - сокращен текст запроса, спасибо Mu_meson //infostart.ru/profile/48163/
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ПроизводственныйКалендарь.ДатаКалендаря,
ГОД(ПроизводственныйКалендарь.ДатаКалендаря) * 100 + МЕСЯЦ(ПроизводственныйКалендарь.ДатаКалендаря) КАК НомерМесяца
ПОМЕСТИТЬ ВТ_ДатыКалендаря
ИЗ
РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК ПроизводственныйКалендарь
ГДЕ
ПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &ПериодДействияНачало И &ПериодДействияКонец
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
МИНИМУМ(ВТ_ДатыКалендаря.ДатаКалендаря) КАК ДатаНачала,
МАКСИМУМ(ВТ_ДатыКалендаря.ДатаКалендаря) КАК ДатаОкончания
ИЗ
ВТ_ДатыКалендаря КАК ВТ_ДатыКалендаря
СГРУППИРОВАТЬ ПО
ВТ_ДатыКалендаря.НомерМесяца
Вступайте в нашу телеграмм-группу Инфостарт
См. также
Инструментарий разработчика Роли и права Запросы СКД Разработчик Руководитель проекта 1С:Предприятие 8 Платные (руб)
Инструменты для разработчиков 1С 8.3 и 8.5: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.
16500 руб.
02.09.2020 285862 1608 423
Инструментарий разработчика Запросы Разработчик 1С 8.3 1С:Бухгалтерия 3.0 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)
Структура запроса. Обработка визуально показывает, из какого количества подзапросов состоит запрос.
2 стартмани
06.07.2026 4975 65 XSlava 20
Запросы Разработчик 1С 8.3 Россия Бесплатно (free)
Визуальный «Конструктор запроса» 1С, встроенный прямо в VS Code, — аналог конструктора из Конфигуратора и EDT, но без запуска платформы. Расширение читает конфигурацию, выгруженную в файлы, позволяет собрать запрос мышью и генерирует корректный текст на языке запросов 1С (SDBL). Открывает уже существующий текст запроса из кода для правки и — что особенно ценно — сохраняет комментарии при цикле «открыть - править - сохранить». Подходит тем, кто пишет код 1С в VS Code, держит под рукой множество проектов и не хочет ради одного запроса запускать тяжёлый Конфигуратор или EDT.
26.06.2026 10705 Alex_YAM 7
Нейросети Инструментарий разработчика Запросы Разработчик 1С:Предприятие 8 Абонемент ($m)
Консоль запросов 1.0: добавлен ИИ-помощник (запрос в DeepSeek), который помогает быстрее получать каркас Запроса 1С Сформулируйте простое описание; нажмите кнопку – получите результат прямо в консоли. Где дальше его можно дорабатывать и тестировать. 28.5.2026 Добавил "Консоль запросов 2.0" (запрос в DeepSeek + Claude) 4.10.2026 Обновил "Консоль запросов 2.0"
3 стартмани
20.05.2026 9603 46 German4739 72
WEB-интеграция Запросы Разработчик 1С 8.3 Абонемент ($m)
Post1C - это внешняя обработка, которая превращает 1С в полноценный инструмент для тестирования REST API. Всё управление сосредоточено в одном окне: настройка запроса, выполнение, просмотр ответа и генерация кода - без переключения между формами. Аналог Postman, но работающий в привычной среде 1С.
1 стартмани
02.04.2026 4676 105 priem_nv 27
Запросы Механизмы типовых конфигураций Разработчик 1С:Предприятие 8 1С:Управление торговлей 11 Россия Бесплатно (free)
Предлагается обзор работы с объектной моделью запроса по схемам запросов типовым функционалом УТ 11.5.
09.10.2025 13431 aximo 18
Инструментарий разработчика Запросы Разработчик 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)
QueryConsole1C — расширение, включающее консоль запросов с поддержкой исполняемых представлений — аналогов виртуальных таблиц, основанных на методах программного интерфейса ЗУП. Оно позволяет выполнять запросы с учётом встроенной бизнес-логики, отлаживать алгоритмы получения данных и автоматически генерировать код на встроенном языке 1С.
1 стартмани
16.05.2025 13692 168 zup_dev 32
Инструментарий разработчика Запросы Разработчик 1С:Предприятие 8 1С:ERP Управление предприятием 2 Абонемент ($m)
В данной публикации рассказывается о решении, которое позволяет находить сразу все ошибки в тексте запроса за раз, а не только самую первую.
2 стартмани
05.03.2025 7744 25 XilDen 12
Предложенное вами решение без должного основания использует зависимости:
1) от наличия в составе конфигурации такого объекта как регистр сведений "РегламентированныйПроизводственныйКалендарь";
2) от его правильной заполненности на нужный период.
Если первая зависимость легко проверяется (при попытке использовать этот метод в конфигурации без календаря, вы просто получите ошибку), то вторая зависимость неприятнее. При частичной заполненности календаря вы получите ошибку в отчете, которую еще потребуется поискать.
Кроме того, используемый принцип совершенно зря перебирает все даты периода, когда из месяца требуется только одна запись. То есть работает в 30 раз медленнее возможного.
Вопрос, наверное не такой уж важный, но тут много начинающих, которые используют готовый код, никак его не осмысливая. В результате чего недостаточно проработанные, сделанные на скорую руку решения множатся. Авторы публикаций могли бы этому препятствовать, а вы, кажется, способствуете.
Кстати, если уж настаиваете на использовании календаря, могу предложить вот такой вариант из одного запроса:
ВЫБРАТЬ
МИНИМУМ(Календарь.ДатаКалендаря) КАК ДатаНачала,
МАКСИМУМ(Календарь.ДатаКалендаря) КАК ДатаОкончания
ИЗ
РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК Календарь
ГДЕ
Календарь.ДатаКалендаря МЕЖДУ &ПериодДействияНачало И &ПериодДействияКонец
СГРУППИРОВАТЬ ПО
РАЗНОСТЬДАТ(&ПериодДействияНачало, Календарь.ДатаКалендаря, МЕСЯЦ) ПоказатьА вообще в свете вопроса (15) можно было бы и конкурс объявить на решение этой задачи без календаря.
З.Ы. А регистр и не надо заполнять, он заполняется автоматически при обновлении ИБ.
ВЫБРАТЬ
ПроизводственныйКалендарь.ДатаКалендаря,
ГОД(ПроизводственныйКалендарь.ДатаКалендаря) * 100 + МЕСЯЦ(ПроизводственныйКалендарь.ДатаКалендаря) КАК НомерМесяца
ПОМЕСТИТЬ ВТ_ДатыКалендаря
ИЗ
РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК ПроизводственныйКалендарь
ГДЕ
ПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &ПериодДействияНачало И &ПериодДействияКонец
;
ВЫБРАТЬ
МИНИМУМ(ВТ_ДатыКалендаря.ДатаКалендаря) КАК ДатаНачала,
МАКСИМУМ(ВТ_ДатыКалендаря.ДатаКалендаря) КАК ДатаОкончания
ИЗ
ВТ_ДатыКалендаря КАК ВТ_ДатыКалендаря
СГРУППИРОВАТЬ ПО
ВТ_ДатыКалендаря.НомерМесяца
Интересует вопрос:
необходимо сгрупирровать по периодам (месяцам) данные по выборке документов, что бы в результате по куждому месяцу увидеть суммы.
И объеденить этот результат с еще одной таблицей регистра накопления с переодичностью месяц.
месяц сумма по документам
объеденить
месяц сумма по регистру
Вообще задачу разбиения на месяцы (и не только) легко можно решить и без регистра одним запросом (менее эффективно) или пакетным запросом (более эффективно). Здесь уже есть такие публикации.
Предложенное вами решение без должного основания использует зависимости:
1) от наличия в составе конфигурации такого объекта как регистр сведений "РегламентированныйПроизводственныйКалендарь";
2) от его правильной заполненности на нужный период.
Если первая зависимость легко проверяется (при попытке использовать этот метод в конфигурации без календаря, вы просто получите ошибку), то вторая зависимость неприятнее. При частичной заполненности календаря вы получите ошибку в отчете, которую еще потребуется поискать.
Кроме того, используемый принцип совершенно зря перебирает все даты периода, когда из месяца требуется только одна запись. То есть работает в 30 раз медленнее возможного.
Вопрос, наверное не такой уж важный, но тут много начинающих, которые используют готовый код, никак его не осмысливая. В результате чего недостаточно проработанные, сделанные на скорую руку решения множатся. Авторы публикаций могли бы этому препятствовать, а вы, кажется, способствуете.
Кстати, если уж настаиваете на использовании календаря, могу предложить вот такой вариант из одного запроса:
ВЫБРАТЬ
МИНИМУМ(Календарь.ДатаКалендаря) КАК ДатаНачала,
МАКСИМУМ(Календарь.ДатаКалендаря) КАК ДатаОкончания
ИЗ
РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК Календарь
ГДЕ
Календарь.ДатаКалендаря МЕЖДУ &ПериодДействияНачало И &ПериодДействияКонец
СГРУППИРОВАТЬ ПО
РАЗНОСТЬДАТ(&ПериодДействияНачало, Календарь.ДатаКалендаря, МЕСЯЦ) ПоказатьА вообще в свете вопроса (15) можно было бы и конкурс объявить на решение этой задачи без календаря.
разбиения произвольного периода на интервалы в запросе
без использования регламентированного производственного календаря.
ВЫБРАТЬ
0 КАК Поле
ПОМЕСТИТЬ Числа
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
2
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
3
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
Числа1.Поле + 4 * Числа2.Поле + 16 * Числа3.Поле + 1 КАК Поле
ПОМЕСТИТЬ ВТ_64
ИЗ
Числа КАК Числа1,
Числа КАК Числа2,
Числа КАК Числа3
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
ВЫБОР
КОГДА КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаНачала, МЕСЯЦ, ВТ_64.Поле - 1), МЕСЯЦ) = КОНЕЦПЕРИОДА(&ДатаНачала, МЕСЯЦ)
ТОГДА &ДатаНачала
КОГДА КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаНачала, МЕСЯЦ, ВТ_64.Поле - 1), МЕСЯЦ) >= КОНЕЦПЕРИОДА(&ДатаОкончания, МЕСЯЦ)
ТОГДА НАЧАЛОПЕРИОДА(&ДатаОкончания, МЕСЯЦ)
ИНАЧЕ НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаНачала, МЕСЯЦ, ВТ_64.Поле - 1), МЕСЯЦ)
КОНЕЦ КАК НачПериода,
ВЫБОР
КОГДА КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаНачала, МЕСЯЦ, ВТ_64.Поле - 1), МЕСЯЦ) >= КОНЕЦПЕРИОДА(&ДатаОкончания, МЕСЯЦ)
ТОГДА &ДатаОкончания
ИНАЧЕ КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаНачала, МЕСЯЦ, ВТ_64.Поле - 1), МЕСЯЦ)
КОНЕЦ КАК КонПериода
ИЗ
ВТ_64 КАК ВТ_64
СГРУППИРОВАТЬ ПО
ВЫБОР
КОГДА КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаНачала, МЕСЯЦ, ВТ_64.Поле - 1), МЕСЯЦ) >= КОНЕЦПЕРИОДА(&ДатаОкончания, МЕСЯЦ)
ТОГДА &ДатаОкончания
ИНАЧЕ КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаНачала, МЕСЯЦ, ВТ_64.Поле - 1), МЕСЯЦ)
КОНЕЦ,
ВЫБОР
КОГДА КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаНачала, МЕСЯЦ, ВТ_64.Поле - 1), МЕСЯЦ) = КОНЕЦПЕРИОДА(&ДатаНачала, МЕСЯЦ)
ТОГДА &ДатаНачала
КОГДА КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаНачала, МЕСЯЦ, ВТ_64.Поле - 1), МЕСЯЦ) >= КОНЕЦПЕРИОДА(&ДатаОкончания, МЕСЯЦ)
ТОГДА НАЧАЛОПЕРИОДА(&ДатаОкончания, МЕСЯЦ)
ИНАЧЕ НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаНачала, МЕСЯЦ, ВТ_64.Поле - 1), МЕСЯЦ)
КОНЕЦ
ПоказатьВЫБРАТЬ
0 КАК Поле
ПОМЕСТИТЬ Числа
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
2
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
3
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаНачала, МЕСЯЦ, Числа1.Поле + 4 * Числа2.Поле + 16 * Числа3.Поле),Месяц) КАК Поле
ПОМЕСТИТЬ ВТ_64
ИЗ
Числа КАК Числа1,
Числа КАК Числа2,
Числа КАК Числа3
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
ВЫБОР
КОГДА КОНЕЦПЕРИОДА(ВТ_64.Поле , МЕСЯЦ) = КОНЕЦПЕРИОДА(&ДатаНачала, МЕСЯЦ)
ТОГДА &ДатаНачала
КОГДА КОНЕЦПЕРИОДА(ВТ_64.Поле , МЕСЯЦ) >= КОНЕЦПЕРИОДА(&ДатаОкончания, МЕСЯЦ)
ТОГДА НАЧАЛОПЕРИОДА(&ДатаОкончания, МЕСЯЦ)
ИНАЧЕ ВТ_64.Поле
КОНЕЦ КАК НачПериода,
ВЫБОР
КОГДА КОНЕЦПЕРИОДА(ВТ_64.Поле, МЕСЯЦ)>= КОНЕЦПЕРИОДА(&ДатаОкончания, МЕСЯЦ)
ТОГДА &ДатаОкончания
ИНАЧЕ КОНЕЦПЕРИОДА(ВТ_64.Поле , МЕСЯЦ)
КОНЕЦ КАК КонПериода
ИЗ
ВТ_64 КАК ВТ_64
упорядочить по НачПериода ПоказатьВЫБРАТЬ РАЗЛИЧНЫЕ
ВЫБОР
КОГДА ВТ_64.Поле < &ДатаНачала
ТОГДА &ДатаНачала
ИНАЧЕ ВТ_64.Поле
КОНЕЦ КАК НачПериода,
ВЫБОР
КОГДА ВТ_64.КонПериода > &ДатаОкончания
ТОГДА &ДатаОкончания
ИНАЧЕ ВТ_64.КонПериода
КОНЕЦ КАК КонПериода
ИЗ
(Выбрать ВТ_64.Поле, КОНЕЦПЕРИОДА(ВТ_64.Поле , МЕСЯЦ) как КонПериода ИЗ ВТ_64 где ВТ_64.Поле<&ДатаОкончания)КАК ВТ_64
упорядочить по НачПериода ПоказатьЕсли только без группировки, но с отбором
"ВЫБРАТЬ
| 0 КАК Поле
|ПОМЕСТИТЬ Числа
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| 1
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| 2
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| 3
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| Числа1.Поле + 4 * Числа2.Поле + 16 * Числа3.Поле + 1 КАК Поле
|ПОМЕСТИТЬ ВТ_64
|ИЗ
| Числа КАК Числа1,
| Числа КАК Числа2,
| Числа КАК Числа3
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ВЫБОР
| КОГДА КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаНачала, МЕСЯЦ, ВТ_64.Поле - 1), МЕСЯЦ) = КОНЕЦПЕРИОДА(&ДатаНачала, МЕСЯЦ)
| ТОГДА &ДатаНачала
| КОГДА КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаНачала, МЕСЯЦ, ВТ_64.Поле - 1), МЕСЯЦ) >= КОНЕЦПЕРИОДА(&ДатаОкончания, МЕСЯЦ)
| ТОГДА НАЧАЛОПЕРИОДА(&ДатаОкончания, МЕСЯЦ)
| ИНАЧЕ НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаНачала, МЕСЯЦ, ВТ_64.Поле - 1), МЕСЯЦ)
| КОНЕЦ КАК НачПериода,
| ВЫБОР
| КОГДА КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаНачала, МЕСЯЦ, ВТ_64.Поле - 1), МЕСЯЦ) >= КОНЕЦПЕРИОДА(&ДатаОкончания, МЕСЯЦ)
| ТОГДА &ДатаОкончания
| ИНАЧЕ КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаНачала, МЕСЯЦ, ВТ_64.Поле - 1), МЕСЯЦ)
| КОНЕЦ КАК КонПериода
|ИЗ
| ВТ_64 КАК ВТ_64
|ГДЕ
| ВТ_64.Поле < РАЗНОСТЬДАТ(&ДатаНачала, &ДатаОкончания, МЕСЯЦ) + 2"
Показатьи с другим алгоритмом заполнения таблицы чисел (кому как нравится, я если честно предыдущий хреново понимаю)
ВЫБРАТЬ
0 КАК Поле
ПОМЕСТИТЬ Цифры
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
2
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
3
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
4
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
5
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
6
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
7
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
8
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
9
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
ВЫБОР
КОГДА НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаНачала, МЕСЯЦ, Числа1.Поле + 10 * Числа2.Поле), МЕСЯЦ) = НАЧАЛОПЕРИОДА(&ДатаНачала, МЕСЯЦ)
ТОГДА &ДатаНачала
КОГДА НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаНачала, МЕСЯЦ, Числа1.Поле + 10 * Числа2.Поле), МЕСЯЦ) < НАЧАЛОПЕРИОДА(&ДатаОкончания, МЕСЯЦ)
ТОГДА НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаНачала, МЕСЯЦ, Числа1.Поле + 10 * Числа2.Поле), МЕСЯЦ)
ИНАЧЕ НАЧАЛОПЕРИОДА(&ДатаОкончания, МЕСЯЦ)
КОНЕЦ КАК Поле,
ВЫБОР
КОГДА КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаНачала, МЕСЯЦ, Числа1.Поле + 10 * Числа2.Поле), МЕСЯЦ) >= КОНЕЦПЕРИОДА(&ДатаОкончания, МЕСЯЦ)
ТОГДА &ДатаОкончания
ИНАЧЕ КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаНачала, МЕСЯЦ, Числа1.Поле + 10 * Числа2.Поле), МЕСЯЦ)
КОНЕЦ КАК Поле1
ИЗ
Цифры КАК Числа1,
Цифры КАК Числа2
ГДЕ
КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаНачала, МЕСЯЦ, Числа1.Поле + 10 * Числа2.Поле), МЕСЯЦ) <= КОНЕЦПЕРИОДА(&ДатаОкончания, МЕСЯЦ)
УПОРЯДОЧИТЬ ПО
Поле
ПоказатьВыражение
ТОГДА НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&ДатаНачала, МЕСЯЦ, Числа1.Поле + 10 * Числа2.Поле), МЕСЯЦ)
ВЫБРАТЬ
0 КАК Цифра
ПОМЕСТИТЬ Цифры
ОБЪЕДИНИТЬ
ВЫБРАТЬ
1
ОБЪЕДИНИТЬ
ВЫБРАТЬ
2
ОБЪЕДИНИТЬ
ВЫБРАТЬ
3
ОБЪЕДИНИТЬ
ВЫБРАТЬ
4
ОБЪЕДИНИТЬ
ВЫБРАТЬ
5
ОБЪЕДИНИТЬ
ВЫБРАТЬ
6
ОБЪЕДИНИТЬ
ВЫБРАТЬ
7
ОБЪЕДИНИТЬ
ВЫБРАТЬ
8
ОБЪЕДИНИТЬ
ВЫБРАТЬ
9
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ДниПериода.ДеньПериода КАК ДеньПериода,
ДниПериода.НачалоСтандартногоПериода,
ДниПериода.КонецСтандартногоПериода,
РАЗНОСТЬДАТ(ВЫБОР
КОГДА ДниПериода.НачалоСтандартногоПериода < &НачалоПериода
ТОГДА &НачалоПериода
ИНАЧЕ ДниПериода.НачалоСтандартногоПериода
КОНЕЦ, КОНЕЦПЕРИОДА(ВЫБОР
КОГДА ДниПериода.КонецСтандартногоПериода > &КонецПериода
ТОГДА &КонецПериода
ИНАЧЕ ДниПериода.КонецСтандартногоПериода
КОНЕЦ, ДЕНЬ), ДЕНЬ) + 1 КАК КвоДнейСтандартногоПериода
ИЗ
(ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, НомераДнейПериода.НомерДня) КАК ДеньПериода,
ВЫБОР
КОГДА &Периодичность = "БезПериодов"
ТОГДА &НачалоПериода
КОГДА &Периодичность = "День"
ТОГДА ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, НомераДнейПериода.НомерДня)
КОГДА &Периодичность = "Неделя"
ТОГДА НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, НомераДнейПериода.НомерДня), НЕДЕЛЯ)
КОГДА &Периодичность = "Декада"
ТОГДА НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, НомераДнейПериода.НомерДня), ДЕКАДА)
КОГДА &Периодичность = "Месяц"
ТОГДА НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, НомераДнейПериода.НомерДня), МЕСЯЦ)
КОГДА &Периодичность = "Квартал"
ТОГДА НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, НомераДнейПериода.НомерДня), КВАРТАЛ)
КОГДА &Периодичность = "Полугодие"
ТОГДА НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, НомераДнейПериода.НомерДня), ПОЛУГОДИЕ)
КОГДА &Периодичность = "Год"
ТОГДА НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, НомераДнейПериода.НомерДня), ГОД)
КОНЕЦ КАК НачалоСтандартногоПериода,
ВЫБОР
КОГДА &Периодичность = "БезПериодов"
ТОГДА &КонецПериода
КОГДА &Периодичность = "День"
ТОГДА ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, НомераДнейПериода.НомерДня)
КОГДА &Периодичность = "Неделя"
ТОГДА КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, НомераДнейПериода.НомерДня), НЕДЕЛЯ)
КОГДА &Периодичность = "Декада"
ТОГДА КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, НомераДнейПериода.НомерДня), ДЕКАДА)
КОГДА &Периодичность = "Месяц"
ТОГДА КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, НомераДнейПериода.НомерДня), МЕСЯЦ)
КОГДА &Периодичность = "Квартал"
ТОГДА КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, НомераДнейПериода.НомерДня), КВАРТАЛ)
КОГДА &Периодичность = "Полугодие"
ТОГДА КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, НомераДнейПериода.НомерДня), ПОЛУГОДИЕ)
КОГДА &Периодичность = "Год"
ТОГДА КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, НомераДнейПериода.НомерДня), ГОД)
КОНЕЦ КАК КонецСтандартногоПериода
ИЗ
(ВЫБРАТЬ
Тысячи.Цифра * 1000 + Сотни.Цифра * 100 + Десятки.Цифра * 10 + Единицы.Цифра КАК НомерДня
ИЗ
Цифры КАК Тысячи,
Цифры КАК Сотни,
Цифры КАК Десятки,
Цифры КАК Единицы
ГДЕ
Тысячи.Цифра * 1000 + Сотни.Цифра * 100 + Десятки.Цифра * 10 + Единицы.Цифра <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ)) КАК НомераДнейПериода) КАК ДниПериода
ПоказатьДумаю, при необходимости несложно допилить до нужного варианта.
ВЫБОР
КОГДА ДниПериода.НачалоСтандартногоПериода < &НачалоПериода
ТОГДА &НачалоПериода
ИНАЧЕ ДниПериода.НачалоСтандартногоПериода
КОНЕЦи аналогично для конца периода
При этом легко видеть, что при замене слова НЕДЕЛЯ на любой другой период запрос останется точно таким же, изменится только протяженность периода
ВЫБРАТЬ
Выбор когда ДниПериода.НачалоСтандартногоПериода < &НачалоПериода
Тогда &НачалоПериода
Иначе ДниПериода.НачалоСтандартногоПериода Конец КАК НачалоСтандартногоПериода,
Выбор когда ДниПериода.КонецСтандартногоПериода > &КонецПериода
Тогда &КонецПериода
Иначе ДниПериода.КонецСтандартногоПериода Конец КАК КонецСтандартногоПериода
ИЗ
(ВЫБРАТЬ Различные
НАЧАЛОПЕРИОДА(НомераДнейПериода.НашДень, НЕДЕЛЯ) КАК НачалоСтандартногоПериода,
КОНЕЦПЕРИОДА(НомераДнейПериода.НашДень, НЕДЕЛЯ) КАК КонецСтандартногоПериода
ИЗ
(ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ,Тысячи.Цифра * 1000 + Сотни.Цифра * 100 + Десятки.Цифра * 10 + Единицы.Цифра) КАК НашДень
ИЗ
Цифры КАК Тысячи,
Цифры КАК Сотни,
Цифры КАК Десятки,
Цифры КАК Единицы
ГДЕ
Тысячи.Цифра * 1000 + Сотни.Цифра * 100 + Десятки.Цифра * 10 + Единицы.Цифра <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ)
) КАК НомераДнейПериода
) как ДниПериода
упорядочить по НачалоСтандартногоПериода ПоказатьВЫБРАТЬ
0 КАК Х
ПОМЕСТИТЬ Бит
ОБЪЕДИНИТЬ
ВЫБРАТЬ
1
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(&Дата1, ДЕНЬ, Б0.Х + 2 * (Б1.Х + 2 * (Б2.Х + 2 * (Б3.Х + 2 * (Б4.Х + 2 * (Б5.Х + 2 * (Б6.Х + 2 * (Б7.Х + 2 * (Б8.Х + 2 * Б9.Х))))))))) КАК Х
ПОМЕСТИТЬ Даты
ИЗ
Бит КАК Б0,
Бит КАК Б1,
Бит КАК Б2,
Бит КАК Б3,
Бит КАК Б4,
Бит КАК Б5,
Бит КАК Б6,
Бит КАК Б7,
Бит КАК Б8,
Бит КАК Б9
ГДЕ
Б0.Х + 2 * (Б1.Х + 2 * (Б2.Х + 2 * (Б3.Х + 2 * (Б4.Х + 2 * (Б5.Х + 2 * (Б6.Х + 2 * (Б7.Х + 2 * (Б8.Х + 2 * Б9.Х)))))))) <= РАЗНОСТЬДАТ(&Дата1, &Дата2, ДЕНЬ)
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
МИНИМУМ(Даты.Х) КАК ДатаНачала,
МАКСИМУМ(Даты.Х) КАК ДатаОкончания
ИЗ
Даты КАК Даты
СГРУППИРОВАТЬ ПО
РАЗНОСТЬДАТ(&Дата1, Даты.Х, МЕСЯЦ) ПоказатьСейчас хочу увидеть более короткое чем (25) и (26) решение без развертки по дням.
Он первый предложил оптимальный алгоритм генерации таблицы периодов (без группировок). Оптимальнее вроде некуда. Один простой запрос.
Остальное, включая уточнение границ периодов - вторично.
ВЫБРАТЬ
1 КАК Число
ПОМЕСТИТЬ Числа
ОБЪЕДИНИТЬ
ВЫБРАТЬ
2
ОБЪЕДИНИТЬ
ВЫБРАТЬ
3
ОБЪЕДИНИТЬ
ВЫБРАТЬ
4
ОБЪЕДИНИТЬ
ВЫБРАТЬ
5
ОБЪЕДИНИТЬ
ВЫБРАТЬ
6
ОБЪЕДИНИТЬ
ВЫБРАТЬ
7
ОБЪЕДИНИТЬ
ВЫБРАТЬ
8
ОБЪЕДИНИТЬ
ВЫБРАТЬ
9
ОБЪЕДИНИТЬ
ВЫБРАТЬ
0
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
Ед.Число + Дес.Число * 10 + Сот.Число * 100 КАК Номер
ПОМЕСТИТЬ Месяцы
ИЗ
Числа КАК Ед,
Числа КАК Дес,
Числа КАК Сот
ГДЕ
Ед.Число + Дес.Число * 10 + Сот.Число * 100 <= РАЗНОСТЬДАТ(&Дата1, &Дата2, МЕСЯЦ)
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
ВложенныйЗапрос.Номер,
МАКСИМУМ(ВложенныйЗапрос.Дата1) КАК Дата1,
МИНИМУМ(ВложенныйЗапрос.Дата2) КАК Дата2
ИЗ
(ВЫБРАТЬ РАЗЛИЧНЫЕ
Месяцы.Номер КАК Номер,
&Дата1 КАК Дата1,
&Дата2 КАК Дата2
ИЗ
Месяцы КАК Месяцы
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ РАЗЛИЧНЫЕ
Месяцы.Номер,
НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&Дата1, МЕСЯЦ, Месяцы.Номер), МЕСЯЦ),
КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&Дата1, МЕСЯЦ, Месяцы.Номер), МЕСЯЦ)
ИЗ
Месяцы КАК Месяцы) КАК ВложенныйЗапрос
СГРУППИРОВАТЬ ПО
ВложенныйЗапрос.Номер
ПоказатьДля коллекции добавлю свой вариант. Он самый короткий, но не самый простой:
ВЫБРАТЬ
0 КАК Х
ПОМЕСТИТЬ Бит
ОБЪЕДИНИТЬ
ВЫБРАТЬ
1
;
ВЫБРАТЬ
Б0.Х + 2 * (Б1.Х + 2 * (Б2.Х + 2 * (Б3.Х + 2 * (Б4.Х + 2 * Б5.Х)))) КАК Х
ПОМЕСТИТЬ Периоды
ИЗ
Бит КАК Б0,
Бит КАК Б1,
Бит КАК Б2,
Бит КАК Б3,
Бит КАК Б4,
Бит КАК Б5
ГДЕ
Б0.Х + 2 * (Б1.Х + 2 * (Б2.Х + 2 * (Б3.Х + 2 * (Б4.Х + 2 * Б5.Х)))) < РАЗНОСТЬДАТ(&Дата1, &Дата2, МЕСЯЦ)
;
ВЫБРАТЬ
ЕСТЬNULL(НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&Дата1, МЕСЯЦ, Начала.Х + 1), МЕСЯЦ), &Дата1) КАК ДатаНачала,
ЕСТЬNULL(КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&Дата1, МЕСЯЦ, Окончания.Х), МЕСЯЦ), &Дата2) КАК ДатаОкончания
ИЗ
Периоды КАК Начала
ПОЛНОЕ СОЕДИНЕНИЕ Периоды КАК Окончания
ПО (Начала.Х + 1 = Окончания.Х) ПоказатьК сожалению, этот вариант не отрабатывает ситуацию отсутствия необходимости разбивки: если Дата1 и Дата2 находятся в одном месяце.
Чуточку изменил Ваш запрос:
ВЫБРАТЬ
0 КАК Х
ПОМЕСТИТЬ Бит
ОБЪЕДИНИТЬ
ВЫБРАТЬ
1
;
////////////////////////////////////////////////////////////
ВЫБРАТЬ
Б0.Х + 2 * (Б1.Х + 2 * (Б2.Х + 2 * (Б3.Х + 2 * (Б4.Х + 2 * Б5.Х)))) КАК Х
ПОМЕСТИТЬ Периоды
ИЗ
Бит КАК Б0,
Бит КАК Б1,
Бит КАК Б2,
Бит КАК Б3,
Бит КАК Б4,
Бит КАК Б5
ГДЕ
Б0.Х + 2 * (Б1.Х + 2 * (Б2.Х + 2 * (Б3.Х + 2 * (Б4.Х + 2 * Б5.Х)))) < РАЗНОСТЬДАТ(&Дата1, &Дата2, МЕСЯЦ)
;
////////////////////////////////////////////////////////////
ВЫБРАТЬ
ЕСТЬNULL(НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&Дата1, МЕСЯЦ, Начала.Х + 1), МЕСЯЦ), &Дата1) КАК ДатаНачала,
ЕСТЬNULL(КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&Дата1, МЕСЯЦ, Окончания.Х), МЕСЯЦ), &Дата2) КАК ДатаОкончания
ИЗ
Периоды КАК Начала
ПОЛНОЕ СОЕДИНЕНИЕ Периоды КАК Окончания
ПО (Начала.Х + 1 = Окончания.Х)
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
&Дата1,
&Дата2
ГДЕ
НАЧАЛОПЕРИОДА(&Дата1, МЕСЯЦ) = НАЧАЛОПЕРИОДА(&Дата2, МЕСЯЦ)
УПОРЯДОЧИТЬ ПО
ДатаНачала
Этот вариант
Также, если в тексте запроса МЕСЯЦ -> #Детализация и через СтрЗаменить(...) в тексте запроса заменять #Детализация на МЕСЯЦ, ДЕНЬ, КВАРТАЛ... То можно получить вполне универсальную функцию.
НАЧАЛОПЕРИОДА(Дата,&Периодичность) Как НачалоПериода
КОНЕЦПЕРИОДА(Дата,&Периодичность) Как КонецПериода
?
Например, 15.08.16 - 30.10.16 разбивается на месяцы так: 15.08.16 - 31.08.16; 1.09.16 - 30.09.16; 1.10.16 - 30.10.16.
Рейтинг: 2177
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 147834
Создание 16.08.12 20:20
Обновление 22.08.12 11:49
Просмотры 37487
Загрузки 39
Рейтинг
31
Комментарии 52
Код открыт Не указано
Рубрики Запросы
Кому Разработчик
Тип файла Внешняя обработка (ert,epf)
Платформа 1С:Предприятие 8
Конфигурация 1C:Бухгалтерия
Операционная система Windows
Страна Россия
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Абонемент ($m)