При разработке отчетов на Системе компоновки данных (СКД) в 1С программисты часто сталкиваются с задачей: необходимо вывести в таблицу детальные данные только за последний месяц выбранного периода, но при этом колонка общего итога должна по-прежнему рассчитываться за весь указанный пользователем период.
Стандартное наложение общего отбора на отчет по нужному месяцу приводит к тому, что данные за предыдущие периоды просто не выбираются из базы данных, и общий итог становится равен итогу за этот единственный месяц. Решение этой проблемы через создание нескольких наборов данных или написание программного кода постобработки (выгрузка в таблицу значений и ручное удаление колонок) сильно усложняет схему компоновки, снижает производительность и затрудняет дальнейшую поддержку отчета.
В этой статье мы подробно разберем четыре элегантных и простых способа реализации этой задачи исключительно встроенными средствами настройки СКД, без использования программирования.
Это наиболее правильный и производительный метод для структуры отчета типа «Таблица» (кросс-таблица). Он основан на разделении контекста расчета ресурсов и визуального вывода данных.
Давайте разберем по шагам, как настроить такой отчет:
Номенклатура или Контрагент), а в Колонки добавим группировку по периоду (например, ПериодМесяц).ПериодМесяц в дереве структуры отчета.ПериодМесяц Равно &КонецПериода. Вместо параметра &КонецПериода можно использовать выражение, которое автоматически вычисляет дату начала последнего месяца периода.&КонецПериода стал доступен для выбора в локальном отборе группировки, перейдем на вкладку Параметры схемы СКД и убедимся, что для него снят флаг Ограничение доступности. Если этот флаг установлен, параметр будет скрыт из списка доступных полей компоновки.Почему это работает: Локальный отбор на группировку колонок в СКД работает как визуальный фильтр при выводе готового результата. Он определяет, какие именно детальные колонки месяцев будут выведены на экран. При этом данные для расчета родительской колонки «Общие итоги» берутся из общего набора данных за весь период. В результате на экран выводится ровно одна детальная колонка за последний месяц и колонка общего итога, содержащая сумму за все месяцы.
Если для структуры вашего отчета не обязательно использовать кросс-таблицу (где периоды динамически разворачиваются вправо), и вам достаточно вывести фиксированные колонки, мы можем применить механизм вычисляемых полей.
Проанализируем этот подход по шагам:
СуммаПоследнийМесяц
Выбор Когда НачалоПериода(ПериодМесяц, "Месяц") = НачалоПериода(&КонецПериода, "Месяц") Тогда Сумма Иначе 0 Конец
Сумма за последний месяцСумма (которое будет отвечать за итог за весь период) укажем выражение: Сумма(Сумма). Назовем его заголовок на вкладке параметров как Итого за весь период.СуммаПоследнийМесяц укажем выражение: Сумма(СуммаПоследнийМесяц).Этот способ крайне надежен, работает быстро и исключает любые проблемы с выводом пустых колонок при экспорте отчета в сторонние форматы.
Если вам по какой-то причине нужно сохранить структуру исходного запроса без изменений и не хочется работать с формулами дат, мы можем воспользоваться механизмом условного оформления для физического сжатия «ненужных» колонок.
Рассмотрим, как настроить такое поведение системы:
0.1 (или -0.1 в зависимости от используемой версии платформы «1С:Предприятие»). Также можно очистить выводимый текст, установив свойство Текст в значение пустой строки "".ПериодМесяц Не равно &КонецПериода.ПериодМесяц и все связанные ресурсы, которые выводятся в этих колонках.Преимущества и недостатки метода: Данные по всем месяцам будут полноценно получены из СУБД, обработаны и корректно просуммированы в общих итогах. Колонки предыдущих месяцев физически останутся в результирующем табличном документе, но сожмутся до невидимого глазу размера в 0.1 символа. Главный минус метода — при сохранении или выгрузке отчета в формат Excel или HTML эти сверхтонкие колонки все равно будут присутствовать в файле, и пользователь сможет раздвинуть их вручную мышкой.
В сложных аналитических отчетах со множеством вложенных группировок локальные отборы могут иногда приводить к нежелательному искажению итогов на уровне группировок строк. В этом случае мы можем гарантировать правильный расчет общего итога с помощью мощной встроенной функции языка выражений СКД — ВычислитьВыражение.
Выясним причину эффективности этого способа и настроим его:
Вкладка Ресурсы позволяет нам переопределить формулу расчета агрегатных функций. Вместо стандартного суммирования мы можем указать для ресурса СуммаВсего следующее выражение:
ВычислитьВыражение("Сумма(Сумма)", , "ОбщийИтог")
Рассмотрим параметры этой функции подробнее:
"Сумма(Сумма)") — это выражение, которое необходимо вычислить по детальным записям."ОбщийИтог") — указывает область вычисления. Значение «ОбщийИтог» заставляет СКД рассчитывать сумму по всей выборке данных, полностью игнорируя наложенные на уровне колонок локальные фильтры и группировки.Использование этого метода дает стопроцентную гарантию того, что в колонке общих итогов всегда будет отображаться правильная сумма за весь период отчета, независимо от того, какие манипуляции со скрытием или отбором колонок производятся в структуре таблицы.
Подводя итоги нашего анализа, сопоставим рассмотренные методы для выбора оптимального решения: