Как в отчете СКД сделать разбивку по месяцам и вывести периоды без данных

Программист 1С v8.3 (Управляемые формы)
← На главную

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

Способ 1. Использование механизма дополнения периодов в настройках СКД

Это наиболее правильный и стандартный метод, который не требует сложного изменения текста запроса. Рассмотрим его по шагам:

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

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

Способ 2. Форматирование месяца для представления «Январь 2018»

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

Вариант А: Оформление поля (рекомендуемый). На закладке «Наборы данных» в списке полей найдите ваше поле периода. В колонке Оформление нажмите на кнопку выбора и в строке Формат пропишите код:

ДФ='MMMM yyyy'

Это позволит платформе автоматически преобразовывать дату. Использование форматной строки работает быстрее, так как выполняется встроенными механизмами платформы при выводе результата.

Вариант Б: Выражение представления. Если вам нужна более сложная логика, можно использовать колонку Выражение представления в наборе данных. Там можно написать выражение на языке 1С:

Формат(Период, "ДФ='MMMM yyyy'")

Способ 3. Группировка данных на уровне запроса

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


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

Обратите внимание: использование функции НАЧАЛОПЕРИОДА позволяет «схлопнуть» все записи одного месяца в одну строку. Это значительно упрощает последующую работу СКД по дополнению периодов.

Способ 4. Работа с виртуальными таблицами

Если ваш отчет строится на базе регистров накопления, лучше всего использовать виртуальные таблицы, такие как Обороты или ОстаткиИОбороты. Проанализируем параметры этих таблиц:

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

Способ 5. Обработка пустых значений (NULL)

Когда мы выводим месяцы, в которых нет данных, в колонках ресурсов (сумм, количеств) возникнут пустые ячейки (значения NULL). Чтобы отчет выглядел профессионально и в нем стояли нули, выполним следующие действия:

  1. На закладке Наборы данных в поле выражения для ресурса используйте функцию: ЕстьNull(Количество, 0).
  2. На закладке Роли убедитесь, что для поля периода указано, что оно является обязательным, чтобы механизм дополнения работал корректно.
  3. В Других настройках отчета можно найти параметр Выводить текст вместо пустого значения, где также можно указать "0".

Способ 6. Сложный метод «Календаря» (через связь наборов)

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

  1. Создаем первый набор данных (запрос), который выбирает все первые числа месяцев из производственного календаря или генерирует их программно.
  2. Создаем второй набор данных с нашими реальными показателями.
  3. На закладке Связи наборов данных связываем их по полю Период.
  4. Указываем первый набор (с датами) как Основной (левое соединение).

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

Разберем еще один интересный пример использования итогов в запросе, который редко применяется в СКД, но полезен в обычных отчетах:


ИТОГИ
    СУММА(Количество)
ПО
    Период ПЕРИОДАМИ(МЕСЯЦ, &НачалоПериода, &КонецПериода)

Важно: При использовании СКД данный код в запросе обычно игнорируется, так как компоновщик сам управляет расчетом итогов. Для СКД всегда делайте упор на настройки дополнения в интерфейсе компоновки.

Подводя итог, можно сказать, что для большинства задач достаточно комбинации НАЧАЛОПЕРИОДА в запросе и настройки Типа дополнения в параметрах группировки. Это обеспечит корректную структуру отчета, а использование форматных строк в оформлении полей придаст ему законченный и профессиональный вид.

← На главную