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