К статье
Практический материал

Отчеты и Аналитика · 12 мин

Как дополнить данные отчёта всеми датами при группировке по периоду в 1С

Как в отчёте 1С на СКД вывести все даты периода, даже если по ним нет данных: настройка дополнения периодов, запросы и типичные ошибки.

Стандартная ситуация: строите отчёт по продажам, остаткам или оборотам с группировкой по дням, неделям или месяцам — и видите «дырки». Периоды, в которых не было ни одного документа, просто не попадают в выборку, потому что запрос возвращает только те строки, где есть данные. Для анализа динамики это неудобно: диаграмма получается рваной, средние значения искажаются, а выгрузка в Excel требует ручной доработки.

В системе компоновки данных (СКД), на которой построено большинство отчётов 1С, задача решается штатным механизмом — дополнением периодов. Он позволяет вывести все даты выбранного интервала, подставляя нулевые или пустые значения там, где данных нет. Дополнение настраивается прямо в схеме компоновки, без изменения запроса, и работает для дней, недель, месяцев, кварталов и лет.

Ниже разберём, как включить и настроить дополнение периодов в конструкторе СКД, какие параметры за это отвечают, как решить задачу на уровне запроса (если СКД не используется) и какие ошибки встречаются чаще всего.

Почему в отчёте пропадают периоды без данных

Запрос к виртуальным таблицам регистров (обороты, остатки и обороты) возвращает строку только тогда, когда по заданной комбинации измерений и периоду есть хотя бы одно движение. Если в феврале не было ни одной продажи по выбранной номенклатуре, строки «февраль» в результате запроса просто не существует — и группировать нечего.

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

Важно понимать, что дополнение периодов работает с полем типа «Дата», по которому построена группировка. Если период в запросе вычисляется нестандартно (например, через строковые функции или собственные выражения), механизм дополнения может не сработать — об этом ниже в разделе про ошибки.

Как включить дополнение периодов в схеме компоновки данных

Откройте схему компоновки данных отчёта (в конфигураторе: отчёт → «Основная схема компоновки данных» → «Открыть схему компоновки»). Убедитесь, что в запросе набора данных есть поле периода — обычно это Период из виртуальной таблицы оборотов с заданной периодичностью (день, месяц и т.п.).

Дальнейшая настройка выполняется на закладке «Настройки» схемы. Выберите группировку по периоду (или создайте её), затем перейдите на вкладку «Поля группировки» и у поля периода установите параметры дополнения. В конструкторе настроек это делается через окно редактирования группировки: для поля указывается тип дополнения — «День», «Неделя», «Месяц», «Квартал», «Год» — и при необходимости явные границы интервала (дата начала и дата окончания).

Порядок настройки в СКД
  1. 1
    Откройте основную схему компоновки данных отчёта в конфигураторе
  2. 2
    Проверьте, что в запросе набора данных выбирается поле периода (например, Период из таблицы оборотов)
  3. 3
    На закладке «Настройки» создайте или выберите группировку по полю периода
  4. 4
    Откройте параметры поля группировки и установите «Тип дополнения» — День, Неделя, Месяц и т.д.
  5. 5
    При необходимости задайте начальную и конечную даты интервала дополнения
  6. 6
    Сохраните схему и сформируйте отчёт — в результате должны появиться все даты периода

Если границы интервала не заданы, СКД дополнит периоды в пределах минимальной и максимальной даты, реально встретившихся в данных. Это важный нюанс: если в выборке нет данных за январь и март, а есть только февраль, то без явных границ дополнение «раздвинется» только вокруг февраля. Чтобы гарантированно получить полный квартал, задайте даты начала и окончания явно — например, через параметры отчёта.

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

Настройка типа дополнения и границ интервала

Тип дополнения должен соответствовать периодичности, с которой период выбирается в запросе. Если виртуальная таблица оборотов построена с периодичностью «Месяц», а дополнение установлено «День», вы получите лишние строки с одинаковыми месячными итогами или пустые даты внутри месяца — картина станет нечитаемой. Правило простое: периодичность запроса и тип дополнения должны совпадать.

Границы дополнения можно задавать тремя способами: оставить пустыми (интервал определяется данными), указать фиксированные даты, указать выражения с параметрами. Третий вариант предпочтителен для типовых отчётов, где пользователь сам выбирает период. При этом убедитесь, что параметры имеют тип «Дата» и заполняются по умолчанию, иначе при пустом параметре дополнение может не сработать.

Способы задать границы дополнения

Без явных границ

Подходит для быстрой проверки, но интервал определяется крайними датами данных — начало и конец периода без данных не появятся

Фиксированные даты

Подходит для регламентных отчётов с постоянным периодом; требует правки схемы при смене периода

Параметры отчёта

Универсальный вариант: границы совпадают с периодом, выбранным пользователем; требует корректной настройки параметров

Отдельно проверьте, что сам запрос не отсекает нужный интервал отбором. Если в запросе задано условие Период МЕЖДУ &Начало И &Конец, а параметры дополнения шире — лишние даты всё равно будут пустыми, что обычно и требуется. Но если отбор в запросе уже параметров дополнения, часть периода пользователь не увидит никогда.

Как вывести нули вместо пустых значений

После дополнения периодов строки без данных содержат пустые значения ресурсов. Для отчётности это не всегда удобно: пустая ячейка на диаграмме выглядит как разрыв, а при выгрузке в Excel мешает формулам. Чтобы показать нули, используйте вычисляемые поля или функцию ЕстьNull в выражении ресурса.

На закладке «Вычисляемые поля» схемы добавьте поле, например СуммаСНулями, с выражением ЕстьNull(Сумма, 0) — и выводите в отчёт именно его. Альтернатива — задать выражение ресурса на закладке «Ресурсы»: Сумма(ЕстьNull(СуммаОборот, 0)). Оба подхода рабочие; вычисляемое поле нагляднее и проще отлаживается.

Решение на уровне запроса без СКД

Если отчёт построен программно или на обычном запросе без компоновки, полный список дат формируется вручную. Классический приём — создать временную таблицу периодов и соединить её с данными левым соединением. Таблицу дат можно получить из последовательности чисел (например, из таблицы с нарастающими значениями) и функции ДОБАВИТЬКДАТЕ.

Практический вариант: поместить в запрос таблицу чисел от 0 до N (например, через соединение небольших наборов), затем вычислить дату как ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, Число) и отсечь даты за пределами конца периода. Дальше — левое соединение с оборотами по условию НАЧАЛОПЕРИОДА(Обороты.Период, ДЕНЬ) = Календарь.Дата. В полях показателей используйте ЕСТЬNULL(Обороты.СуммаОборот, 0).

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

Если нужен производственный календарь (только рабочие дни), дополнение периодов СКД не поможет — оно добавляет все календарные даты. В этом случае строится таблица дат по регистру сведений с графиком работы, и к ней левым соединением присоединяются данные.
ПЗ
Практическое замечание

Типичные ошибки и ограничения

Первая частая ошибка — дополнение не срабатывает, потому что поле периода в запросе получено выражением, а не выбрано напрямую из таблицы. Если период вычисляется, например, как НАЧАЛОПЕРИОДА(Документ.Дата, МЕСЯЦ) и при этом тип поля в наборе данных задан некорректно, СКД может не распознать его как период для дополнения. Проверьте на закладке «Наборы данных», что у поля тип «Дата» и, при необходимости, заполнены свойства периода в настройках поля набора.

Вторая ошибка — несовпадение периодичности: запрос с периодичностью «Авто» или «Регистратор», а дополнение настроено по месяцам. Результат — либо отсутствие дополнения, либо дублирование строк. Третья ошибка — ожидание, что дополнение заполнит начало и конец интервала, где данных нет вообще: без явных границ дополнение работает только между первой и последней датой с данными.

Типичные ошибки
01
Тип дополнения не совпадает с периодичностью запроса — появляются пустые строки внутри периода или дубли итогов
02
Не заданы границы интервала — даты без данных в начале и конце периода не выводятся
03
Период вычисляется сложным выражением — СКД не распознаёт поле как период, дополнение не работает
04
Отбор в запросе уже интервала дополнения — часть дат не появляется никогда
05
Ожидание нулей без ЕстьNull — в дополненных строках остаются пустые значения

Ограничение по производительности: дополнение большого интервала с мелкой периодичностью (например, пять лет по дням — это более 1800 строк на каждую комбинацию измерений) заметно увеличивает объём результата. Если группировка ещё и детализирована по контрагентам и номенклатуре, итоговая таблица может вырасти в десятки раз. В таких случаях ограничивайте интервал, укрупняйте периодичность или дополняйте только верхний уровень группировки.

Как проверить результат

После настройки сформируйте отчёт за период, в котором заведомо есть «пустые» даты — например, выходные или месяц без документов. Все даты интервала должны присутствовать в группировке, а показатели по пустым датам — выводиться как нули (если применён ЕстьNull) или пустые значения.

Сверьте итоги: сумма по колонке ресурса до и после включения дополнения должна совпадать — дополнение добавляет строки с пустыми значениями и не меняет итоги. Если итог изменился, ищите ошибку в выражении ресурса или в дублировании строк из-за неверной периодичности.

Контрольные точки

Как проверить результат

Наличие всех дат периода в группировке
Норма

Каждая дата интервала присутствует, включая дни без документов

Тревожный признак

Периоды без данных по-прежнему отсутствуют — дополнение не включено или границы не заданы

Итоги по ресурсам
Норма

Итоги совпадают с вариантом отчёта без дополнения

Тревожный признак

Итоги выросли — вероятно, дубли строк из-за несовпадения периодичности

Значения в пустых периодах
Норма

Нули или пустые ячейки по ожиданию

Тревожный признак

В дополненных строках повторяются значения соседних периодов — ошибка в выражении ресурса

Часто задаваемые вопросы

Дополнение периода включено, но пустые даты не появляются. Что проверить?

Сначала убедитесь, что группировка построена именно по полю периода, а не по другому измерению. Затем проверьте границы дополнения: если они не заданы, дополнение работает только между крайними датами с данными. Также проверьте, что поле периода в наборе данных имеет тип «Дата» и не вычисляется сложным выражением.

Можно ли дополнить периоды в отчёте, написанном без СКД?

Да, но вручную: сформируйте в запросе таблицу всех дат интервала (через последовательность чисел и ДОБАВИТЬКДАТЕ или через таблицу календаря) и соедините её с данными левым соединением. В показателях используйте ЕСТЬNULL для подстановки нулей.

Как дополнить периоды только рабочими днями?

Штатное дополнение СКД добавляет все календарные даты. Для рабочих дней постройте таблицу дат по регистру сведений с производственным календарём или графиком работы и присоедините данные левым соединением в запросе набора данных.

Почему после дополнения итоги по отчёту изменились?

Само по себе дополнение итоги не меняет — оно добавляет строки с пустыми значениями. Если итог вырос, скорее всего, несовпадают периодичность запроса и тип дополнения, из-за чего строки дублируются. Проверьте также выражение ресурса: агрегатная функция должна быть указана корректно.

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

В полях начальной и конечной даты дополнения укажите выражения со ссылками на параметры отчёта (например, &НачалоПериода и &КонецПериода). Параметры должны иметь тип «Дата» и значения по умолчанию, иначе при пустом параметре дополнение может не выполниться.

Влияет ли дополнение периодов на скорость формирования отчёта?

Да, при больших интервалах и мелкой периодичности объём результата растёт кратно: каждая комбинация измерений умножается на число периодов. Для тяжёлых отчётов ограничивайте интервал, укрупняйте периодичность или дополняйте только верхний уровень группировки.

Итог

Что важно запомнить

Полный список дат в отчёте 1С получают через настройку «Дополнение периода» в группировке СКД: тип дополнения должен совпадать с периодичностью запроса, а границы интервала лучше привязать к параметрам отчёта. Для нулей вместо пустых значений используйте ЕстьNull, а при отчётах без СКД — таблицу дат с левым соединением. Итоги отчёта после дополнения меняться не должны — это главный признак корректной настройки.