Запрос 1С, который генерирует даты по дням за период
Список дней за период нужен, когда отчёт должен показать строку даже за день без движений. Запрос ниже строит такой список прямо в языке запросов — из временной таблицы цифр и функции ДОБАВИТЬКДАТЕ.
Текст запроса
Запрос = Новый Запрос;У данного запроса есть ограничение, он позволяет сгенерировать не более 10000 дней.
Запрос.Текст =
"ВЫБРАТЬ
| 1 КАК Цифра
|ПОМЕСТИТЬ Цифры
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| 2
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| 3
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| 4
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| 5
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| 6
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| 7
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| 8
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| 9
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| 10
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&НачПериода, ДЕНЬ, 1000 * (Тысячи.Цифра - 1) + 100 * (Сотни.Цифра - 1) + 10 * (Десятки.Цифра - 1) + Единицы.Цифра - 1), ДЕНЬ) КАК ДатаДень
|ИЗ
| Цифры КАК Единицы,
| Цифры КАК Десятки,
| Цифры КАК Сотни,
| Цифры КАК Тысячи
|ГДЕ
| ДОБАВИТЬКДАТЕ(&НачПериода, ДЕНЬ, 1000 * (Тысячи.Цифра - 1) + 100 * (Сотни.Цифра - 1) + 10 * (Десятки.Цифра - 1) + Единицы.Цифра - 1) <= &КонПериода
|
|УПОРЯДОЧИТЬ ПО
| ДатаДень";
Запрос.УстановитьПараметр("НачПериода", ДатаНачалаПериода);
Запрос.УстановитьПараметр("КонПериода", ДатаКонцаПериода);
Актуальность для новых версий
Запрос использует только базовые возможности языка запросов и одинаково работает на любой версии платформы 8.3, в файловом и клиент-серверном вариантах. Для отчётов на СКД есть и встроенный вариант: дополнение периода в настройках группировки по дате.
Частые вопросы
Сколько дней может сгенерировать запрос?
Не более 10 000: четыре соединения таблицы из десяти цифр дают 10 000 комбинаций. Для большего периода добавьте ещё одно соединение.
Как получить месяцы вместо дней?
Замените ДЕНЬ на МЕСЯЦ в функциях ДОБАВИТЬКДАТЕ и НАЧАЛОПЕРИОДА.
Как соединить результат с данными регистра?
Поместите даты во временную таблицу и соедините её левым соединением с таблицей регистра по дате — дни без движений останутся в результате.