Часто при разработке отчетов в системе компоновки данных (СКД) мы сталкиваемся с ситуацией, когда отчет выводит только те месяцы, в которых были реальные движения или обороты. Однако для полноценного анализа, например, при построении графиков или план-фактного анализа, пользователю необходимо видеть весь временной интервал, независимо от наличия данных в конкретном периоде. В этой статье мы подробно разберем, как заставить 1С выводить «пустые» месяцы и как правильно их форматировать.
Это наиболее правильный и стандартный метод, который не требует сложного изменения текста запроса. Рассмотрим его по шагам:
Период или Месяц).&НачалоПериода и &КонецПериода.Проанализируем ситуацию: если мы не укажем границы дополнения, СКД дополнит периоды только внутри диапазона дат, которые уже есть в выборке. Если же мы привяжем их к параметрам, отчет выведет все месяцы, которые выбрал пользователь в периоде формирования отчета.
После того как мы вывели все месяцы, они могут отображаться в стандартном формате даты (например, 01.01.2018 00:00:00). Для изменения представления в «человекочитаемый» вид у нас есть два пути:
Вариант А: Оформление поля (рекомендуемый). На закладке «Наборы данных» в списке полей найдите ваше поле периода. В колонке Оформление нажмите на кнопку выбора и в строке Формат пропишите код:
ДФ='MMMM yyyy'
Это позволит платформе автоматически преобразовывать дату. Использование форматной строки работает быстрее, так как выполняется встроенными механизмами платформы при выводе результата.
Вариант Б: Выражение представления. Если вам нужна более сложная логика, можно использовать колонку Выражение представления в наборе данных. Там можно написать выражение на языке 1С:
Формат(Период, "ДФ='MMMM yyyy'")
Если данные в отчете задваиваются или выводятся по дням вместо месяцев, нам необходимо выполнить приведение дат к началу месяца непосредственно в тексте запроса. Посмотрим на пример кода, который эффективно решает эту задачу:
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(Регистр.Период, МЕСЯЦ) КАК ПериодМесяц,
Регистр.ВидОбслуживания,
СУММА(Регистр.Количество) КАК Количество
ИЗ
РегистрСведений.НормыОПО КАК Регистр
ГДЕ
Регистр.Период МЕЖДУ &ДатаНачала И &ДатаОкончания
СГРУППИРОВАТЬ ПО
НАЧАЛОПЕРИОДА(Регистр.Период, МЕСЯЦ),
Регистр.ВидОбслуживания
Обратите внимание: использование функции НАЧАЛОПЕРИОДА позволяет «схлопнуть» все записи одного месяца в одну строку. Это значительно упрощает последующую работу СКД по дополнению периодов.
Если ваш отчет строится на базе регистров накопления, лучше всего использовать виртуальные таблицы, такие как Обороты или ОстаткиИОбороты. Проанализируем параметры этих таблиц:
Третий параметр виртуальной таблицы — Периодичность. Если установить его в значение Месяц, система автоматически подготовит данные с нужной детализацией. Однако помните, что даже виртуальная таблица не вернет «пустой» месяц, если в нем не было движений. Для их появления все равно придется включить Дополнение в настройках группировки СКД, как мы описали в первом способе.
Когда мы выводим месяцы, в которых нет данных, в колонках ресурсов (сумм, количеств) возникнут пустые ячейки (значения NULL). Чтобы отчет выглядел профессионально и в нем стояли нули, выполним следующие действия:
ЕстьNull(Количество, 0).В редких случаях стандартное дополнение СКД может работать не так, как ожидается (например, при использовании нескольких несвязанных регистров). В такой ситуации мы можем применить метод соединения с «Календарем»:
Выясним причину популярности этого метода: он гарантирует наличие строки в отчете, даже если во всех регистрах системы за этот месяц нет ни одной записи. Это самый надежный, хоть и более трудоемкий способ.
Разберем еще один интересный пример использования итогов в запросе, который редко применяется в СКД, но полезен в обычных отчетах:
ИТОГИ
СУММА(Количество)
ПО
Период ПЕРИОДАМИ(МЕСЯЦ, &НачалоПериода, &КонецПериода)
Важно: При использовании СКД данный код в запросе обычно игнорируется, так как компоновщик сам управляет расчетом итогов. Для СКД всегда делайте упор на настройки дополнения в интерфейсе компоновки.
Подводя итог, можно сказать, что для большинства задач достаточно комбинации НАЧАЛОПЕРИОДА в запросе и настройки Типа дополнения в параметрах группировки. Это обеспечит корректную структуру отчета, а использование форматных строк в оформлении полей придаст ему законченный и профессиональный вид.