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

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

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

Как дополнить данные отчета всеми периодами в группировке в 1С: дополнение периодов в СКД и запросе, настройка полей даты, типичные ошибки и проверка результата.

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

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

Как работает дополнение периодов в СКД

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

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

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

Пошаговая настройка дополнения в схеме компоновки

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

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

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

Порядок настройки дополнения в СКД
  1. 1
    Откройте схему компоновки данных, закладка «Наборы данных»
  2. 2
    Найдите поле периода в списке полей набора
  3. 3
    В свойствах поля установите «Тип дополнения» — Месяц, Неделя или День
  4. 4
    Проверьте, что в запросе дата приведена через НАЧАЛОПЕРИОДА
  5. 5
    Сформируйте отчет за период с заведомо пустыми месяцами и убедитесь, что они появились с нулевыми значениями

Дополнение периодов на уровне запроса без СКД

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

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

После левого соединения пустые периоды получат значения NULL в полях ресурсов. Чтобы в отчете выводились нули, оберните ресурсы в ЕСТЬNULL(СуммаОборот, 0). Без этого при дальнейших вычислениях (итоги, проценты) NULL может дать неожиданные результаты.

bsl
ВЫБРАТЬ
	Периоды.НачалоМесяца КАК Период,
	ЕСТЬNULL(Продажи.СуммаОборот, 0) КАК Сумма
ИЗ
	(ВЫБРАТЬ РАЗЛИЧНЫЕ НАЧАЛОПЕРИОДА(Период, МЕСЯЦ) КАК НачалоМесяца
	 ИЗ РегистрНакопления.Продажи
	 ГДЕ Период МЕЖДУ &НачалоПериода И &КонецПериода) КАК Периоды
	ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Месяц, ) КАК Продажи
	ПО Периоды.НачалоМесяца = Продажи.Период

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

Дополнение в СКД строится внутри интервала, который платформа определяет по параметрам периода. Поэтому важно, чтобы параметры «НачалоПериода» и «КонецПериода» были заполнены и использовались в запросе набора данных. Если период задан только отбором пользователя на закладке настроек, дополнение может работать непредсказуемо — надежнее использовать стандартный период отчета.

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

Для отчетов с несколькими группировками (например, Контрагент — Месяц) дополнение применяется внутри каждой группы верхнего уровня. Это значит, что у каждого контрагента появятся все месяцы интервала, что может резко увеличить объем выводимых строк. На больших базах оцените производительность заранее.

Выбор между СКД и ручным дополнением в запросе

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

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

Сравнение подходов

Дополнение в СКД

Подходит для типовых периодов (день, неделя, месяц). Настраивается без кода, но не учитывает производственный календарь и требует поля типа Дата.

Левое соединение с таблицей периодов

Полный контроль над составом периодов, включая рабочие дни и смены. Требует доработки запроса и обработки NULL через ЕСТЬNULL.

Таблица периодов внутри запроса СКД

Комбинация: нестандартный календарь плюс все возможности СКД. Сложнее в поддержке, но самый гибкий вариант.

Проверка результата и типичные ошибки

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

Частые ошибки: поле периода имеет тип «Строка» из-за функции ПРЕДСТАВЛЕНИЕ или форматирования в запросе — дополнение для такого поля недоступно; дополнение установлено не для того поля, которое реально выведено в группировке; в запросе используется виртуальная таблица оборотов с периодичностью «Регистратор», где понятие периода размыто. Еще одна ловушка — часовые пояса и время в датах: если период не приведен к началу дня/месяца, одна календарная дата может распасться на несколько строк.

Типичные ошибки
01
Поле периода преобразовано в строку — тип дополнения недоступен или игнорируется
02
Забыт ЕСТЬNULL при ручном соединении — в итогах и расчетах появляются NULL вместо нулей
03
Дополнение настроено у одного поля, а в группировку выведено другое
04
Период не приведен через НАЧАЛОПЕРИОДА — записи одного месяца разбиваются на несколько строк
05
Отбор по конкретному периоду перекрывает параметры — дополнение схлопывается
Контрольные точки

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

Состав строк группировки
Норма

Все периоды интервала присутствуют, пустые — с нулями

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

Периоды без данных отсутствуют или дублируются

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

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

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

Итоги выросли — признак задвоения соединения

Тип поля периода
Норма

Дата, приведенная через НАЧАЛОПЕРИОДА

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

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

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

Почему «Тип дополнения» недоступен для моего поля периода?

Свойство доступно только для полей с типом «Дата». Если в запросе дата преобразована функцией ПРЕДСТАВЛЕНИЕ, ФОРМАТ или конкатенацией, тип теряется. Верните полю исходный тип даты, а форматирование выполняйте в настройках оформления поля СКД.

Дополнение работает, но пустые месяцы показывают пустоту, а не ноль. Это нормально?

Да, для дополненных СКД строк ресурсы пустые. Если нужен именно ноль, задайте в настройках оформления поля формат с параметром отображения нуля либо оберните ресурс в ЕСТЬNULL в запросе набора данных.

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

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

Дополнение сильно замедлило отчет. Что делать?

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

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

Напрямую нет — построитель не имеет механизма дополнения. Нужно модифицировать текст запроса: добавить таблицу всех периодов и левое соединение с ЕСТЬNULL для ресурсов.

Почему дополнение не срабатывает, если весь период без данных?

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

Итог

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

Для типовых периодов используйте «Тип дополнения» у поля даты в СКД — это самый простой путь. Для нестандартных календарей и отчетов без СКД формируйте таблицу периодов в запросе с левым соединением и ЕСТЬNULL. Всегда проверяйте итоги и тип поля периода после настройки.